الحد من نسبة استخدام الشبكة باستخدام Azure Firewall في خدمة Azure Kubernetes (AKS)

تعرف على كيفية استخدام الشبكة الصادرة وقواعد FQDN لمجموعات AKS للتحكم في حركة الخروج باستخدام جدار حماية Azure في AKS. لتبسيط هذا التكوين، يوفر Azure Firewall علامة Azure Kubernetes Service (AzureKubernetesService) اسم المجال المؤهل بالكامل (FQDN) التي تقيد نسبة استخدام الشبكة الصادرة من نظام مجموعة AKS. توضح هذه المقالة كيف يمكنك تكوين قواعد حركة مرور نظام مجموعة AKS من خلال جدار حماية Azure.

إشعار

تحتوي علامة FQDN على جميع FQDNs المدرجة في الشبكة الصادرة وقواعد FQDN لمجموعات AKS ويتم تحديثها تلقائيا.

بالنسبة لسيناريوهات الإنتاج، نوصي بوجود 20 عنوان IP للواجهة الأمامية كحد أدنى على جدار حماية Azure لتجنب مشكلات استنفاد منفذ SNAT.

توفر المعلومات التالية مثالا على بنية التوزيع:

تأمين طوبولوجيا

  • يجبر الدخول العام على التدفق من خلال عوامل تصفية جدار الحماية
    • يتم عزل عقد عامل AKS في شبكة فرعية مخصصة
    • يتم نشر Azure Firewall في شبكته الفرعية الخاصة
    • تترجم قاعدة DNAT عنوان IP العام لجدار الحماية إلى عنوان IP للواجهة الأمامية لموازن التحميل
  • تبدأ الطلبات الصادرة من عقد العامل إلى عنوان IP الداخلي لجدار حماية Azure باستخدام مسار محدد من قبل المستخدم (UDR)
    • تتبع الطلبات من عقد عامل AKS UDR الذي تم وضعه على الشبكة الفرعية التي تم نشر نظام مجموعة AKS فيها
    • يخرج Azure Firewall من الشبكة الافتراضية من واجهة IP عامة
    • يتدفق الوصول إلى الإنترنت العام أو خدمات Azure الأخرى من وإلى عنوان IP الأمامي لجدار الحماية
    • يمكن حماية الوصول إلى وحدة التحكم AKS بواسطة نطاقات IP المعتمدة لخادم API، بما في ذلك عنوان IP العام لجدار الحماية
  • حركة المرور الداخلية
    • يمكنك استخدام موازن تحميل داخلي لحركة المرور الداخلية، والتي يمكنك عزلها على الشبكة الفرعية الخاصة بها، بدلا من موازن التحميل العام أو جنبا إلى جنب

تكوين متغيرات البيئة

تعريف مجموعة من متغيرات البيئة لاستخدامها في إنشاءات الموارد.

PREFIX="aks-egress"
RG="${PREFIX}-rg"
LOC="eastus"
PLUGIN=azure
AKSNAME="${PREFIX}"
VNET_NAME="${PREFIX}-vnet"
AKSSUBNET_NAME="aks-subnet"
# DO NOT CHANGE FWSUBNET_NAME - This is currently a requirement for Azure Firewall.
FWSUBNET_NAME="AzureFirewallSubnet"
FWNAME="${PREFIX}-fw"
FWPUBLICIP_NAME="${PREFIX}-fwpublicip"
FWIPCONFIG_NAME="${PREFIX}-fwconfig"
FWROUTE_TABLE_NAME="${PREFIX}-fwrt"
FWROUTE_NAME="${PREFIX}-fwrn"
FWROUTE_NAME_INTERNET="${PREFIX}-fwinternet"

إنشاء شبكة اتصال ظاهرية مع شبكات فرعية متعددة

توفير شبكة ظاهرية مع شبكتين فرعيتين منفصلتين: واحدة للمجموعة والأخرى لجدار الحماية. اختياريا، يمكنك إنشاء واحد للدخول الداخلي للخدمة.

طوبولوجيا شبكة الاتصال الفارغة

  1. إنشاء مجموعة موارد باستخدام az group create الأمر .

    az group create --name $RG --location $LOC
    
  2. إنشاء شبكة ظاهرية مع شبكتين فرعيتين لاستضافة نظام مجموعة AKS وجدار حماية Azure باستخدام az network vnet create الأمرين و az network vnet subnet create .

    # Dedicated virtual network with AKS subnet
    az network vnet create \
        --resource-group $RG \
        --name $VNET_NAME \
        --location $LOC \
        --address-prefixes 10.42.0.0/16 \
        --subnet-name $AKSSUBNET_NAME \
        --subnet-prefix 10.42.1.0/24
    
    # Dedicated subnet for Azure Firewall (Firewall name can't be changed)
    az network vnet subnet create \
        --resource-group $RG \
        --vnet-name $VNET_NAME \
        --name $FWSUBNET_NAME \
        --address-prefix 10.42.2.0/24
    

إنشاء جدار حماية Azure وإعداده

تحتاج إلى تكوين قواعد Azure Firewall الواردة والصادرة. الغرض الرئيسي من جدار الحماية هو تمكين المؤسسات من تكوين قواعد حركة مرور الدخول والخروج الدقيقة من نظام مجموعة AKS وخارجها.

هام

إذا قام نظام المجموعة أو التطبيق بإنشاء عدد كبير من الاتصالات الصادرة الموجهة إلى نفس الوجهات أو مجموعة فرعية صغيرة من الوجهات، فقد تحتاج إلى المزيد من عناوين IP الأمامية لجدار الحماية لتجنب الحد الأقصى للمنافذ لكل عنوان IP للواجهة الأمامية.

لمزيد من المعلومات حول كيفية إنشاء جدار حماية Azure باستخدام عناوين IP متعددة، راجع إنشاء جدار حماية Azure بعناوين IP عامة متعددة باستخدام Bicep.

جدار الحماية وUDR

  1. إنشاء مورد IP عام SKU قياسي باستخدام az network public-ip create الأمر . سيتم استخدام هذا المورد كعنوان واجهة Azure Firewall الأمامية.

    az network public-ip create --resource-group $RG -n $FWPUBLICIP_NAME --location $LOC --sku "Standard"
    
  2. سجل ملحق Azure Firewall CLI لإنشاء جدار حماية Azure باستخدام az extension add الأمر .

    az extension add --name azure-firewall
    
  3. إنشاء جدار حماية Azure وتمكين وكيل DNS باستخدام az network firewall create الأمر وتعيين --enable-dns-proxy إلى true.

    az network firewall create --resource-group $RG --name $FWNAME --location $LOC --enable-dns-proxy true
    

قد يستغرق إعداد عنوان IP العام إلى جدار حماية Azure بضع دقائق. بمجرد أن يصبح جاهزا، يمكن تعيين عنوان IP الذي تم إنشاؤه مسبقا إلى الواجهة الأمامية لجدار الحماية.

إشعار

للاستفادة من FQDN على قواعد الشبكة، نحتاج إلى تمكين وكيل DNS. عند تمكين وكيل DNS، يستمع جدار الحماية على المنفذ 53 ويعيد توجيه طلبات DNS إلى خادم DNS المحدد أعلاه. يسمح هذا لجدار الحماية بترجمة FQDN تلقائيا.

  1. إنشاء تكوين عنوان IP لجدار حماية Azure باستخدام az network firewall ip-config create الأمر .

    az network firewall ip-config create --resource-group $RG --firewall-name $FWNAME --name $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
    
  2. بمجرد نجاح الأمر السابق، احفظ عنوان IP الأمامي لجدار الحماية للتكوين لاحقا.

    FWPUBLIC_IP=$(az network public-ip show --resource-group $RG --name $FWPUBLICIP_NAME --query "ipAddress" -o tsv)
    FWPRIVATE_IP=$(az network firewall show --resource-group $RG --name $FWNAME --query "ipConfigurations[0].privateIPAddress" -o tsv)
    

