Memahami Pilihan Penguatkuasaan Dasar Rangkaian dengan Calico

Memahami Pilihan Penguatkuasaan Dasar Rangkaian dengan Calico

Pemalam rangkaian Calico menyediakan pelbagai dasar rangkaian dengan sintaks bersatu untuk melindungi hos perkakasan, mesin maya dan pod. Dasar ini boleh digunakan dalam ruang nama atau menjadi dasar rangkaian global yang digunakan untuk titik akhir hos (untuk melindungi aplikasi yang berjalan terus pada hos - hos boleh menjadi pelayan atau mesin maya) atau titik akhir beban kerja (untuk melindungi aplikasi yang berjalan dalam bekas atau mesin maya yang dihoskan). Dasar Calico membolehkan anda menggunakan langkah keselamatan pada pelbagai titik dalam laluan paket menggunakan pilihan seperti praDNAT, unraracked dan applyOnForward. Memahami cara pilihan ini berfungsi boleh membantu meningkatkan keselamatan dan prestasi keseluruhan sistem anda. Artikel ini menerangkan intipati pilihan dasar Calico ini (preDNAT, unraracked dan applyOnForward) digunakan pada titik akhir hos, dengan penekanan pada perkara yang berlaku dalam laluan pemprosesan paket (rantaian iptabels).

Artikel ini menganggap bahawa anda mempunyai pemahaman asas tentang cara dasar rangkaian Kubernetes dan Calico berfungsi. Jika tidak, kami mengesyorkan mencubanya tutorial dasar rangkaian asas ΠΈ tutorial perlindungan hos menggunakan Calico sebelum membaca artikel ini. Kami juga mengharapkan anda mempunyai pemahaman asas tentang kerja iptables dalam linux.

Calico dasar rangkaian global membolehkan anda menggunakan set peraturan akses mengikut label (kepada kumpulan hos dan beban kerja/pod). Ini sangat berguna jika anda menggunakan sistem heterogen bersama-sama - mesin maya, sistem secara langsung pada perkakasan atau infrastruktur kubernetes. Selain itu, anda boleh melindungi kluster (nod) anda menggunakan satu set dasar pengisytiharan dan menggunakan dasar rangkaian pada trafik masuk (contohnya, melalui perkhidmatan NodePorts atau IP Luaran).

Pada tahap asas, apabila Calico menyambungkan pod ke rangkaian (lihat rajah di bawah), ia menyambungkannya kepada hos menggunakan antara muka Ethernet maya (veth). Trafik yang dihantar oleh pod datang kepada hos daripada antara muka maya ini dan diproses dengan cara yang sama seolah-olah ia datang dari antara muka rangkaian fizikal. Secara lalai, Calico menamakan antara muka ini sebagai caliXXX. Memandangkan trafik datang melalui antara muka maya, ia melalui iptables seolah-olah pod berada satu lompatan jauhnya. Oleh itu, apabila trafik datang ke/dari pod, ia dimajukan dari sudut pandangan hos.

Pada nod Kubernetes yang menjalankan Calico, anda boleh memetakan antara muka maya (veth) kepada beban kerja seperti berikut. Dalam contoh di bawah, anda boleh melihat bahawa veth#10 (calic1cbf1ca0f8) disambungkan kepada cnx-manager-* dalam ruang nama pemantauan calico.

[centos@ip-172-31-31-46 K8S]$ sudo ip a
...
10: calic1cbf1ca0f8@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 5
    inet6 fe80::ecee:eeff:feee:eeee/64 scope link
       valid_lft forever preferred_lft forever
...

[centos@ip-172-31-31-46 K8S]$ calicoctl get wep --all-namespaces
...
calico-monitoring cnx-manager-8f778bd66-lz45m                            ip-172-31-31-46.ec2.internal 192.168.103.134/32
calic1cbf1ca0f8
...

Memahami Pilihan Penguatkuasaan Dasar Rangkaian dengan Calico

