为什么我可以 ping 我服务器的不同网络接口的 IP?

Why can I ping the Ip of a different Network Interface of my server?

我的本地机器 (10.0.0.2/16) 直接连接到服务器的 eth4 网络接口。 连接按预期工作,我可以跟踪 eth4 的 ip,即 10.0.0.1。 但是,我也可以跟踪另一个接口eth5)的ip 10.1.0.23,即使它是开启的错误的子网!

在下面你会看到我的本地机器和我的服务器的设置。

在我的本地机器上(Arch Linux)

ip addr 的输出:

....
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 3c:97:0e:8a:a1:5a brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/16 brd 10.0.255.255 scope global enp0s25
   valid_lft forever preferred_lft forever
inet6 fe80::7a0b:adb3:2eef:a3a8/64 scope link 
   valid_lft forever preferred_lft forever
....

跟踪路由

% sudo traceroute -I 10.0.0.1
traceroute to 10.0.0.1 (10.0.0.1), 30 hops max, 60 byte packets
 1  10.0.0.1 (10.0.0.1)  0.184 ms  0.170 ms  0.163 ms

% sudo traceroute -I 10.1.0.23
traceroute to 10.1.0.23 (10.1.0.23), 30 hops max, 60 byte packets
 1  10.1.0.23 (10.1.0.23)  0.240 ms  0.169 ms  0.166 ms

在服务器上 (Debian)

我的/etc/network/interfaces.

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#iface eth5 inet dhcp
auto eth5
allow-hotplug eth5
iface eth5 inet static
    address 10.1.0.23 
    netmask 255.255.0.0  
    gateway 10.1.0.1


## Automatically load eth4 interface at boot 
auto eth4  
allow-hotplug eth4
# Configure network interface at eth4 
iface eth4 inet static
    address 10.0.0.1 
    netmask 255.255.0.0  
    gateway 10.0.0.1

ip addr 的输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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 
       valid_lft forever preferred_lft forever
...
6: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:08:a2:0a:e8:86 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/16 brd 10.0.255.255 scope global eth4
       valid_lft forever preferred_lft forever
    inet6 fe80::208:a2ff:fe0a:e886/64 scope link 
       valid_lft forever preferred_lft forever
7: eth5: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 00:08:a2:0a:e8:87 brd ff:ff:ff:ff:ff:ff
    inet 10.1.0.23/16 brd 10.1.255.255 scope global eth5
       valid_lft forever preferred_lft forever

ip route 的输出:

default via 10.1.0.1 dev eth5 
10.0.0.0/16 dev eth4  proto kernel  scope link  src 10.0.0.1 
10.1.0.0/16 dev eth5  proto kernel  scope link  src 10.1.0.23 

您为什么不期望这种行为。正如您从 Debian 服务器的路由表中看到的那样,它知道如何将数据包路由到您的 arch linux 机器,因此它可以根据需要进行响应。 我可以看出您可能有两个可能的问题:

  • 为什么选择响应?

您还没有给我们您的防火墙规则,或者告诉我们您的服务器是否启用了 ip_forwarding。即使没有启用 IP 转发,Linux 也会将本地接收到的任何本地地址的数据包视为 INPUT 数据包(根据 iptables 和访问控制决策),而不是转发的数据包。因此即使禁用转发它也会响应。 如果你不想要这种行为,你可以将 iptables 规则添加到 INPUT 链以丢弃服务器上接收到的数据包。

  • 为什么traceroute只有一跳

您可能期望为了响应,数据包需要遍历(转发),因此您会在跟踪路由中获得两跳,一跳用于 eth4,一跳用于 eth5。但是,如上所述,如果任何本地接收的 ppacket 与本地 IP 之一匹配,则将被视为输入。您的 arch linux 框可能使用 Debian 服务器作为其默认路由。因此,它发送一个带有 Debian 服务器地址 MAC 的数据包,希望 Debian 服务器转发它。这使它成为 Debian serevr 以太网级别的本地接收数据包。服务器然后 cehcks teh IP 地址,发现它是本地的,不关心它是另一个以太网,并在 IP 层本地接收它。 如果您不希望出现这种行为,请修复防火墙规则。