由于服务器上有防火墙,我需要使用允许的源 IP 从主机(Slackware64 linux 14.2,内核 5.4)建立到它的所有连接,10.2.23.1在这种情况下。
主机上的 IP 地址:
$ ip a
[...]
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0d:b9:55:c1:c8 brd ff:ff:ff:ff:ff:ff
inet 10.2.22.7/28 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20d:b9ff:fe55:c1c8/64 scope link
valid_lft forever preferred_lft forever
7: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0d:b9:55:c1:c9 brd ff:ff:ff:ff:ff:ff
inet 10.10.16.166/30 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20d:b9ff:fe55:c1c9/64 scope link
valid_lft forever preferred_lft forever
8: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc htb state UP group default qlen 1000
link/ether 00:0d:b9:55:c1:ca brd ff:ff:ff:ff:ff:ff
inet 10.2.23.1/24 scope global eth2
valid_lft forever preferred_lft forever
inet 10.247.226.186/32 scope global eth2
valid_lft forever preferred_lft forever
inet6 fe80::20d:b9ff:fe55:c1ca/64 scope link
valid_lft forever preferred_lft forever
[...]
例如,使用 SSH,我想从本地 IP 10.2.23.1 连接到 10.0.4.16:
$ ssh -b 10.2.23.1 [email protected]
连接失败,因为 ssh 使用 10.247.226.186 作为源 IP,而不是应有的 10.2.23.1(通过 tcpdump 确认) - 并且服务器上不允许这样做。当然我可以在服务器上允许另一个IP,但我想知道为什么它不起作用。
我还编写了一个简单的 C 程序来证实这一点(实际上只是socket
到bind
10.2.23.1 和connect
... 事实上的任何地方)。程序运行,bind
功能没有错误,但源IP始终是10.247.226.186。
有谁知道为什么所有连接都使用另一个IP在eth2上?可能是 /32 网络掩码有问题吗?
谢谢。
编辑:添加了主机操作系统。
答案1
就像AB在评论中所说,这是主机上的NAT。这就是所有程序都能够绑定到 IP 但 tcpdump 显示不同 IP 的原因。