Memandangkan Calico mencipta antara muka veth untuk setiap beban kerja, bagaimanakah ia menguatkuasakan dasar? Untuk melakukan ini, Calico mencipta cangkuk dalam pelbagai rantai laluan pemprosesan paket menggunakan iptables.

Rajah di bawah menunjukkan rantai yang terlibat dalam pemprosesan paket dalam iptables (atau subsistem penapis bersih). Apabila paket tiba melalui antara muka rangkaian, ia mula-mula melalui rantai PREROUTING. Keputusan penghalaan kemudian dibuat, dan berdasarkan ini, paket melalui sama ada INPUT (dihalakan kepada proses hos) atau FORWARD (dihalakan ke pod atau nod lain pada rangkaian). Dari proses tempatan, paket melalui OUTPUT dan kemudian POSTROUTING rantai sebelum dihantar ke bawah kabel.

Ambil perhatian bahawa pod juga merupakan entiti luaran (disambungkan kepada veth) dari segi pemprosesan iptables. Mari kita ringkaskan:

  • Trafik ke hadapan (nat, dihalakan atau ke/dari pod) melalui rantai PREROUTING - FORWARD - POSTROUTING.
  • Trafik ke proses hos tempatan melalui rantai PREROUTING - INPUT.
  • Trafik daripada proses hos tempatan melalui rantaian OUTPUT - POSTROUTING.

Memahami Pilihan Penguatkuasaan Dasar Rangkaian dengan Calico

Calico menyediakan pilihan dasar yang membolehkan anda menggunakan dasar merentas semua rantaian. Dengan mengambil kira itu, mari lihat pilihan konfigurasi dasar berbeza yang tersedia di Calico. Nombor dalam senarai pilihan di bawah sepadan dengan nombor dalam rajah di atas.

  1. Dasar titik akhir beban kerja (pod).
  2. Dasar titik akhir hos
  3. Opsyen ApplyOnForward
  4. Dasar PreDNAT
  5. Dasar Tidak Dijejaki

Mari kita mulakan dengan melihat cara dasar digunakan pada titik akhir beban kerja (pod Kubernetes atau VM OpenStack), dan kemudian lihat pilihan dasar untuk titik akhir hos.

Titik Akhir Beban Kerja

Dasar Titik Akhir Beban Kerja (1)

Ini adalah pilihan untuk melindungi pod kubernetes anda. Calico menyokong bekerja dengan Kubernetes NetworkPolicy, tetapi ia juga menyediakan dasar tambahan - Calico NetworkPolicy dan GlobalNetworkPolicy. Calico mencipta rantai untuk setiap pod (beban kerja) dan cangkuk dalam rantai INPUT dan OUTPUT untuk beban kerja ke jadual penapis rantai FORWARD.

Titik Akhir Hos

Dasar Titik Akhir Hos (2)

Selain CNI (antara muka rangkaian kontena), dasar Calico menyediakan keupayaan untuk melindungi hos itu sendiri. Dalam Calico, anda boleh mencipta titik akhir hos dengan menentukan gabungan antara muka hos dan, jika perlu, nombor port. Penguatkuasaan dasar untuk entiti ini dicapai menggunakan jadual penapis dalam rantai INPUT dan OUTPUT. Seperti yang anda lihat dari rajah, (2) ia digunakan untuk proses tempatan pada nod/hos. Iaitu, jika anda membuat dasar yang digunakan pada titik akhir hos, ia tidak akan menjejaskan trafik yang pergi ke/dari pod anda. Tetapi ia menyediakan antara muka/sintaks tunggal untuk menyekat trafik untuk hos dan pod anda menggunakan dasar Calico. Ini sangat memudahkan proses mengurus dasar untuk rangkaian heterogen. Mengkonfigurasi dasar titik akhir hos untuk meningkatkan keselamatan kelompok ialah satu lagi kes penggunaan yang penting.

Dasar ApplyOnForward (3)

