使用 iptables 代理其他机器上的相同端口,使用单一接口

使用 iptables 代理其他机器上的相同端口,使用单一接口

如何iptables在 DMZ 机器上配置将端口 12345 转发到连接到同一路由器的另一台计算机?iptables这个工作用的工具不对吗?

我的路由器 DMZ 中有一个家庭服务器,它在端口 12345 上托管了一个服务。我已将该服务移至家庭网络中功能更强大的机器的端口 12345,并且ssh -fNR 12345:localhost:12345 <home-server>每次启动时都在运行。该服务正在运行自定义协议 - 即,我无法使用 HTTP 代理。

我发现的解决方案往往假设计算机运行iptables 路由器(两个接口等)。(例如:https://serverfault.com/a/140626/15756https://www.digitalocean.com/community/tutorials/how-to-forward-ports-through-a-linux-gateway-with-iptables, ETC)

从各种教程中尝试的命令:

  • iptables -A FORWARD -p tcp -d 192.168.1.5 --dport 12345 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
  • iptables -t nat -A PREROUTING -p tcp --dport 12345 -j DNAT --to 192.168.1.5:12345
  • 以上也与iptables -t nat -A POSTROUTING -j MASQUERADE
  • 以上内容,带iptables -A FORWARD -p tcp -d 192.168.1.5 --dport 12345 -j ACCEPT

答案1

就你的情况而言,“DMZ”设置实际上只不过是路由器上非常广泛的端口转发 (DNAT) 规则。如果你想要一个单身的端口转发到其他地方,通常您可以像平常一样简单地向路由器添加端口转发规则 - 它将优先于 DMZ 规则。

如果你的路由器允许这样做,你应该在路由器上执行此操作。通过简单地绕过它,不仅可以减少当前 DMZ 机器的负载,还可以避免下面描述的发夹问题。


你想要实现什么您的 DMZ 机器仍然与您的路由器的端口转发相同(即简单的 DNAT)。

但是由于您只有一个接口,因此您遇到的主要问题与从内部访问端口转发服务时遇到的“NAT 发夹”问题相同;只是情况正好相反。(您的路由器将数据包发送到 DMZ 计算机,但从另一台计算机接收数据包,并且没有任何匹配项。)

解决这个问题的方法通常还需要另外添加一条 SNAT(伪装)规则,这会导致目标机器认为所有连接都来自您的 DMZ 机器(原始源 IP 丢失)。


第二个问题是,目前还不知道 1)你的 DMZ 机器是否真的有 IP 路由(转发),即使已启用(您应该检查一下),2)它已经有哪些防火墙规则(您也应该检查一下——您提到添加规则,但没有提到检查或删除旧规则)。

无论它是一个接口还是两个接口,你仍然要求 DMZ 机器路由 IP 数据包,因此它应该具有net.ipv4.conf.all.forwarding 系统控制设置为 1。

iptables 规则保存在一个列表(链)中,从上到下进行检查。使用-A将规则添加到指定表/链的底部。您应该始终在你的当前的规则集(如图所示iptables-save或至少iptables [-t nat] -S),以确保规则的顺序正确等等。

网络不是黑匣子。您可以使用 Wireshark 或tcpdump看看哪些数据包进来,哪些数据包出去。也许你的 DMZ 机器已经正确地将所有这些数据包转发到另一个系统——但回复无法接通?这是另一个问题,需要不同的解决方案。

相关内容