在 stack exchange 的网络工程中询问了这个问题,然后被重定向到这里。
我有几个服务器的配置如下
服务器1:
eno1: 127.15.0.1/16 scope global
eno2: 5.0.0.1/24
服务器2:
lo: 127.0.0.1/16 (it had /8. I changed the subnet mask using 'ip addr del 127.0.0.1/8 dev lo; ip addr add 127.0.0.1/16 dev lo')
eno2: 5.0.0.2/24
server1的eno1连接完全不同的L2网络,完全隔离。
两台服务器的 eno2 接口都连接到同一个 L2 网络。现在我必须从 server2 访问 127.15.0.1。
Server1 部署已久,但我无权更改任何配置。我不知道为什么有人使用 127.xxx 子网和作用域全局。不确定这是否是有效配置,但我必须忍受它。我对 server2 有完全控制权,我可以更改任何内容。
两台服务器都是基于 Linux 的。
5.0.0.1 <-> 5.0.0.2 之间的连接良好。
我的第一次尝试是在 server2 中添加一条路由,如下所示
ip r add 127.15.0.1/32 via 5.0.0.1 从 server2 ping 127.15.0.1。我在 server2 上的 tcpdump 中看到了 ping 请求和回复,但 ping 命令显示 100% 丢失。
我禁用了 rp_filters
sysctl.cnf:
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.lo.rp_filter=0
net.ipv4.conf.eno2.rp_filter=0
更新 sysctl.conf 后重新启动
然后我清除了 iptables。(iptables -F)
结果相同。我想可能是服务器 2 不喜欢使用 127.xxx 系列。所以我在服务器 2 上添加了以下规则
iptables -t nat -A OUTPUT -d 5.0.0.1 -j DNAT --to-destination 127.15.0.1
如果数据包的目的地是 5.0.0.1,则此规则应该将目标 IP 替换为 127.15.0.1。
从服务器 2 ping 5.0.0.1。Iptables 将目标 IP 替换为 127.15.0.1(在服务器 1 tcpdump 上确认了这一点)。服务器 1 回复了,但回复再次被丢弃。
此时我已经没有主意了。我关闭了 server1 进行维护,并将 127.15.0.1/26 替换为 192.168.1.1/16。在这种情况下,连接工作正常(有或没有 iptables)。现在的问题是,问题是否是由于使用 127.xxx 造成的?如果是,有办法解决吗?如果没有,我还可以尝试什么?
注意:此配置以前是有效的。我们最近丢失了 server2(它使用旧 Linux),我正在从头开始构建它。此外,Windows 不允许将 127.xxx 用于除环回之外的接口。不确定为什么 Linux 允许在非 lo 接口上使用它。也许有理由!
总结一下,我有以下问题:
- 当我们尝试配置 127.xxx 时,Windows 会直接拒绝配置,但 Linux 允许这样做,并且还具有全局范围。这有什么用例吗?
- 在这种情况下,server2 发送发往 127.xxx 的请求,而 server1 实际上正在发送回复。如果 127.xxx 只是主机内部,他们为什么甚至在链接上发送数据包??
答案1
Linux sysctl 标志位于
/sys/net/ipv4/conf/*/route_localnet
允许禁用此类数据包的合理处理。
route_localnet - 布尔值
路由时不将环回地址视为火星源或目标。这允许将 127/8 用于本地路由目的。默认为 FALSE
由于很少有理智的人会做这样的事情,所以现在这种方法可能有效,也可能无效(我几年前最后一次测试过这种方法)。
请指定任何为此目的保留(可能是本地链路,但不是主机内部)或拥有相关接口的 IP 空间。继续这种奇怪的设置只会导致更多的麻烦,特别是当存在简单的替代方案时。