将所有 TCP 流量从端口路由到另一个主机:端口

将所有 TCP 流量从端口路由到另一个主机:端口

10.0.1.1我有一个wireguard配置,在远程服务器( )和我的本地计算机( )之间创建VPN 10.0.1.2,以便服务器可以到达本地计算机,反之亦然。

我希望服务器将端口上的所有传入 TCP 连接路由8000到我的本地计算机。

我尝试过的:

这个答案:

iptables -t nat -I PREROUTING -p tcp --dport 8000 -j DNAT --to-destination 10.0.1.2:8000
iptables -t nat -I POSTROUTING -p tcp --dport 8000 -d 10.0.1.2 -j MASQUERADE

还有这个答案(quora):

iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to-destination 10.0.1.2:8000
iptables -t nat -D POSTROUTING -j MASQUERADE

还尝试过这个:

iptables -t nat -A POSTROUTING -p tcp -d 10.0.1.2 --dport 8000 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to-destination 10.0.1.2:8000

它们都不起作用(无法通过互联网访问)。

当然,我可以设置一个nginx服务器来做到这一点,但是,它不会像我希望的那样可靠和强大(例如 websocket 连接)。

VPN 连接和防火墙工作正常:我可以curl从远程服务器的 shell 访问本地计算机上的服务器,也可以访问在远程服务器8000端口上启动的 HTTP 服务器。也是。sysctl net.ipv4.ip_forward1

答案1

您还没有描述是否正在运行其他可能控制表的工具;例如firewalld。这些可能会阻止您的规则发生。

我也没有看到你谈论FORWARD主表中的规则。

我没有看到完整的 iptables 列表;您可能有其他规则跳转到链中较早的 DROP 或 REJECT,这些规则在您的 NAT 规则之前生效。

(我更详细地描述了如何在 RHEL 7 上构建自己的防火墙,网址为https://www.sweharris.org/post/2017-05-07-home-grown-router/ - 这是一个快速总结)

一般来说,如果从零开始,在开始 NAT 之前,需要设置主表。 INPUT 链适用于以您的计算机为目标的数据包,OUTPUT 链适用于源自您的计算机的数据包,FORWARD 链适用于数据包穿越你的机器。

就我而言,我将所有三个设置为相同

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP

您可能还需要允许启动流量。

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i internal_interface -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A FORWARD -i internal_interface -j ACCEPT
iptables -A FORWARD -i external_interface -m conntrack --ctstate DNAT -j ACCEPT

我使用“external_interface”,它可能是一个接口,例如VPN,eth0或者是一个隧道tun0,甚至是一个网桥(这就是我使用的)。

这允许“内部”的流量到达外部并允许外部做出响应。

现在我们可以开始 NAT,允许“内部”机器访问“外部”

iptables -t nat -A POSTROUTING -o external_interface -j MASQUERADE

这会导致所有离开本地网络并前往外部世界的流量都被 NAT 到外部接口的地址。

现在,您可以开始允许来自外部的流量到达防火墙后面的内部计算机,其规则类似于您已经尝试过的规则。

例如

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.2:443

其中一些规则并不是严格必要的,但在它们之间,我们可以过滤畸形数据包、内部到达外部(以及外部响应)的能力以及外部通过端口转发到达内部特定服务的能力。

相关内容