إشعار

إذا كنت تستخدم الوصول الآمن إلى خادم AKS API باستخدام نطاقات عناوين IP المعتمدة، فستحتاج إلى إضافة IP العام لجدار الحماية إلى نطاق IP المعتمد.

إنشاء مسار بوثبة إلى Azure Firewall

يوجه Azure حركة المرور تلقائيًا بين الشبكات الفرعية Azure والشبكات الظاهرية والشبكات المحلية. إذا كنت ترغب في تغيير أي من التوجيه الافتراضي ل Azure، يمكنك إنشاء جدول توجيه.

هام

يتطلب النوع الصادر من UDR (userDefinedRouting) مسارا ل 0.0.0.0/0 ووجهة القفز التالية من NVA في جدول التوجيه. يحتوي جدول التوجيه بالفعل على 0.0.0.0/0 افتراضي على الإنترنت. بدون عنوان IP عام ل Azure لاستخدامه في ترجمة عناوين الشبكة المصدر (SNAT)، ما عليك سوى إضافة هذا المسار لن يوفر لك اتصالا صادرا بالإنترنت. تتحقق AKS من أنك لا تنشئ مسار 0.0.0.0/0 يشير إلى الإنترنت ولكن بدلا من ذلك إلى بوابة أو NVA وما إلى ذلك. عند استخدام نوع صادر من UDR، لا يتم إنشاء عنوان IP عام لموازن التحميل للطلبات الواردة ما لم تقم بتكوين خدمة من نوع loadbalancer. لا تقوم AKS أبدا بإنشاء عنوان IP عام للطلبات الصادرة إذا قمت بتعيين نوع صادر من UDR. لمزيد من المعلومات، راجع القواعد الصادرة ل Azure Load Balancer.

  1. إنشاء جدول توجيه فارغ ليتم ربطه بشبكة فرعية معينة باستخدام az network route-table create الأمر . سيحدد جدول التوجيه القفزة التالية مثل جدار حماية Azure الذي تم إنشاؤه أعلاه. يمكن أن يكون لكل شبكة فرعية جدول توجيه واحد مقترن بها أو أن تكون بدون جداول توجيه.

    az network route-table create --resource-group $RG --location $LOC --name $FWROUTE_TABLE_NAME
    
  2. إنشاء مسارات في جدول التوجيه للشبكات الفرعية باستخدام az network route-table route create الأمر .

    az network route-table route create --resource-group $RG --name $FWROUTE_NAME --route-table-name $FWROUTE_TABLE_NAME --address-prefix 0.0.0.0/0 --next-hop-type VirtualAppliance --next-hop-ip-address $FWPRIVATE_IP
    
    az network route-table route create --resource-group $RG --name $FWROUTE_NAME_INTERNET --route-table-name $FWROUTE_TABLE_NAME --address-prefix $FWPUBLIC_IP/32 --next-hop-type Internet
    

للحصول على معلومات حول كيفية تجاوز مسارات النظام الافتراضية ل Azure أو إضافة مسارات إضافية إلى جدول توجيه الشبكة الفرعية، راجع وثائق جدول توجيه الشبكة الظاهرية.

إضافة قواعد جدار الحماية

إشعار

بالنسبة للتطبيقات خارج kube-system أو gatekeeper-system namespaces التي تحتاج إلى التحدث إلى خادم API، يلزم وجود قاعدة شبكة إضافية للسماح لاتصال TCP بالمنفذ 443 لعنقب IP لخادم API بالإضافة إلى إضافة قاعدة التطبيق لعلامة AzureKubernetesService fqdn.

