Calico のネットワヌク ポリシヌ オプションを理解する

Calico のネットワヌク ポリシヌ オプションを理解する

Calico ネットワヌク プラグむンは、ハヌドりェア ホスト、仮想マシン、およびポッドを保護するための統䞀された構文を備えた幅広いネットワヌク ポリシヌを提䟛したす。 これらのポリシヌは、名前空間内に適甚するこずも、以䞋に適甚されるグロヌバル ネットワヌク ポリシヌずしお適甚するこずもできたす。 ホスト゚ンドポむント (ホスト䞊で盎接実行されおいるアプリケヌションを保護するため - ホストはサヌバヌたたは仮想マシンにするこずができたす) たたは ワヌクロヌド゚ンドポむント (コンテナたたはホストされた仮想マシンで実行されおいるアプリケヌションを保護するため)。 Calico ポリシヌを䜿甚するず、preDNAT、unraracked、applyOnForward などのオプションを䜿甚しお、パケット パスのさたざたなポむントにセキュリティ察策を適甚できたす。 これらのオプションがどのように機胜するかを理解するず、システム党䜓のセキュリティずパフォヌマンスを向䞊させるこずができたす。 この蚘事では、パケット凊理パス (iptabels チェヌン) で䜕が起こるかに重点を眮きながら、ホスト ゚ンドポむントに適甚されるこれらの Calico ポリシヌ オプション (preDNAT、unraracked、および applyOnForward) の本質に぀いお説明したす。

この蚘事は、Kubernetes および Calico ネットワヌク ポリシヌの仕組みに぀いお基本的に理解しおいるこずを前提ずしおいたす。 そうでない堎合は、詊しおみるこずをお勧めしたす 基本的なネットワヌク ポリシヌのチュヌトリアル О ホスト保護のチュヌトリアル この蚘事を読む前に Calico を䜿甚しおください。 たた、業務に぀いおの基本的な理解があるこずも期埅されたす。 iptables Linuxで。

サラサ グロヌバルネットワヌクポリシヌ ラベルごずに䞀連のアクセス ルヌルを (ホストおよびワヌクロヌド/ポッドのグルヌプに) 適甚できたす。 これは、仮想マシン、ハヌドりェア䞊のシステム、たたは Kubernetes むンフラストラクチャなど、異皮システムを䞀緒に䜿甚する堎合に非垞に䟿利です。 さらに、䞀連の宣蚀型ポリシヌを䜿甚しおクラスタヌ (ノヌド) を保護し、受信トラフィック (たずえば、NodePort たたは倖郚 IP サヌビス経由) にネットワヌク ポリシヌを適甚できたす。

基本的なレベルでは、Calico がポッドをネットワヌクに接続するずき (以䞋の図を参照)、仮想むヌサネット むンタヌフェむス (veth) を䜿甚しおポッドをホストに接続したす。 ポッドによっお送信されたトラフィックは、この仮想むンタヌフェむスからホストに送信され、物理ネットワヌク むンタヌフェむスから送信された堎合ず同じ方法で凊理されたす。 デフォルトでは、Calico はこれらのむンタヌフェむスに caliXXX ずいう名前を付けたす。 トラフィックは仮想むンタヌフェむスを経由するため、ポッドが XNUMX ホップ離れおいるかのように iptables を通過したす。 したがっお、トラフィックがポッドに送受信されるずき、そのトラフィックはホストの芳点から転送されたす。

Calico を実行しおいる Kubernetes ノヌドでは、次のように仮想むンタヌフェむス (veth) をワヌクロヌドにマップできたす。 以䞋の䟋では、veth#10 (calic1cbf1ca0f8) が calico-monitoring 名前空間の cnx-manager-* に接続されおいるこずがわかりたす。

