Iptables:来自另一台服务器的转发端口而不是网关

时间:2011-07-06 02:02:53

标签: iptables gateway portforwarding

情况如下。 我们的内联网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返回?

由于

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

这里发生了什么:

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

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

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

答案 2 :(得分:0)

我一直在尝试做类似的事情。在运行了一系列似乎永远无法工作的教程之后,我发现连接发现目标地址仍然设置为外部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地址,则可能是最好的。)