proxmoxがインストールされており、アウトバウンド接続(eth0)が1つしかないサーバーがあります。
マシン間のネットワークを有効にするために、インターフェイス設定にブリッジ(vmbr0)を作成し、Proxmoxネットワークモデル(サブノードNAT)に従って設定しました。
ブリッジはIPを所有し、10.1.1.1
私の理解によれば、ローカルネットワークと外部ネットワーク間のゲートウェイとして機能します。
これを実現するには、サーバーで次の iptable ポリシーを実装します。
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all -- 10.1.1.0/24 anywhere
ACCEPT all -- anywhere 10.1.1.0/24
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 10.1.1.0/24 anywhere to:x.x.x.x
サーバーにインストールされ、ブリッジを介して接続されている仮想マシンの1つからGoogle DNSサーバーをpingすると、仮想ping 8.8.8.8
マシンはGoogle DNSサーバーからping結果を取得できるため、NATが機能しているようです。
(natは再びフルサブネット(10.1.1.0/24)を表します。)
これを行うと、ping -I vmbr0 8.8.8.8
しかしホストではpingコマンドが失敗します。この ping コマンドは、ブリッジ インターフェイスを使用して Google DNS サーバーを ping します。 POSTROUTINGポリシーを通じてGoogle DNSサーバーとも通信できると予想されます。
つまり、他のクライアントがブリッジをゲートウェイとして使用するとインターネットに接続できますが、インターフェイス自体が発信インターフェイスとして選択されている場合、パスを見つけることができません。
したがって、これは私の質問を引き起こします。インターフェイスを明示的に使用すると、ポストルーティングルールをスキップし、実際に問題のコンピュータでルーティングするための絶対エンドポイントと見なされますか?- in a sense: vmbr0 stays vmbr0 and never will be masqueraded to eth0 if you choose to ping over it -
答え1
man ping
、太字:
-I インターフェイス
インターフェイスは次のとおりです。住所またはインターフェース名。インターフェイスが次の場合住所、これは以下を設定します。ソースアドレス指定されたインターフェイスアドレスへ。インターフェイスが次の場合インターフェース名、これは以下を設定します。ソースインターフェース指定されたインターフェイスに。
ping -I vmbr0
問題は、システムが最終的に正しいインターフェイスを選択するのではなく、インターフェイスを強制的に使用することですping -I 10.1.1.1
。
また、特に差がなくてもnat/POSTROUTING
(下記参照)、いいえホストでコマンドが実行されるとルーティングが実行されるため、一部のチェーン(例filter/FORWARD
:)が適用されない可能性があります(ただし、nat/POSTROUTING
まだ適用されます。以下を参照)。代わりに、ホストでコマンドを実行すると、他の結果が表示される可能性があることに注意してください。ルーティング済みVM は、正しい ping コマンドを使用している場合は該当しない場合でも、ルールによって異なります。
これ一般ネットワークのNetfilterとパケットフローOUTPUT
回路図は、他のチェーンを通過した後もローカルプロセスから来るパケットは引き続き通過するため、nat/POSTROUTING
パケットがeth0
それを通過してもまだSNAT処理されることを示しています。これは以下を使用して行われます。ping -I 10.1.1.1 8.8.8.8
一方、強制インタフェースを使用している場合、ping -I vmbr0 8.8.8.8
実行すると、tcpdump
10.1.1.1vmbr0
から8.8.8.8までのARP要求が応答しないことがわかります。
最後の質問について:はい、強制ルーティングはパケットが正しい宛先に到達することを許可しません。vmbr0
SNAT/MASQUERADEは決して変装できません。パケットIP、インターフェイスではなく宛先へのパスに従って適用されます。