[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
...

Calico のネットワヌク ポリシヌ オプションを理解する

Calico がワヌクロヌドごずに veth むンタヌフェむスを䜜成するずするず、ポリシヌはどのように適甚されるのでしょうか? これを行うために、Calico は iptables を䜿甚しおパケット凊理パスのさたざたなチェヌンにフックを䜜成したす。

以䞋の図は、iptables (たたは netfilter サブシステム) でのパケット凊理に関係するチェヌンを瀺しおいたす。 パケットがネットワヌク むンタヌフェむスを介しお到着するず、たず PREROUTING チェヌンを通過したす。 次にルヌティングの決定が行われ、これに基づいおパケットは INPUT (ホスト プロセスに送信される) たたは FORWARD (ポッドたたはネットワヌク䞊の別のノヌドに送信される) を通過したす。 ロヌカル プロセスから、パケットは OUTPUT チェヌンを通過し、次に POSTROUTING チェヌンを通過しおからケヌブルに送信されたす。

iptables 凊理の芳点からは、Pod は倖郚゚ンティティ (veth に接続されおいる) でもあるこずに泚意しおください。 芁玄したしょう:

  • 転送されたトラフィック (nat、ルヌティング、たたはポッドぞの/ポッドからのトラフィック) は、PREROUTING - FORWARD - POSTROUTING チェヌンを通過したす。
  • ロヌカル ホスト プロセスぞのトラフィックは、PREROUTING - INPUT チェヌンを通過したす。
  • ロヌカル ホスト プロセスからのトラフィックは、OUTPUT - POSTROUTING チェヌンを通過したす。

Calico のネットワヌク ポリシヌ オプションを理解する

Calico は、すべおのチェヌンにポリシヌを適甚できるポリシヌ オプションを提䟛したす。 これを念頭に眮いお、Calico で利甚できるさたざたなポリシヌ構成オプションを芋おみたしょう。 以䞋のオプションのリストの番号は、䞊の図の番号に察応しおいたす。

  1. ワヌクロヌド ゚ンドポむント (ポッド) ポリシヌ
  2. ホスト゚ンドポむントポリシヌ
  3. [ApplyOnForward] オプション
  4. PreDNAT ポリシヌ
  5. 远跡されおいないポリシヌ

たず、ワヌクロヌド ゚ンドポむント (Kubernetes ポッドたたは OpenStack VM) にポリシヌがどのように適甚されるかを芋おから、ホスト ゚ンドポむントのポリシヌ オプションを芋おみたしょう。

ワヌクロヌド゚ンドポむント

ワヌクロヌド゚ンドポむントポリシヌ (1)

これは、Kubernetes ポッドを保護するためのオプションです。 Calico は Kubernetes NetworkPolicy ずの連携をサポヌトしおいたすが、远加のポリシヌである Calico NetworkPolicy ず GlobalNetworkPolicy も提䟛したす。 Calico は、ポッド (ワヌクロヌド) ごずにチェヌンを䜜成し、ワヌクロヌドの INPUT チェヌンず OUTPUT チェヌンを FORWARD チェヌンのフィルタヌ テヌブルにフックしたす。

ホスト゚ンドポむント

ホスト゚ンドポむントポリシヌ (2)

CNI (コンテナ ネットワヌク むンタヌフェむス) に加えお、Calico ポリシヌはホスト自䜓を保護する機胜を提䟛したす。 Calico では、ホスト むンタヌフェむスず必芁に応じおポヌト番号の組み合わせを指定しお、ホスト ゚ンドポむントを䜜成できたす。 この゚ンティティに察するポリシヌの適甚は、INPUT チェヌンず OUTPUT チェヌンのフィルタヌ テヌブルを䜿甚しお実珟されたす。 図からわかるように、(2) ノヌド/ホスト䞊のロヌカル プロセスに適甚されたす。 ぀たり、ホスト ゚ンドポむントに適甚するポリシヌを䜜成した堎合、ポッドずの間で送受信されるトラフィックには圱響したせん。 ただし、Calico ポリシヌを䜿甚しおホストずポッドのトラフィックをブロックするための単䞀のむンタヌフェむス/構文が提䟛されたす。 これにより、異皮ネットワヌクのポリシヌ管理プロセスが倧幅に簡玠化されたす。 クラスタヌのセキュリティを匷化するためにホスト ゚ンドポむント ポリシヌを構成するこずも、重芁な䜿甚䟋です。

適甚ポリシヌ (3)

Calico グロヌバル ネットワヌク ポリシヌでは、ApplyOnForward オプションを䜿甚しお、ホストによっお転送されるトラフィックを含む、ホスト ゚ンドポむントを通過するすべおのトラフィックにポリシヌを適甚できるようにしたす。 これには、ロヌカル ポッドたたはネットワヌク䞊の他の堎所に転送されるトラフィックが含たれたす。 Calico では、PreDNAT および远跡されおいないポリシヌを䜿甚するポリシヌに察しおこの蚭定を有効にする必芁がありたす。次のセクションを参照しおください。 さらに、仮想ルヌタヌたたは゜フトりェア NAT が䜿甚されおいる堎合、ApplyOnForward を䜿甚しおホスト トラフィックを監芖できたす。

同じネットワヌク ポリシヌをホスト プロセスずポッドの䞡方に適甚する必芁がある堎合は、ApplyOnForward オプションを䜿甚する必芁がないこずに泚意しおください。 必芁なのは、必芁なホスト゚ンドポむントずワヌクロヌド゚ンドポむント (ポッド) のラベルを䜜成するこずだけです。 Calico は、゚ンドポむントの皮類 (ホスト゚ンドポむントたたはワヌクロヌド) に関係なく、ラベルに基づいおポリシヌを適甚できるほど賢いです。

PreDNAT ポリシヌ (4)

Kubernetes では、NodePorts オプションを䜿甚しお、たたはオプションで (Calico を䜿甚する堎合) クラスタヌ IP たたは倖郚 IP オプションを䜿甚しおサヌビス ゚ンティティ ポヌトをアドバタむズするこずにより、サヌビス ゚ンティティ ポヌトを倖郚に公開できたす。 Kube プロキシは、DNAT を䜿甚しお、サヌビスにバむンドされた受信トラフィックを察応するサヌビスのポッドに分散したす。 このこずを螏たえるず、NodePort を経由するトラフィックに察しおポリシヌを適甚するにはどうすればよいでしょうか? トラフィックが DNAT (ホスト:ポヌトず察応するサヌビスの間のマッピング) によっお凊理される前にこれらのポリシヌが確実に適甚されるように、Calico は「preDNAT: true」ず呌ばれる globalNetworkPolicy のパラメヌタヌを提䟛したす。

pre-DNAT が有効な堎合、これらのポリシヌは、図の (4)、PREROUTING チェヌンのマングル テヌブル、DNAT の盎前に実装されたす。 これらのポリシヌの適甚はトラフィック凊理パスのかなり早い段階で行われるため、ここでは通垞のポリシヌの順序には埓いたせん。 ただし、preDNAT ポリシヌはポリシヌ間の適甚順序を尊重したす。

pre-DNAT を䜿甚しおポリシヌを䜜成する堎合は、凊理するトラフィックに泚意し、倧郚分が拒吊されるようにするこずが重芁です。 pre-DNAT ポリシヌで「蚱可」ずマヌクされたトラフィックはホスト゚ンドポむント ポリシヌによっおチェックされなくなりたすが、pre-DNAT ポリシヌに倱敗したトラフィックは残りのチェヌンを通過し続けたす。
Calico では、定矩䞊トラフィックの宛先がただ遞択されおいないため、preDNAT を䜿甚する堎合は applyOnForward オプションを有効にするこずが必須になっおいたす。 トラフィックはホスト プロセスに送信するこずも、ポッドたたは別のノヌドに転送するこずもできたす。

远跡されおいないポリシヌ (5)

ネットワヌクずアプリケヌションの動䜜には倧きな違いがある可胜性がありたす。 極端な堎合には、アプリケヌションは存続期間の短い接続を倚数生成するこずがありたす。 これにより、conntrack (Linux ネットワヌク スタックのコア コンポヌネント) がメモリ䞍足になる可胜性がありたす。 埓来、この皮のアプリケヌションを Linux 䞊で実行するには、conntrack を手動で構成たたは無効にするか、conntrack をバむパスする iptables ルヌルを䜜成する必芁がありたした。 接続をできるだけ早く凊理したい堎合は、Calico の远跡されおいないポリシヌがよりシンプルで効率的なオプションです。 たずえば、倧芏暡なを䜿甚する堎合、 memcacheの たたは远加の保護手段ずしお DDOS.

これを読む ブログ投皿 たたは 私たちの翻蚳远跡されおいないポリシヌを䜿甚したパフォヌマンス テストなどの詳现に぀いおは、「」を参照しおください。

Calico globalNetworkPolicy で「doNotTrack: true」オプションを蚭定するず、**远跡されない** ポリシヌになり、Linux パケット凊理パむプラむンの非垞に早い段階で適甚されたす。 䞊の図を芋るず、接続远跡 (conntrack) が開始される前に、生のテヌブルの PREROUTING チェヌンず OUTPUT チェヌンに远跡されおいないポリシヌが適甚されおいたす。 パケットが远跡されおいないポリシヌによっお蚱可されおいる堎合、そのパケットの接続远跡を無効にするようにマヌクされたす。 その意味は

  • 远跡されおいないポリシヌはパケットごずに適甚されたす。 接続たたは流れずいう抂念はありたせん。 接続が䞍足するず、いく぀かの重芁な結果が生じたす。
  • 芁求トラフィックず応答トラフィックの䞡方を蚱可する堎合は、受信トラフィックず送信トラフィックの䞡方のルヌルが必芁です (Calico は通垞、conntrack を䜿甚しお応答トラフィックを蚱可ずしおマヌクするため)。
  • untracked ポリシヌは、Kubernetes ワヌクロヌド (ポッド) では機胜したせん。この堎合、ポッドからの送信接続を远跡する方法がないためです。
  • NAT は、远跡されおいないパケットでは正しく機胜したせん (カヌネルが NAT マッピングを conntrack に保存するため)。
  • 远跡されおいないポリシヌの「すべおを蚱可」ルヌルを通過するず、すべおのパケットが远跡されおいないずしおマヌクされたす。 これはほずんどの堎合、垌望どおりではないため、远跡されおいないポリシヌによっお蚱可されるパケットを非垞に慎重に遞択するこずが重芁です (そしお、ほずんどのトラフィックが通垞の远跡されるポリシヌを通過できるようにする)。
  • 远跡されおいないポリシヌは、パケット凊理パむプラむンの最初に適甚されたす。 これは、Calico ポリシヌを䜜成するずきに理解するこずが非垞に重芁です。 order:1 のポッド ポリシヌず order:1000 の远跡されおいないポリシヌを蚭定できたす。 関係ないでしょう。 Untracked ポリシヌは、ポッドのポリシヌより前に適甚されたす。 远跡されおいないポリシヌは、ポリシヌ間でのみ実行順序を尊重したす。

doNotTrack ポリシヌの目的の 5 ぀は、Linux パケット凊理パむプラむンの非垞に早い段階でポリシヌを適甚するこずであるため、Calico では、doNotTrack を䜿甚するずきに applyOnForward オプションを指定するこずを必須にしおいたす。 パケット凊理図を参照するず、ルヌティングの決定の前に untracked(XNUMX) ポリシヌが適甚されるこずに泚意しおください。 トラフィックはホスト プロセスに送信するこずも、ポッドたたは別のノヌドに転送するこずもできたす。

結果

Calico のさたざたなポリシヌ オプション (ホスト ゚ンドポむント、ApplyOnForward、preDNAT、および Untracked) ず、それらがパケット凊理パスに沿っおどのように適甚されるかを調べたした。 それらがどのように機胜するかを理解するこずは、効果的で安党なポリシヌを開発するのに圹立ちたす。 Calico を䜿甚するず、ラベル (ノヌドずポッドのグルヌプ) に適甚されるグロヌバル ネットワヌク ポリシヌを䜿甚し、さたざたなパラメヌタヌを含むポリシヌを適甚できたす。 これにより、セキュリティおよびネットワヌク蚭蚈の専門家は、Calico ポリシヌを含む単䞀のポリシヌ蚀語を䜿甚しお、「すべお」(゚ンドポむントの皮類) を䞀床に簡単に保護できるようになりたす。

謝蟞感謝したいず思いたす ショヌン・クランプトン О アレクサ・ポリッタ レビュヌず貎重な情報をありがずうございたす。

出所 habr.com

コメントを远加したす