يغطي هذا القسم ثلاث قواعد شبكة وقاعدة تطبيق يمكنك استخدامها للتكوين على جدار الحماية الخاص بك. قد تحتاج إلى تكييف هذه القواعد بناء على التوزيع الخاص بك.

  • تسمح قاعدة الشبكة الأولى بالوصول إلى المنفذ 9000 عبر TCP.
  • تسمح قاعدة الشبكة الثانية بالوصول إلى المنفذ 1194 و123 عبر UDP. إذا كنت تقوم بالنشر إلى Microsoft Azure المشغل بواسطة 21Vianet، فشاهد Azure المشغل بواسطة قواعد الشبكة المطلوبة 21Vianet. ستسمح كلتا القاعدتين فقط بحركة المرور الموجهة إلى منطقة Azure CIDR في هذه المقالة، وهي شرق الولايات المتحدة.
  • تفتح قاعدة الشبكة الثالثة المنفذ 123 إلى ntp.ubuntu.com FQDN عبر UDP. تعد إضافة FQDN كقاعدة شبكة واحدة من الميزات المحددة لجدار حماية Azure، لذلك ستحتاج إلى تكييفه عند استخدام الخيارات الخاصة بك.
  • تسمح قواعد الشبكة الرابعة والخامسة بالوصول إلى سحب الحاويات من سجل حاويات GitHub (ghcr.io) ومركز Docker (docker.io).
  1. إنشاء قواعد الشبكة باستخدام az network firewall network-rule create الأمر .

    az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'apiudp' --protocols 'UDP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 1194 --action allow --priority 100
    
    az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'apitcp' --protocols 'TCP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 9000
    
    az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'time' --protocols 'UDP' --source-addresses '*' --destination-fqdns 'ntp.ubuntu.com' --destination-ports 123
    
    az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'ghcr' --protocols 'TCP' --source-addresses '*' --destination-fqdns ghcr.io pkg-containers.githubusercontent.com --destination-ports '443'
    
    az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'docker' --protocols 'TCP' --source-addresses '*' --destination-fqdns docker.io registry-1.docker.io production.cloudflare.docker.com --destination-ports '443'
    
  2. إنشاء قاعدة التطبيق باستخدام az network firewall application-rule create الأمر .

    az network firewall application-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwar' --name 'fqdn' --source-addresses '*' --protocols 'http=80' 'https=443' --fqdn-tags "AzureKubernetesService" --action allow --priority 100
    

لمعرفة المزيد حول Azure Firewall، راجع وثائق Azure Firewall.

إقران جدول المسار بـ AKS

لربط نظام المجموعة بجدار الحماية، يجب أن تشير الشبكة الفرعية المخصصة للشبكة الفرعية لنظام المجموعة إلى جدول التوجيه الذي تم إنشاؤه أعلاه. az network vnet subnet update استخدم الأمر لربط جدول التوجيه ب AKS.

az network vnet subnet update --resource-group $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --route-table $FWROUTE_TABLE_NAME

نشر نظام مجموعة AKS الذي يتبع القواعد الصادرة

الآن، يمكنك نشر نظام مجموعة AKS في الشبكة الظاهرية الموجودة. ستستخدم userDefinedRouting النوع الصادر، الذي يضمن فرض أي حركة مرور صادرة من خلال جدار الحماية ولن توجد مسارات خروج أخرى. loadBalancer يمكن أيضا استخدام النوع الصادر.

aks-deploy

يتم تعريف الشبكة الفرعية المستهدف نشرها في مع متغير البيئة، $SUBNETID. تعيين قيمة معرف الشبكة الفرعية باستخدام الأمر التالي:

SUBNETID=$(az network vnet subnet show --resource-group $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --query id -o tsv)

ستقوم بتعريف النوع الصادر لاستخدام UDR الموجود مسبقًا على الشبكة الفرعية. سيمكن هذا التكوين AKS من تخطي الإعداد وتوفير IP لموازن التحميل.

