我希望我的 Linux 路由器/互联网网关 192.168.80.1 在通过 LAN 发出请求时将端口 9091 转发到 192.168.80.15:9091。我还希望我的路由器将端口 9091 上来自 WAN 的请求转发到 192.168.80.15:9091。
第二部分我已经成功完成了,第一部分也基本完成了,使用
iptables -A PREROUTING -p tcp -m tcp --dport 9091 -j DNAT --to-destination 192.168.80.15:9091
iptables -A POSTROUTING -d 192.168.80.15/32 -p tcp -m tcp --dport 9091 -j SNAT --to-source 192.168.80.1
按照最佳答案在这里。但是,这仅在我将 FORWARD 策略设置为 ACCEPT 时才有效。我想将转发策略保留为 DROP,并为我转发的流量创建特定例外。
我试过了
iptables -A FORWARD -p tcp --dport 9091 -j ACCEPT
它将流量传递到 192.168.80.15:9091,但从 192.168.80.15 到 192.168.80.1 的响应返回到另一个端口,我认为被丢弃了。我该如何制定一条规则,在允许我想要的流量的同时保持相对安全?我玩过 conntrack,但到目前为止还没有成功。
更新:
我知道还有一种称为发夹式 NAT 的替代方法。如果这是一种更好的方法,我愿意接受争论,但我应该注意,目前bind
在我的网关/路由器上配置为,对于我的 LAN 上的客户端,我的域名解析为 192.168.80.1(而在外部,它解析为网关的公共 IP)
最终,我希望 mydomain.com:9091 能够访问相同的服务,无论请求来自 LAN 还是 WAN。
答案1
数据包必须经过您的路由器,因此它们必须经过 FORWARD 链。
实现此目的的简单方法是使用此命令:
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT
无论如何,NAT(SNAT 或 DNAT)都需要连接跟踪才能工作,因此它甚至不会增加太多开销,您不必担心特定的规则。
答案2
使用
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,DNAT -j ACCEPT
它将涵盖
iptables -A FORWARD -p tcp --dport 9091 -j ACCEPT
你猜对了
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT
从上一个答案可以看出,这是允许通过路由器返回流量所必需的。
缺点是 - 该规则将允许任何通过路由器进行 DNAT 的流量。根据您的策略,这可能会或可能不会被视为不安全。