パスワードを忘れた? アカウント作成
7333906 journal
日記

mishimaの日記: 仮想化するときのブリッジにはフィルタリングを無効化しよう

日記 by mishima

あまりiptablesをいじらないなら問題は起きない。
でもこんな構成のとき。

[ PC ] -----> eth0 [ L/B ] br0 ----> [ REAL SERVER ]

PC から L/B に向けた通信に対し、L/Bが内部で DNAT をして、REAL SERVER に振り分けていたとする。
行きのパケットは意図したとおりに DNAT される。しかし、帰りのパケットはうまく PC に戻らない。なぜか。それはブリッジが複数の仮想イーサネットから構成されているからだ。

[ PC ] <----- eth0 [ L/B ] br0( vethXXX1 <---- vethXXX2 ) <---- [ REAL SERVER ]

vethXXX2 にパケットが入ってきた時点で DNAT の帰りのパケットの逆変換をして、パケットの送信元 IP アドレスを eth0 のアドレスに書き換えてしまう。
すると、vethXXX1 は「eth0 の IP アドレス」を送信元として持ったパケットを受け取ることとなる。 br0ではeth0のセグメントのパケットは受け取らないため、パケットはフォワーディングされることなく破棄されてしまう。
ブリッジの「中」で iptables が有効になっていることが原因といえる。

このことに気づかないと、4時間を無駄にするぞ!

無効にするためには/etc/sysctrl.d/mybridge.conf とかに次のように書いておく。

net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0
net.bridge.bridge-nf-call-arptables=0

↑だけだと再起動するまでは無効化されないので、すぐに無効化したい場合は echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables とか別途実行すること。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

読み込み中...