1. iptables の紹介 1.1 iptables の概要 OpenStack セキュリティ グループを紹介する前に、iptables について簡単に紹介しましょう。実際、iptables は単なるユーザー空間プログラムです。実際の作業は Linux カーネルの netfilter です。 iptables を通じて新しいルールを作成すると、実際には、データ パケットを変更し、データ パケットのフローを制御するためのフックが netfilter に挿入されます。 iptablesの使用に慣れていない人は、iptablesの図解説明[1]を参照してください。 簡単に言えば、iptables は一連のルール条件の一致を通じて指定されたアクションを実行するため、ルールは条件 + アクションで構成されます。条件には、送信元 IP アドレス、レイヤー 4 プロトコル、ポートなどが含まれ、アクションにはパケットの拒否、通過、破棄、変更などが含まれます。アクションは通常、-j パラメータによって指定されます。 たとえば、ターゲット ポート 22 への 192.168.1.2 のアクセスを拒否するには、次の iptables ルールを追加するだけです。 上記の通り:
1.2 iptables の一致条件 一致条件として前述の -s、-p、--dport などのパラメータに加えて、iptables はターゲット IP アドレスを一致させる -d、どのネットワーク カードを入力するか、どのネットワーク カードを残すかを指定する -i および -o もサポートしています。もちろん、これらの一致条件だけでは不十分であり、MAC アドレスの一致もサポートされていません。さまざまなニーズを満たすために、iptables は拡張モジュールを通じてより多くの一致条件をサポートします。拡張モジュールは主に次の 2 つのカテゴリに分けられます。
拡張モジュールによってサポートされるパラメータが異なります。たとえば、mac モジュールは --mac-source パラメータをサポートしています。 拡張モジュールを使用するには、-m パラメータを使用してロードする必要があります。 -m は --module の略語だとばかり思っていました。 iptables のマニュアルを読んだ後、これは実際には --match の省略形であることがわかりました。ただし、拡張モジュールをロードする機能であることを知っておくだけで十分です。 たとえば、MAC アドレス FA:16:3E:A0:59:BA の通過を許可せず、次のルールを設定します。 iptables には多くの拡張モジュールがあり、man iptables-extensions コマンドで確認できますが、OpenStack セキュリティ グループではそれらの多くを使用しません。
1.3 iptables実行アクション 前述したように、iptables は -j を使用して実行するアクション (ターゲット) を指定します。 iptables の一般的なターゲットは次のとおりです。
もちろん、NAT を実装するための SNAT、MASQUERADE、DNAT もあります。これらはセキュリティ グループの実装には関係しないため、詳細には紹介しません。さらに、RETURN と別のチェーンを指すアクションがありますが、これについてはサブチェーンが導入されたときに後で説明します。 アクションは通常、短絡的です。つまり、ルールが一致してアクションが実行されると、チェーン内の他のルールは一致しなくなります。もちろん、これは絶対的なものではありません。たとえば、LOG アクションは例外です。アクションを実行した後、次のルールが一致します。 1.4 iptables チェーン 前述したように、iptables には合計 5 つのチェーンがあり、チェーンは一方向のリンク リストと見なすことができます。問題は、新しいパケットが受信されたときに、ルールがどのように一致するかということです。ここでは、画像とテキストでiptablesを理解する[1]という記事から図をそのまま引用します。 (1)データパケットはまずPREROUTINGチェーンに到達し、次にPREROUTINGで定義されたルールをraw、mangle、natの順に照合して実行します。 (2)次に、ルーティング判断の結果、パケットが自分宛であればINPUTチェーンに流れ、INPUTチェーンはそれをユーザー空間プロセスに送って処理する。パケットが自分自身に送信されない場合、FORWARD テーブルに流れ、raw -> mangle -> nat -> filter テーブルに従って順番に実行チェーン上のルールと一致します。 (3)同様に、ONPUTチェーン、POSTROUTINGチェーン、パケットフロー方向も図を見れば非常に明確なので、ここでは詳細には触れません。 前述のように、各チェーンにルールを挿入できます。これらのルールは順守されていることに注意してください。 iptables が一致するたびに、最初のルールから開始して、次のルールに順番に一致します。いずれかのルールが一致すると、対応するアクションが実行されます。 このチェーンのルールがどれも一致しない場合は、どうすればいいのかと疑問に思う人がいるはずです。答えはチェーンのデフォルトポリシーによって異なります。ポリシーが DROP の場合、一致しないすべてのパケットは破棄されます。つまり、チェーンはホワイトリストです。デフォルトのポリシーが ACCEPT の場合、一致しないすべてのパケットが通過します。つまり、チェーンはブラックリストです。もちろん、DROP として構成するのは危険すぎるため、通常はポリシーは ACCEPT に設定されます。たとえば、ルールをクリアすると、すぐにすべてがブロックされます。 SSH 経由でサーバーに接続すると、接続はすぐに切断され、vnc またはアウトオブバンド コンソール接続経由で接続をリセットする必要があります。したがって、ポリシーを変更することはお勧めしません。 フィルター テーブル内の各チェーンのデフォルト ポリシーを表示するには、次のコマンドを使用します。 チェーンに複雑なルールが多数あると管理が非常に面倒になるため、チェーンを機能ごとにグループ化する必要があります。 iptables はカスタム チェーンを通じて実装されます。ユーザーは、iptables -N name を使用して新しいチェーンを作成し、組み込みチェーンと同様に新しいチェーンにルールを追加できます。ただし、カスタム チェーンは独立して存在することはできず、5 つの組み込みチェーンの下にハングアップする必要がある、つまり組み込みチェーンのサブチェーンである必要があることに注意してください。 前のセクション 1.3 では、-j で新しいチェーンを指定できることを説明しました。ここでの新しいチェーンはサブチェーンです。つまり、iptables は -j を使用してサブチェーンを特定のルールに添付します。たとえば、SSH アクセスを許可するホワイトリストを作成するには、新しいサブチェーンを作成し、すべての SSH 関連ポリシーをこの新しいチェーンに配置します。 上記の 2 番目のコマンドは、ローカル マシンのポート 22 にアクセスするすべてのパケットが処理のために SSH_Access_List サブチェーンに配置され、その後、多くのホワイトリスト ルールがこのサブチェーンに追加されることを意味します。このサブチェーンに入るパケットはターゲット ポート 22 である必要があるため、ルールで --dport パラメータを指定する必要はありません。最後の DROP は、ホワイトリストにないパケットが直接破棄されることを意味します。 ホワイトリスト ルールのアクションは ACCEPT ではなく RETURN であることに注意してください。この2つの違いは何でしょうか? ACCEPT は、パケットが INPUT の他のルールに一致せずに INPUT を直接通過できることを意味します。 RETURN は、サブチェーン配下の後続のルールを照合する必要はないが、照合を続行するにはサブチェーンの親チェーンまたはサブチェーンのルールに戻る必要があることを意味します。 INPUT レベルを通過できるかどうかは、後続のルールによって決まります。 また、上記の 5 つの組み込みチェーンはポリシーを使用して構成できることにも注意してください。すべてのルールが一致しない場合は、ポリシーを使用してパケットが処理されます。ただし、カスタム チェーンはポリシーをサポートしません。より正確に言うと、カスタム チェーンのポリシーは RETURN のみであるため、ポリシーの設定はサポートされていません。つまり、子チェーンのルールが一致しない場合は、親チェーンに戻って一致を続行します。 1.5 iptables の概要 このセクションでは、iptables の機能と使用方法について簡単に説明します。概要は次のとおりです。 1. iptables はルールを一致させてパケットの宛先を決定します。ルールは一致する条件 + アクションで構成され、ルールは -I と -A を通じて挿入されます。 2. 5 つのチェーンと 5 つのテーブル。 5 つのチェーンは、PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING です。 5 つのテーブルは、raw、mangle、nat、filter、security です。チェーン、リスト、ルールはすべて順序付けられています。 3. チェーン内のすべてのルールが一致しない場合、iptables はチェーンによって設定されたデフォルトのポリシーに従ってパケットを処理します。ポリシーは「ACCEPT」に設定されています。 DROP に設定することはお勧めしません。 4. サブチェーンを作成し、内蔵チェーンに掛けることができます。サブチェーンのポリシーは RETURN であり、構成をサポートしていません。 5. マッチング条件には、基本マッチング条件と拡張モジュールによって提供される拡張マッチング条件が含まれます。拡張一致条件は -m パラメータを通じて読み込まれます。覚えておく必要がある拡張モジュールは、comment、tcp、udp、icmp、mac、state、physdev、set です。 6. 一般的な iptables アクション (ターゲット) は、ACCEPT、DROP、RETURN、LOG、サブチェーンへのジャンプです。 2. OpenStack セキュリティ グループの紹介 2.1 Neutron セキュリティ グループと Nova セキュリティ グループ OpenStack セキュリティ グループは当初、Nova を通じて管理および構成されていました。 Neutron の導入後、新しい OpenStack セキュリティ グループは Neutron を通じて管理され、関連付けられたオブジェクトは仮想マシンではなくポートになります。ページで仮想マシンをセキュリティ グループに追加すると、実際には仮想マシンのポートがセキュリティ グループに関連付けられます。 歴史的な理由により、Nova の一部のバージョンではセキュリティ グループ ルールを操作するための API がまだ保持されている場合がありますが、使用することはお勧めしません。セキュリティ グループ ルールは Neutron を通じて管理することをお勧めします。 2.2 セキュリティグループとファイアウォール OpenStack を初めて使用するユーザーの多くは、セキュリティ グループとファイアウォールの違いを区別できません。これは、どちらもネットワーク アクセス制御に使用され、コミュニティが iptables に基づいて実装しているためです。実際、この 2 つの違いはかなり大きいです。
2.3 セキュリティグループの使用法の概要 前述したように、セキュリティ グループは実際にはコレクションです。セキュリティ グループ ルールをこのコレクションに配置するのは理にかなっています。 Neutron は、security-group-create サブコマンドを通じてセキュリティ グループを作成します。パラメータはセキュリティ グループ名という 1 つの名前のみです。 ただし、Neutron によって作成された新しいセキュリティ グループは空のルール セキュリティ グループではなく、次の 2 つのデフォルト ルールが自動的に追加されます。 つまり、すべてのトラフィックのアクセスが禁止され、すべてのトラフィックの外出が許可されます。 セキュリティ グループを作成したら、セキュリティ グループにルールを追加できます。 Neutron は、security-group-rule-create サブコマンドを通じて作成されます。関係するパラメータは次のとおりです。
192.168.4.5 のみが仮想マシンの SSH ポート 22 にアクセスできるようにするセキュリティ グループ ルールを作成します。 セキュリティ グループとセキュリティ グループ ルールの作成は論理操作のみであり、iptables ルールは作成されないことに注意してください。対応する iptables ルールは、セキュリティ グループがポートに関連付けられている場合にのみ作成されます。 Neutron の port-update コマンドを使用してセキュリティ グループを関連付けます。たとえば、仮想マシンの UUID 38147993-08f3-4798-a9ab-380805776a40 をセキュリティ グループに追加するには、次のようにします。 セキュリティ グループ コマンドの操作パラメータは比較的複雑で、図に示すようにダッシュボードのグラフィカル インターフェイスから操作できます。 具体的な操作についてはここでは紹介しません。 3. セキュリティグループの実装原則の分析 3.1 仮想マシンのネットワークフローパス Linux ネットワーク仮想化は、Linux ブリッジと openvswitch (略して OVS) をサポートします。 OpenStack Neutron ml2 ドライバーは両方をサポートします。現在、ほとんどの人が OVS を使用しています。 ただし、初期の iptables は OVS ブリッジとポートをサポートしていませんでした。そのため、セキュリティ グループを実装するために、仮想マシンのタップ デバイスは OVS ブリッジに直接接続されません。代わりに、中間に Linux ブリッジが追加されます。 Linux ブリッジと OVS ブリッジは、veth ペアを介して接続されます。このようにして、Linux ブリッジに iptables ルールを追加して、セキュリティ グループ機能を実装できます。 現在、ほとんどの OpenStack 環境では上記のルールが引き続き適用されています。簡略化された仮想マシンのトラフィック パスは次のとおりです。 X、Y、Z は、仮想マシン ポート UUID の最初の 11 桁です。 3.2 セキュリティ グループ ルールはどの iptables チェーンに接続する必要がありますか? これまでの基盤に基づいて、セキュリティ グループの iptables ルールをフィルター テーブルに実装する必要があることは容易に推測できます。フィルター テーブルには、INPUT、FORWARD、OUTPUT の 3 つのチェーンのみが含まれます。 iptables ルールのフロー図は次のように簡略化できます。 ホスト ファイアウォールに取り組んだことがある人なら、セキュリティ グループ ルールが INPUT チェーンと OUTPUT チェーンに適用されるだろうと最初に考えるかもしれません。しかし、上記のフローチャートによれば、パケットが自分自身に送信されなければ、INPUT と OUTPUT にはまったく到達しません。したがって、セキュリティ グループ ルールを INPUT と OUTPUT に実装することはできないことは明らかです。したがって、セキュリティ グループの iptables ルールは FORWARD チェーンに実装する必要があります。つまり、コンピューティング ノードは仮想マシンのパケット (自身に送信されたパケットを除く) を処理せず、パケットの転送のみを担当します。 3.3 セキュリティグループルールの定義 その後のテストを容易にするために、IP アドレスが 192.168.100.10/24、ポート UUID が 3b90700f-1b33-4495-9d64-b41d7dceebd5 の仮想マシン int32bit-server-1 を事前に作成し、以前に作成した int32bit-test-secgroup-1 セキュリティ グループに追加しました。 まず、Neutron ポートに対応するこのコンピューティング ノードのすべてのタップ デバイスをエクスポートします。スクリプトは github int32bit/OpenStack_Scripts からダウンロードできます。 前回の分析によると、仮想マシン セキュリティ グループは、フィルター テーブルの FORWARD チェーンで定義されています。このチェーンのルールを確認してみましょう。 FORWARD チェーンは最初に neutron-filter-top サブチェーンにジャンプし、neutron-filter-top チェーンは neutron-openvswi-local にジャンプします。 neutron-openvswi-local チェーンは空のチェーンなので、親チェーンに FORWARD で戻ります。したがって、ここでの最初のルールは実際には役に立ちません。 FORWARD チェーンに戻った後、2 番目のルールが一致し、チェーンは neutron-openvswi-FORWARD にジャンプします。このチェーンのルールを確認してみましょう。 このチェーンには 4 つのルールがあります。最初のルールと 2 番目のルールに対応するタップ デバイスは dhcp ポートと router_interface ポートであり、これは DHCP とゲートウェイのポートが通過を許可されていることを意味します。 そして、tap3b90700f-1b は明らかに仮想マシン ポートに対応するタップ デバイスです (名前は tap+portUUID の最初の 11 ビットです)。 3 番目と 4 番目のルールは、このタップ デバイスに出入りするすべてのパケットが、処理のためにサブチェーン neutron-openvswi-sg-chain に入ることを示しています。 neutron-openvswi-sg-chain ビュー チェーンの表示を続けます。 ルールから次のことがわかります。
明らかに、neutron-openvswi-i3b90700f-1 と neutron-openvswi-o3b90700f-1 は、それぞれセキュリティ グループの受信ルールと送信ルールに対応します。つまり、仮想マシンの受信ルール チェーンは neutron-openvswi-i + ポート プレフィックスであり、仮想マシンの送信ルール チェーンは neutron-openvswi-i + ポート プレフィックスです。 3.4 セキュリティグループアクセスルール 3.3 からは、セキュリティ グループ アクセス ルール チェーンが neutron-openvswi-i3b90700f-1 であることがわかります。チェーンルールを確認してみましょう: ルールは全部で6つあります。
セキュリティ グループ アクセスの 1 番目、2 番目、3 番目、5 番目、6 番目のルールが固定されています。新しいセキュリティ グループ ポリシーがある場合は、4 番目のルールの後に追加されます。 3.5 セキュリティグループ訪問ルール 3.3 からは、セキュリティ グループ アクセス ルール チェーンが neutron-openvswi-o3b90700f-1 であることがわかります。チェーンルールを確認してみましょう: ルールは全部で 8 つあります。
3.6 セキュリティ グループ セキュリティ グループを一致条件として使用する セクション 2.3 で説明したように、セキュリティ グループは、送信元または宛先として IP アドレス セグメントを使用する一致条件をサポートするだけでなく、別のセキュリティ グループを指定することによる一致条件もサポートします。この状況にどう対処すればいいのでしょうか? テスト用に、新しいセキュリティ グループ int32bit-test-secgroup-2 と新しい仮想マシン int32bit-server-2 (192.168.100.7) を作成し、int32bit-server-2 をセキュリティ グループ int32bit-test-secgroup-2 に関連付けました。 同時に、int32bit-test-secgroup-1 に受信ルールを追加して、int32bit-test-secgroup-2 に関連付けられた仮想マシンがポート 8080 にアクセスできるようにします。 仮想マシンのアクセス ルール チェーン neutron-openvswi-i3b90700f-1 を確認します。 4 という番号の新しいルールが挿入されていることがわかります。このルールは、set 拡張モジュールを使用します。前述したように、set は ipset と一致させるために使用されます。次のパラメータ NIPv4fc83d82a-5b5d-4c90-80b0- は ipset 名であり、明らかに NIPv4 + セキュリティ グループ UUID プレフィックスで構成されています。 ipsetを確認しましょう: 192.168.100.7 が ipset セットに含まれていることがわかります。 したがって、OpenStack セキュリティ グループがセキュリティ グループを一致条件として使用する場合は、ipset を通じて実装されます。各セキュリティ グループは ipset セットを作成し、関連付けられた仮想マシンの IP がこのセットに配置されます。 iptables は、ipset マッチングを通じてセキュリティ グループ マッチング機能を実装します。 4. セキュリティグループのアンチスヌープ機能 上記のセクション 3.5 で説明した 2 番目のルールでは、すべてのパケットは最初に neutron-openvswi-s3b90700f-1 サブチェーンに入り、処理されます。このチェーンは何に使われるのですか? まずルールを見てみましょう: このチェーンの処理ロジックは非常にシンプルです。 IP アドレス 192.168.100.10 および MAC アドレス FA:16:3E:A0:59:BA のパケットのみを通過させます。これは実際には、Neutron でデフォルトで有効になっているアンチスヌープ機能です。 Neutron ポートによって割り当てられたものと一致する IP アドレスと MAC アドレスのみが通過できます。つまり、IP 192.168.3.1 で仮想マシンをセットアップし、その後ネットワーク カードの IP を手動で 192.168.3.2 に変更すると、確実に通過できなくなります。 ただし、当社のビジネスでは仮想 IP の需要が頻繁にあり、最も一般的なものは haproxy と pacemaker VIP です。 OpenStack はこの要件を考慮し、ポートの許可されたアドレス ペアの構成を通じてユーザーがホワイトリストを追加できるようにサポートします。 たとえば、IP アドレスが 192.168.0.10 と 192.168.0.11 の 2 つの仮想マシンがあるとします。これら 2 つの仮想マシンの VIP としてポート 192.168.0.100 を申請しました。 Neutron を通じてポート情報を更新できます。 追加したら、neutron-openvswi-s3b90700f-1 チェーンルールを確認しましょう。 IP 192.168.0.100 のパケットを通過させるルールが先頭に追加されていることがわかります。このとき、仮想マシン 192.168.0.10 の IP を 192.168.0.100 に変更すると、ping も成功します。 5. 仮想マシン経由でホストマシンにアクセスするにはどうすればよいですか? セキュリティ グループがフィルター テーブルの FORWARD チェーンに実装されていることはすでにわかっています。ただし、仮想マシンのパケットがホストマシン宛ての場合、カーネルは宛先アドレスが自分自身であると判断するため、FORWARD チェーンには流れず、INPUT チェーンに流れます。これはセキュリティ グループのルールをバイパスするのではないですか? 解決策は非常に簡単です。 neutron-openvswi-o3b90700f-1 を INPUT チェーンに再度接続するだけです。 INPUT チェーンのルールを見てみましょう。 今すぐ: ホストから仮想マシンに送信されるパケットに何か問題が発生するのだろうかと疑問に思う人もいるかもしれません。 OUTPUT チェーンにルールを追加する必要がありますか?答えは「いいえ」です。OUTPUT から直接出力して、通常のプロセスに従うことができるためです。 6. まとめ この記事では、まず iptables について簡単に紹介し、次に OpenStack セキュリティ グループを紹介し、最後にセキュリティ グループの実装原則を詳細に分析します。 また、コンピューティング ノードで実行する必要がある仮想マシンの iptables ルールをすばやくエクスポートできるスクリプトも作成しました。 Fu Guangping は銀行のクラウド技術管理センターに勤務し、クラウド コンピューティング関連技術の研究を担当しています。北京郵電大学を卒業し、2013年からOpenStack関連の仕事に従事し、OpenStack Nova、Cinder、Osloなどのプロジェクトのコミュニティ開発に参加しました。 |
<<: 2020 年のクラウド コンピューティング開発における 5 つの主要トレンド
>>: 数十億のリクエストと高可用性を備えた Redis (codis) 分散クラスターの秘密を簡単に紹介します。
中国語版ウィキペディアのドメイン名zh.wikipedia.orgは5月19日にキーワードとDNS汚...
Stablehost は、非常に評判の良い中小規模のホスティング プロバイダーです (10 人の運用...
SEO 最適化に関しては、キーワードについて言及することは避けられません。 SEO 最適化に関しては...
著者は現在、ドライクリーニング店のウェブサイトの最適化に取り組んでいます。初心者としては、上位にラン...
世界的に有名なデータセンターであるZenlayerは、フィリピンのマニラに独自のデータセンターを持ち...
大学の学期が始まり、春でもあります。Onetechcloud は、すべての VPS を最大 20% ...
最近、新旧ブランドの比較写真を見ました。写真のタイトルは「業界初になるまでに何年かかったか?」でした...
月収10万元の起業の夢を実現するミニプログラム起業支援プランアップデートのヒント?それはきっと嘘です...
cmivps は現在、香港 CN2 VPS および米国トリプルネットワーク AS4837 ライン V...
「フレンズ」の主演俳優たちが17年ぶりに再集結。このニュースは世界中の同番組ファンにとって新年のニュ...
vsysは2009年に設立されたウクライナの企業です。主にオフショアVPSとオフショアサーバー(独立...
2010 年 7 月 1 日、Baidu Alliance は中小規模の URL とのトラフィックの...
中国新聞社、9月22日:中国のインターネットにとって、2013年の中秋節は平和なものではなかった。テ...
ニュース速報:9月27日早朝、「二重節」の連休まであと2日となったとき、北京で働く小林さん(仮名)は...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますソフトウェ...