为什么在 CentOS 6 中,curl 不能与非默认网络接口一起使用?

Vit*_*lii 3 linux centos routing curl

curl理论上可以使用非默认网络接口及其--interface选项。然而,在实践中却行不通。我有 2 个网络接口eth0eth1. 每台设备都通过自己的路由器连接到互联网,并使用 DHCP 进行自动配置。可以说eth0IP 是ip0eth1IP 是ip1。因此,我eth0通过设置为默认连接/etc/sysconfig/network-scripts并运行以下命令:

curl --url "http://ip-api.com/json"
Run Code Online (Sandbox Code Playgroud)

我收到 JSON 回复,其中我看到实际的外部 IP 是ip0。现在我将其设置eth1eth0默认界面,并且相同的命令返回 me ip1

现在我eth0再次设置为默认 IP 并运行以下命令:

curl --url "http://ip-api.com/json" --interface "eth0"
Run Code Online (Sandbox Code Playgroud)

没问题,它返回ip0

最后:

curl --url "http://ip-api.com/json" --interface "eth1"
Run Code Online (Sandbox Code Playgroud)

导致以下错误:

卷曲:(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
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么curl 不适用于非默认界面?

Zor*_*che 5

--interface 选项用于确定系统上的哪个地址将用作源 IP。它不会神奇地改变路由的任何内容。

典型的系统只有一个默认网关。仅使用 DHCP 简单地连接两个不同网络的两个端口根本无法为您提供一个有效的多宿主系统。其中一个接口可用于连接互联网,而另一个接口仅适用于子网。尝试像您所做的那样进行绑定只会通过错误的路由器发送数据包。

在 Linux 上可以实现此功能,但它需要多个路由表以及定义要使用哪个表的规则。请参阅此说明。

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