curl
理论上可以使用非默认网络接口及其--interface
选项。然而,实际上它不起作用。我有 2 个网络接口eth0
和eth1
。每个都通过自己的路由器连接到互联网,并使用 DHCP 进行自动配置。假设eth0
IP 是ip0
,eth1
IP 是ip1
。因此,我将eth0
通过设置为默认连接/etc/sysconfig/network-scripts
并运行以下命令:
curl --url "http://ip-api.com/json"
我收到 JSON 回复,其中显示实际外部 IP 为ip0
。现在我将 设置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
--interface 选项用于确定系统上的哪个地址将用作源 IP。它不会神奇地改变任何有关路由的内容。
典型系统只有一个默认网关。仅使用 DHCP 简单地将两个端口连接到两个不同的网络根本无法为您提供一个有效的多宿主系统。其中一个接口将用于连接到互联网,另一个接口仅用于子网。尝试像您所做的那样进行绑定只会通过错误的路由器发送数据包。
在 Linux 上可以实现这一点,但它需要多个路由表,以及定义使用哪个表的规则。请参阅此操作指南。