Pilihan ApplyOnForward tersedia dalam dasar rangkaian global Calico untuk membenarkan dasar digunakan pada semua trafik yang melalui titik akhir hos, termasuk trafik yang akan dimajukan oleh hos. Ini termasuk trafik yang dimajukan ke pod tempatan atau di mana-mana sahaja pada rangkaian. Calico memerlukan tetapan ini didayakan untuk dasar menggunakan PreDNAT dan tidak dijejaki, lihat bahagian berikut. Selain itu, ApplyOnForward boleh digunakan untuk memantau trafik hos dalam kes di mana penghala maya atau perisian NAT digunakan.

Ambil perhatian bahawa jika anda perlu menggunakan dasar rangkaian yang sama pada kedua-dua proses hos dan pod, maka anda tidak perlu menggunakan pilihan ApplyOnForward. Apa yang anda perlu lakukan ialah mencipta label untuk hosendpoint yang diperlukan dan titik akhir beban kerja (pod). Calico cukup bijak untuk menguatkuasakan dasar berdasarkan label, tanpa mengira jenis titik akhir (titik hos atau beban kerja).

Dasar PraDNAT (4)

Dalam Kubernetes, port entiti perkhidmatan boleh didedahkan secara luaran menggunakan pilihan NodePorts atau, secara pilihan (apabila menggunakan Calico), dengan mengiklankannya menggunakan pilihan IP Kluster atau IP Luaran. Kube-proxy mengimbangkan trafik masuk yang terikat pada perkhidmatan ke pod perkhidmatan yang sepadan menggunakan DNAT. Memandangkan ini, bagaimana anda menguatkuasakan dasar untuk trafik yang datang melalui NodePorts? Untuk memastikan bahawa dasar ini digunakan sebelum trafik diproses oleh DNAT (yang merupakan pemetaan antara hos:port dan perkhidmatan yang sepadan), Calico menyediakan parameter untuk GlobalNetworkPolicy yang dipanggil "preDNAT: true".

Apabila pra-DNAT didayakan, dasar ini dilaksanakan dalam (4) dalam rajah - dalam jadual mangle rantai PREROUTING - sejurus sebelum DNAT. Susunan dasar biasa tidak diikuti di sini, kerana penggunaan dasar ini berlaku lebih awal dalam laluan pemprosesan trafik. Walau bagaimanapun, dasar praDNAT menghormati susunan penggunaan antara mereka.

Apabila membuat dasar dengan pra-DNAT, adalah penting untuk berhati-hati tentang trafik yang ingin anda proses dan membenarkan majoriti ditolak. Trafik yang ditandakan sebagai 'benarkan' dalam dasar pra-DNAT tidak lagi akan disemak oleh dasar titik hos, manakala trafik yang gagal dalam dasar pra-DNAT akan diteruskan melalui rantaian yang tinggal.
Calico telah mewajibkan untuk mendayakan pilihan applyOnForward apabila menggunakan preDNAT, kerana mengikut takrifan destinasi trafik belum lagi dipilih. Trafik boleh diarahkan ke proses hos, atau ia boleh dimajukan ke pod atau nod lain.

Dasar Tidak Dijejaki (5)

Rangkaian dan aplikasi boleh mempunyai perbezaan besar dalam tingkah laku. Dalam sesetengah kes yang melampau, aplikasi mungkin menghasilkan banyak sambungan jangka pendek. Ini boleh menyebabkan conntrack (komponen teras susunan rangkaian Linux) kehabisan memori. Secara tradisinya, untuk menjalankan jenis aplikasi ini di Linux, anda perlu mengkonfigurasi atau melumpuhkan conntrack secara manual, atau menulis peraturan iptables untuk memintas conntrack. Dasar tidak dijejaki di Calico ialah pilihan yang lebih mudah dan cekap jika anda ingin memproses sambungan secepat mungkin. Sebagai contoh, jika anda menggunakan secara besar-besaran memcache atau sebagai langkah perlindungan tambahan terhadap DDOS.