تلميح

يمكنك إضافة ميزات إضافية إلى نشر نظام المجموعة، مثل المجموعات الخاصة.

يمكنك إضافة ميزة AKS لنطاقات IP المعتمدة لخادم API للحد من وصول خادم واجهة برمجة التطبيقات إلى نقطة النهاية العامة لجدار الحماية فقط. تتم الإشارة إلى ميزة نطاقات IP المعتمدة في الرسم التخطيطي كخيار. عند تمكين ميزة نطاق IP المعتمدة للحد من الوصول إلى خادم API، يجب أن تستخدم أدوات المطور مربع انتقال من الشبكة الظاهرية لجدار الحماية، أو يجب إضافة جميع نقاط نهاية المطور إلى نطاق IP المعتمد.


إشعار

ستقوم AKS بإنشاء هوية kubelet معينة من قبل النظام في مجموعة موارد العقدة إذا لم تحدد هوية kubelet المدارة الخاصة بك.

بالنسبة للتوجيه المعرف من قبل المستخدم، تدعم الهوية المعينة من قبل النظام فقط المكون الإضافي لشبكة CNI.

إنشاء نظام مجموعة AKS باستخدام هوية مدارة معينة من قبل النظام مع المكون الإضافي لشبكة CNI باستخدام az aks create الأمر .

az aks create --resource-group $RG --name $AKSNAME --location $LOC \
    --node-count 3 \
    --network-plugin azure \
    --outbound-type userDefinedRouting \
    --vnet-subnet-id $SUBNETID \
    --api-server-authorized-ip-ranges $FWPUBLIC_IP \
    --generate-ssh-keys

تمكين وصول المطور إلى خادم API

إذا استخدمت نطاقات IP المعتمدة لنظام المجموعة الخاص بك في الخطوة السابقة، فأنت بحاجة إلى إضافة عناوين IP أدوات المطور إلى قائمة نظام مجموعة AKS لنطاقات IP المعتمدة حتى تتمكن من الوصول إلى خادم API من هناك. يمكنك أيضا تكوين jumpbox باستخدام الأدوات المطلوبة داخل شبكة فرعية منفصلة في الشبكة الظاهرية لجدار الحماية.

  1. استرداد عنوان IP الخاص بك باستخدام الأمر التالي:

    CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
    
  2. أضف عنوان IP إلى النطاقات المعتمدة باستخدام az aks update الأمر .

    az aks update --resource-group $RG --name $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
    
  3. قم بتكوين kubectl للاتصال بمجموعة AKS الخاصة بك باستخدام az aks get-credentials الأمر .

    az aks get-credentials --resource-group $RG --name $AKSNAME
    

نشر خدمة عامة على AKS

يمكنك الآن بدء عرض الخدمات ونشر التطبيقات إلى نظام المجموعة هذا. في هذا المثال، سنكشف عن خدمة عامة، ولكن قد ترغب أيضا في كشف خدمة داخلية باستخدام موازن تحميل داخلي.

الخدمة العامة DNAT

  1. راجع بيان التشغيل السريع ل AKS Store Demo لمشاهدة جميع الموارد التي سيتم إنشاؤها.

  2. نشر الخدمة باستخدام kubectl apply الأمر .

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-quickstart.yaml
    

السماح بنسبة استخدام الشبكة الواردة من خلال Azure Firewall

هام

