これを行う適切な方法は、発信パケットに使用するインターフェイスにbind()することです。その後、ip routeおよびip ruleコマンドを使用してルートを設定し、発信インターフェイスに基づいてパケットのルーティング方法を制御できるためです。私の例では、次のネットワークを想定しています。
- eth0:
- アドレス:192.168.0.2/24
- デフォルトゲートウェイ:192.168.0.1
- eth1:
- アドレス:192.168.1.2/24
- デフォルトゲートウェイ:192.168.1.1
2つのルーティングテーブルを作成します。1つはalternateというeth0の発信トラフィック用で、もう1つはmainというeth1用のテーブルです。ルーティングテーブルmainは常に存在し、routeand ip routeコマンドで使用される通常のテーブルです。ほとんどの人が他のテーブルを扱うことはありません。alternateというテーブルを作成するには、次の行をに追加します/etc/iproute2/rt_tables。
10 alternate
テーブルmainのデフォルトの優先順位は254です。ルーティングテーブルが有効になっているルールは、ip ruleコマンドによって制御されます。デフォルトでは、このコマンドは、次のような既存のルールのリストを出力します。
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
これは基本的にlocal、自分のIPアドレスなどのローカルルート用にカーネルが保持する特別なテーブルであるテーブル内のルートを検索することを示しています。次に、メインのテーブルとデフォルトのテーブルを試します。テーブルのデフォルトは通常空白なので、mainに一致するものがない場合、ホストへのルートはありません。最初に、eth0の規則でテーブルを交互に埋めます。
sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1
通常、alternateテーブルはテーブルと同じように見えmainます。唯一の違いは、ルーティングが異なる場合です。すべてのNFS、HTTPなどのトラフィックがeth1のネットワーク宛であっても、eth0のデフォルトゲートウェイを経由するようにしたい場合は、上記の2行目を含めたくない場合があります。次のステップでは、この代替ルーティングテーブルをいつ使用するかのルールを追加します。
sudo ip rule add from 192.168.0.0/24 pref 10 table alternate
このルールは、192.168.0ネットワーク上のアドレスからのトラフィックalternateは通常のmainテーブルではなくルーティングテーブルを使用することを示しています。最後のステップは、eth0バインドを使用する必要があるすべてのクライアントを確認することです。ではwget、例えば、設定--bind-address=192.168.0.2、NFSのために設定clientaddr=192.168.0.2マウントオプション。LibWWWをPerlで使用している場合、LWP :: UserAgentでlocaladdrオプションを設定して、バインド先のローカルインターフェイスを制御できます。バインディングを制御できないクライアントが存在する場合、ソースのコンパイルはオプションではありません。iptablesルールを使用してそのアドレスを変更できる場合がありますが、これはハッキングであり、機能しない可能性があります。natテーブルまたはmangleテーブルのPREROUTINGチェーンにSNATルールを設定する必要があります。これを機能させるには、上記の変更されたルーティングテーブルが必要です。
iftopおり、それぞれが適切な種類のトラフィックを示しています。どうもありがとうございます。