curl
は、理論的には--interface
オプションを使用してデフォルト以外のネットワークインターフェイスを使用できます。ただし、実際には機能しません。 2つのネットワークインターフェースeth0
とeth1
があります。それぞれが独自のルーターを介してインターネットに接続され、自動構成にDHCPを使用します。 eth0
IPがip0
で、eth1
IPがip1
であるとします。そこで、eth0
を介したデフォルト接続として/etc/sysconfig/network-scripts
を設定し、次のコマンドを実行します。
curl --url "http://ip-api.com/json"
実際の外部IPがip0
であることがわかるJSON応答を受け取ります。ここで、デフォルトのインターフェイスとしてeth1
ではなくeth0
を設定すると、同じコマンドでip1
が返されます。
ここで、eth0
をデフォルトIPとして再度設定し、次のコマンドを実行します。
curl --url "http://ip-api.com/json" --interface "eth0"
問題ありません。ip0
を返します。
そして最後に:
curl --url "http://ip-api.com/json" --interface "eth1"
次のエラーが発生します。
curl:(7)ホストに接続できませんでした
以前のテスト(eth1
がデフォルトのインターフェイスでした)からわかるように、eth1
には問題はありません。実際には非常に信頼性の高い有線接続であるため、この問題はネットワークの安定性の問題とは関係ありません。
私のルーティングテーブルは次のとおりです。
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.85.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1
192.168.182.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
169.254.0.0 0.0.0.0 255.255.0.0 U 1004 0 0 eth2
0.0.0.0 192.168.182.2 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 192.168.85.1 0.0.0.0 UG 1 0 0 eth1
Curlがデフォルト以外のインターフェイスで機能しない理由を誰かが説明できますか?
--interfaceオプションは、システム上のどのアドレスが送信元IPとして使用されるかを決定するために使用されます。ルーティングに関して魔法のように何も変更しません。
通常のシステムには、デフォルトゲートウェイが1つしかありません。 DHCPのみを使用して2つのポートを2つの異なるネットワークに単純に接続しても、マルチホームシステムが機能するわけではありません。インターフェイスの1つはインターネットに接続するために機能し、もう1つはサブネットに対してのみ機能します。あなたがしたようにバインドしようとすると、間違ったルーターを介してパケットを送信するだけです。
Linuxではこれを機能させることができますが、複数のルートテーブルと、使用するテーブルを定義するためのルールが必要です。このハウツーを参照してください。