0

这是情况。我们的 Intranet 192.168.1.0/24 上有多个服务器,其中一个是所有服务器的默认网关,并有两个接口($GATEWAY_INTERNAL_IP 和 $GATEWAY_EXTERNAL_IP)。

我们还有另一台服务器 PUBLICHOST2,它有两个 IP 以及 $PUBLICHOST_EXTERNAL_IP 和 $PUBLICHOST_INTERNAL_IP。

我们有第三台服务器 SERVER,它只有一个 IP $PRIVIP 并绑定在端口 $PORT 上。

我们想要的是能够将 $PUBLICHOST_EXTERNAL_IP 上的端口 $PORT 转发到 $PRIVIP 上的主机 SERVER。

但是当我们在 PUBLICHOST2 上使用 iptables 进行端口转发时,SERVER 收到请求但响应通过网关并且连接不成功。

我们如何正确地进行设置,以便响应可以通过 PUBLICHOST2 返回?

谢谢

4

3 回答 3

1

您可能需要为接口设置转发。试试 tne 命令。

sysctl -w net.ipv4.conf.eth0.forwarding=1

如果您需要其他帮助,请查找有关 routeback 或Shorewall FAQ的文档。

于 2011-07-06T02:17:20.107 回答
0

那么这里会发生什么:

  • Client1 向 PublicHost 发送请求
  • 请求到达,iptables 规则将流量 (PAT) 重定向到正确 AppPort 上的服务器
  • 服务器向 Client1 发送回复,该回复将由网关路由
  • 网关正在做 NAT 并用自己的 IP 替换源 IP
  • Client1 或 Client1sGateway 接收到以 Gateway 为源的 IP 数据包,但它在 IP 数据包的源字段中期望 PublicHost 的 IP。
  • 最终,Client1 将 SYN/ACK(除非您使用 synproxy)重新发送到 PublicHost,然后在任何与网络相关的计时器到期时断开连接。

现在,如果你想解决这个问题,你应该将所有从服务器传出的 TCP 流量和一个 AppPort 的源端口路由到 PublicHost。

如果这不起作用,则 PublicHost 配置不正确。请务必使用 tcpdump 测试配置。

于 2011-07-06T02:30:38.590 回答
0

我一直在尝试做类似的事情。在运行了一堆似乎从来没有工作过的教程之后,直到我 Wireshark 连接发现目标地址仍然设置为外部 IP 地址(就像你描述的那样),我尝试使用 POSTROUTING 链来更改源IP地址到服务器的IP地址:

iptables -t nat -A POSTROUTING -p <tcp/udp> --dport <destination_port> -j SNAT --to <$PUBLICHOST_INTERNAL_IP>

添加该规则后,连接被转发到专用网络,响应数据包沿同一路径返回客户端,而不是通过网络网关。我不确定是什么允许响应数据包通过防火墙服务器返回,但我认为这是因为我在 INPUT 链上已经拥有允许建立连接的规则:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

使用此解决方案要牢记的是:如果您更改了防火墙服务器的内部 IP 地址,则需要更新上述 POSTROUTING 规则。(不用说,最好是防火墙服务器有一个静态分配的内部 IP 地址)。

于 2015-05-26T01:52:02.517 回答