多数の KVM インスタンスをホストするシステムがあります。これらはすべて 1 つのブリッジ ( としますbrvirt
) に接続されており、このブリッジには も接続されています。このレイヤー 2 環境は、アドレス変更のために 172.16.10.0/24 を使用するプライベート ネットワーク上にあります。システムには、 (10.10.10.10) と(10.10.20.20) eth1
という 2 つのインターフェイスがあります。eth0
eth2
一般的に、外部接続はSNAT
のアドレスを介して提供されますeth0
(ホストのデフォルトゲートウェイもこのインターフェースから提供されます)。いくつかのシステムSNAT
、に接続されている 10.10.20.0/24 ネットワークに明示的な 1-1 ルールが必要ですeth2
。
POSTROUTING
これは、チェーンを実行してSNAT
アウトバウンド インターフェイスの選択がすでに行われているため、問題となります。カーネルは、すでにデフォルト ルートを選択しています (直接接続されたネットワーク以外への接続を想定)。つまり、SNAT
ルールによって送信元 IP アドレスが変更されると、パケットが間違ったレイヤー 2 ネットワークから発信されているため、ローカル ルーティング インフラストラクチャによってパケットがドロップされます。
これを回避する方法はあるでしょうか?私が本当にやりたいことは、POSTROUTING
チェーンの最後にあるパケットの送信元アドレスに基づいてルーティングを決定することです...しかし、それはPOSTROUTING
正当な理由で呼び出されます。
答え1
これは、単純なポリシーベースのルーティングで実行できます。
スキーマには一連のルールとルートが必要になります。
ip rule add from 172.16.10.X iif brvirt lookup 200
ip route add default via 1.2.3.4 src 4.3.2.1 dev ethY table 200
変数:
172.16.10.X = KVM's IP
200 = Example value for routing_table, has to be unique for each KVM
ethY = either eth0 or eth2
1.2.3.4 = Example Gateway on iface ethY
4.3.2.1 = Example Source-IP for each KVM
これにより172.16.10.X
、指定されたifaceから送信されたすべてのパケットがethY
、送信元アドレス4.3.2.1
もっと複雑な方法もありますfwmarks
が、この場合は必要ないと思います。
ルートは で確認できます: 。これにより、からip route get iif brvirt from 172.16.10.X 8.8.8.8
への接続にカーネルが使用するルートと出力デバイスが表示されます。172.16.10.X
8.8.8.8
あなたの質問への答えになれば幸いです。
ふー