ある特定のportあて(宛先IPは任意)のパケットのソースIPをラウンドロビン(ランダムでも、なにかをキーにしてhashとってばらけさせるとかでも良かったんだけど、最終的にラウンドロビンが簡単だったので)で変更する。アプリでやればいろいろ考えられるけど、そこには手を入れない。

という欲求が発生したので、例えばiptablesとかでなんとかできないかちょっと調べた。

結論としては、こんな感じでいけるようだ。以下例では3つのIPで振り分ける感じ。

1) そのパケットが出て行くインタフェースにIP aliasで使用する複数のIPアドレスをふっておく。
ifconfig eth0 192.168.0.101
ifconfig eth0:0 192.168.0.102
ifconfig eth0:1 192.168.0.103

2) でもって、こんな感じで iptables を設定(statistic を nth モードで使う)
iptables -t nat -A POSTROUTING -p tcp --dport 対象ポート -o eth0 -m statistic --mode nth --every 3 -j SNAT --to-source 192.168.0.101
iptables -t nat -A POSTROUTING -p tcp --dport 対象ポート -o eth0 -m statistic --mode nth --every 3 -j SNAT --to-source 192.168.0.102
iptables -t nat -A POSTROUTING -p tcp --dport 対象ポート -o eth0 -m statistic --mode nth --every 3 -j SNAT --to-source 192.168.0.103

statisticが使えないといけないので、最近のkernel(2.6.18以降かな?)じゃないとダメかも。

「Source IPをラウンドロビンで変更するような挙動をiptablesで頑張ってみる」への1件のフィードバック

コメントを残す