为什么我可以 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 层本地接收它。
如果您不希望出现这种行为,请修复防火墙规则。
我的本地机器 (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 层本地接收它。 如果您不希望出现这种行为,请修复防火墙规则。