来自具有多个 IP 的服务器的传出连接

来自具有多个 IP 的服务器的传出连接

我们有一台服务器,其中 /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>。您可以使用tcpdumpconntrack -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

相关内容