カールにインターフェイス名を渡すと、すべてが期待どおりに機能します。
$ curl --interface eth1 http://example.com
<!doctype html>
<html>
<head>
<title>Example Domain</title>
...
インターフェイスアドレスを渡すとタイムアウトします。
$ curl --interface 192.168.26.100 http://example.com
curl: (28) Failed to connect to example.com port 80 after 130248 ms: Couldn't connect to server
私が使用しているソフトウェアは、インターフェイス名ではなくアドレスへのバインディングのみをサポートしているため、インターフェイスアドレスを使用してバインドできない理由を特定しようとしています。
何が起こりますか?ip addr
合計の出力は次のとおりですip route show
。
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether d8:3a:dd:5c:9d:77 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0
valid_lft 81459sec preferred_lft 81459sec
inet6 fe80::a62e:3721:980e:beeb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether ac:49:43:f8:eb:6e brd ff:ff:ff:ff:ff:ff
inet 192.168.26.100/24 brd 192.168.26.255 scope global dynamic noprefixroute eth1
valid_lft 81456sec preferred_lft 81456sec
inet6 2001:14bb:ae:e82:f00e:38ba:2b2e:6f7c/64 scope global dynamic noprefixroute
valid_lft 7192sec preferred_lft 3592sec
inet6 fe80::2b6f:a6fc:d642:10e3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
$ ip route show
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.100
default via 192.168.26.1 dev eth1 proto dhcp src 192.168.26.100 metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
192.168.26.0/24 dev eth1 proto kernel scope link src 192.168.26.100 metric 100
編集する:ip route get 192.168.26.100
関連する質問を見た結果、IPアドレスを使用すると誤ったインターフェイス(eth1ではなくeth0)が返されるようです。
$ ip route get oif eth1 to 8.8.8.8
8.8.8.8 via 192.168.26.1 dev eth1 src 192.168.26.100 uid 1000
cache
$ ip route get 192.168.26.100 to 8.8.8.8
8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.100 uid 1000
cache
この問題をどのように解決できますか?
答え1
複数のインターフェイスがある場合、デフォルトの動作は技術的に呼び出されます。弱いホストモデル: 発信パケットの送信元 IP アドレスは発信インターフェイスの選択には影響しません。これにより、現代のルーターが無視する傾向がある非対称ルーティングが発生します。
システムがあなたの期待に応えるには、次のものが必要です。システム構成強力なホストモデル:これを行うには、より厳格なARPフィルタリングと高度なルーティングを設定して、各ネットワークインターフェイスに独自のルーティングテーブルとデフォルトゲートウェイを提供する必要があります。リンクされた質問では、必要な構成について詳しく説明します。
これ弱いホストモデルそして強力なホストモデル2つの代替IPスタック設計の原則があります。 Linuxはデフォルトで弱いホストモデルを使用します。その理由は、主にパケットあたりの作業が少なくて済むため、一般的なユースケースでより良いパフォーマンスが得られるためです。