无需重定向即可通过服务器转发 ICMP

无需重定向即可通过服务器转发 ICMP

我需要通过使用 ICMP ping 等来测试网络中的 RTT 等网络特性。

这个问题很特别,因为我想强制每一个数据包通过需要像路由器一样工作的服务器,但不允许提出重定向。但这根本不可能,相反,我总是丢失主机之间的连接。

网络设置为(在“ip route”/路由表中)首先将所有数据包传递到服务器(IP:10.0.0.4),然后服务器将其发送回网关(IP:10.0.0.1)。从网关,它将被路由到正确的主机(IP:10.0.0.5 - 10.0.0.255)。

将来,这种情况将允许服务器改变网络中的所有数据包。

为了简化场景,仅设置了两个主机(10.0.0.5 和 .6)。然后为主机配置以下路由表(针对 10.0.0.5 显示):

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.0.1        0.0.0.0         UG    0      0        0 ens3
10.0.0.0        *               255.255.255.0   U     0      0        0 ens3
host-10-0-0-6.o host-10-0-0-4.o 255.255.255.255 UGH   0      0        0 ens3

对于服务器 10.0.0.4,路由表如下:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.0.1        0.0.0.0         UG    0      0        0 ens3
10.0.0.0        *               255.255.255.0   U     0      0        0 ens3

此时,所有设备的 iptables 都为空。此外,为了允许 IP 转发,服务器配置了/proc/sys/net/ipv4/ip_forward=1

通过此设置,我可以轻松地在两个主机之间 ping 通,输出如下(对于主机 10.0.0.6):

# ping 10.0.0.5
PING 10.0.0.5 (10.0.0.5) 56(84) bytes of data.
From 10.0.0.4: icmp_seq=1 Redirect Host(New nexthop: 10.0.0.5)
64 bytes from 10.0.0.5: icmp_seq=2 ttl=64 time=0.441 ms
64 bytes from 10.0.0.5: icmp_seq=3 ttl=64 time=0.405 ms

问题在于服务器立即发送 ICMP 重定向。这样,所有 ping 数据包都不再通过服务器。

我尝试了很多方法,包括修改 iptable 以删除重定向,以及使用以下命令更改 sysctl.conf 文件net.ipv4.conf.all.accept_redirects = 0net.ipv4.conf.all.send_redirects = 0(分别针对接口...conf.ens3....)

问题是,每次我禁用重定向时,就根本无法 ping 了(100% 数据包丢失)。

我怎样才能使这个(应该是)简单的场景发挥作用,意思是:我怎样才能每次都通过服务器路由所有数据包并返回?

答案1

你需要预防两个都服务器和路由器发送icmp 重定向到源主机。

如果它是思科路由器,“no ip redirects” 就会这样做。

在服务器上,取决于你的 Linux 版本,此链接包含所有版本的信息以及在 Linux 中禁用 ICMP 重定向的各种方法 http://www.itsyourip.com/Security/how-to-disable-icmp-redirects-in-linux-for-security-redhatdebianubuntususe-tested/comment-page-1/

相关内容