如果我将接口名称传递给curl,一切都会按预期工作:
$ 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 地址时,似乎返回了错误的接口(eth0,而不是 eth1):
$ 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 过滤和高级路由,为每个网络接口提供自己的路由表以及自己的默认网关。链接的问题对所需的配置进行了更详细的讨论。
这弱宿主模型和强大的主机模型有两种可供选择的 IP 协议栈设计原则: Linux 默认使用弱主机模型,主要是因为它对每个数据包需要的操作较少,因此在常见用例中可以表现更好。