web-dev-qa-db-ja.com

CentOS 6のデフォルト以外のネットワークインターフェイスでcurlが機能しないのはなぜですか?

curlは、理論的には--interfaceオプションを使用してデフォルト以外のネットワークインターフェイスを使用できます。ただし、実際には機能しません。 2つのネットワークインターフェースeth0eth1があります。それぞれが独自のルーターを介してインターネットに接続され、自動構成にDHCPを使用します。 eth0IPがip0で、eth1IPが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がデフォルト以外のインターフェイスで機能しない理由を誰かが説明できますか?

1
Vitalii

--interfaceオプションは、システム上のどのアドレスが送信元IPとして使用されるかを決定するために使用されます。ルーティングに関して魔法のように何も変更しません。

通常のシステムには、デフォルトゲートウェイが1つしかありません。 DHCPのみを使用して2つのポートを2つの異なるネットワークに単純に接続しても、マルチホームシステムが機能するわけではありません。インターフェイスの1つはインターネットに接続するために機能し、もう1つはサブネットに対してのみ機能します。あなたがしたようにバインドしようとすると、間違ったルーターを介してパケットを送信するだけです。

Linuxではこれを機能させることができますが、複数のルートテーブルと、使用するテーブルを定義するためのルールが必要です。このハウツーを参照してください。

http://lartc.org/howto/lartc.rpdb.html

4
Zoredache