عند استخدام جدار حماية Azure لتقييد نسبة استخدام الشبكة الخارجة وإنشاء UDR لفرض حركة مرور الخروج بالكامل، تأكد من إنشاء قاعدة DNAT مناسبة في جدار حماية Azure للسماح بشكل صحيح بنسبة استخدام الشبكة للدخول. استخدام Azure Firewall مع UDR يقطع إعداد الدخول بسبب التوجيه غير المتماثل. تحدث المشكلة إذا كانت شبكة AKS الفرعية تحتوي على مسار افتراضي ينتقل إلى عنوان IP الخاص بجدار الحماية، ولكنك تستخدم موازن تحميل عام - خدمة الدخول أو Kubernetes من النوع loadBalancer. في هذه الحالة، يتم تلقي حركة مرور موازن التحميل الواردة عبر عنوان IP العام الخاص به، ولكن مسار الإرجاع يمر عبر عنوان IP الخاص بجدار الحماية. لأن جدار الحماية هو stateful، فإنه يسقط الحزمة العائدة لأن جدار الحماية غير مدرك لجلسة العمل المقررة. لمعرفة كيفية دمج Azure Firewall مع موازن تحميل الدخول أو الخدمة، راجع دمج Azure Firewall مع Azure Standard Load Balancer.

لتكوين الاتصال الوارد، تحتاج إلى كتابة قاعدة DNAT إلى جدار حماية Azure. لاختبار الاتصال بنظام المجموعة الخاص بك، يتم تعريف قاعدة لعنوان IP العام الخاص بجدار الحماية بغرض توجيه IP الداخلية التي تعرضها الخدمة الداخلية. يمكن تخصيص عنوان الوجهة. يجب أن يكون العنوان المترجم عنوان IP لموازن التحميل الداخلي. يجب أن يكون المنفذ المترجم هو المنفذ المكشوف لخدمة Kubernetes. تحتاج أيضا إلى تحديد عنوان IP الداخلي المعين لموازن التحميل الذي أنشأته خدمة Kubernetes.

  1. احصل على عنوان IP الداخلي المعين لموازن التحميل باستخدام kubectl get services الأمر .

    kubectl get services
    

    سيتم سرد عنوان IP في EXTERNAL-IP العمود، كما هو موضح في إخراج المثال التالي:

    NAME              TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)              AGE
    kubernetes        ClusterIP      10.0.0.1       <none>        443/TCP              9m10s
    order-service     ClusterIP      10.0.104.144   <none>        3000/TCP             11s
    product-service   ClusterIP      10.0.237.60    <none>        3002/TCP             10s
    rabbitmq          ClusterIP      10.0.161.128   <none>        5672/TCP,15672/TCP   11s
    store-front       LoadBalancer   10.0.89.139    20.39.18.6    80:32271/TCP         10s
    
  2. احصل على عنوان IP للخدمة kubectl get svc store-front باستخدام الأمر .

    SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
    
  3. أضف قاعدة NAT باستخدام az network firewall nat-rule create الأمر .

    az network firewall nat-rule create --collection-name exampleset --destination-addresses $FWPUBLIC_IP --destination-ports 80 --firewall-name $FWNAME --name inboundrule --protocols Any --resource-group $RG --source-addresses '*' --translated-port 80 --action Dnat --priority 100 --translated-address $SERVICE_IP
    

التحقق من صحة الاتصال

انتقل إلى عنوان IP الأمامي لجدار حماية Azure في مستعرض للتحقق من صحة الاتصال.

يجب أن تشاهد تطبيق مخزن AKS. في هذا المثال، كان 52.253.228.132عنوان IP العام لجدار الحماية .

لقطة شاشة تعرض Azure Store Front App الذي تم فتحه في مستعرض محلي.

في هذه الصفحة، يمكنك عرض المنتجات وإضافتها إلى سلة التسوق الخاصة بك، ثم تقديم طلب.

تنظيف الموارد

لتنظيف موارد Azure، احذف مجموعة موارد AKS باستخدام az group delete الأمر .

az group delete --name $RG

الخطوات التالية

في هذه المقالة، تعلمت كيفية تأمين نسبة استخدام الشبكة الصادرة باستخدام Azure Firewall. إذا لزم الأمر، يمكنك تعميم الخطوات أعلاه لإعادة توجيه نسبة استخدام الشبكة إلى حل الخروج المفضل لديك بعد وثائق النوع userDefinedRoute الصادر.