Baca ini blog post (Atau terjemahan kami) untuk mendapatkan maklumat lanjut, termasuk ujian prestasi menggunakan dasar tidak dijejaki.

Apabila anda menetapkan pilihan "doNotTrack: true" dalam Calico globalNetworkPolicy, ia menjadi dasar **tidak dijejaki** dan digunakan sangat awal dalam saluran paip pemprosesan paket Linux. Melihat rajah di atas, dasar tidak dijejaki digunakan dalam rantai PREROUTING dan OUTPUT dalam jadual mentah sebelum penjejakan sambungan (conntrack) dimulakan. Apabila paket dibenarkan oleh dasar tidak dijejaki, ia ditandakan untuk melumpuhkan penjejakan sambungan untuk paket itu. Ia bermaksud:

  • Dasar yang tidak dijejaki digunakan berdasarkan setiap paket. Tiada konsep sambungan (atau aliran). Kekurangan sambungan mempunyai beberapa akibat penting:
  • Jika anda ingin membenarkan trafik permintaan dan respons, anda memerlukan peraturan untuk masuk dan keluar (kerana Calico biasanya menggunakan conntrack untuk menandakan trafik respons sebagai dibenarkan).
  • Dasar yang tidak dijejaki tidak berfungsi untuk beban kerja Kubernetes (pod), kerana dalam kes ini tiada cara untuk menjejak sambungan keluar dari pod.
  • NAT tidak berfungsi dengan betul dengan paket yang tidak dijejaki (kerana kernel menyimpan pemetaan NAT dalam conntrack).
  • Apabila melalui peraturan "benarkan semua" dalam dasar tidak dikesan, semua paket akan ditandakan sebagai tidak dijejaki. Ini hampir selalu bukan perkara yang anda mahukan, jadi adalah penting untuk menjadi sangat selektif tentang paket yang dibenarkan oleh dasar yang tidak dijejaki (dan membenarkan kebanyakan trafik melalui dasar yang dijejaki biasa).
  • Dasar yang tidak dijejaki digunakan pada permulaan saluran paip pemprosesan paket. Perkara ini sangat penting untuk difahami semasa membuat dasar Calico. Anda boleh mempunyai polisi pod dengan order:1 dan polisi untracked dengan order:1000. Tidak mengapa. Dasar Tidak Dijejaki akan digunakan sebelum dasar untuk pod. Polisi yang tidak dijejaki hanya menghormati perintah pelaksanaan sesama mereka.

Oleh kerana salah satu tujuan dasar doNotTrack adalah untuk menguatkuasakan dasar itu sangat awal dalam saluran paip pemprosesan paket Linux, Calico mewajibkan untuk menentukan pilihan applyOnForward apabila menggunakan doNotTrack. Merujuk kepada rajah pemprosesan paket, ambil perhatian bahawa dasar tidak dikesan(5) digunakan sebelum sebarang keputusan penghalaan. Trafik boleh diarahkan ke proses hos, atau ia boleh dimajukan ke pod atau nod lain.

Keputusan

Kami melihat pelbagai pilihan dasar (titik akhir Hos, ApplyOnForward, preDNAT dan Untracked) dalam Calico dan cara ia digunakan di sepanjang laluan pemprosesan paket. Memahami cara ia berfungsi membantu dalam membangunkan dasar yang berkesan dan selamat. Dengan Calico anda boleh menggunakan dasar rangkaian global yang digunakan pada label (sekumpulan nod dan pod) dan menggunakan dasar dengan pelbagai parameter. Ini membolehkan profesional keselamatan dan reka bentuk rangkaian melindungi "semuanya" (jenis titik akhir) dengan mudah sekali gus menggunakan bahasa dasar tunggal dengan dasar Calico.

Penghargaan: Saya ingin mengucapkan terima kasih Sean Crampton ΠΈ Alexa Pollitta untuk semakan dan maklumat berharga mereka.

Sumber: www.habr.com

Tambah komen