我们有一台服务器,其中 /31 和 /24 位于不同的 /8 中,并静态路由至该服务器。我们在与 /31 相同的 /24 中有一个网关。
到 /24 中的 IP 的传入连接按预期工作,但我们无法发起传出连接。我们的“黄金标准”测试是(此时使用 IP 来避免 DNS 问题):
curl --interface SOME_IP_IN_THE_24 -v -H 'Host: httpbin.org' 34.230.136.58/ip
我们使用的是 Ubuntu 16.04,并且我们已将 eno1 配置为 /31 之一,将 eno1:1 配置为另一个 /31,将 eno1:2 配置为 /24 中的一个 IP。当我们运行上述命令时,我们仍然会获取 eno1 的 IP。
答案1
故障排除
- 使用命令检查路由
ip route get <dst> from <SOME_IP_IN_THE_24>
。如果命令返回了意外的路由,请修复它。 - 使用 检查防火墙
iptables-save -c
。源地址可以被 NAT 规则覆盖。
答案
您的问题是由 MASQUERADE 规则引起的。任何源地址都会被重写为 IP 地址,您可以在路由的源属性中看到该地址,该地址已通过命令获取ip route get <dst>
。您可以使用tcpdump
和conntrack -E
命令来确认这一点。您可能还会看到此规则计数器的增加。
避免此行为的简单方法是在链顶部插入 ACCEPT 规则nat/PREROUTING
。更改防火墙规则集的更好方法是使用iptables-save
/iptables-apply
命令。您的nat/PREROUTING
链应如下所示 ( iptables-save -t nat
):
# Generated by iptables-save v1.6.2 on Thu Jul 4 19:05:27 2019
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING --src <LOCAL-IP-1> -j ACCEPT
-A POSTROUTING --src <LOCAL-IP-2> -j ACCEPT
...
-A POSTROUTING --src <LOCAL-IP-N> -j ACCEPT
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Thu Jul 4 19:05:27 2019