我有一个为我的家庭网络执行NAT的Linux网关。我有另一个网络,我想透明地将数据包转发到,但仅转发到特定IP /端口(或从特定IP /端口转发)。以下是一些可使用的IP和端口示例:
Source Router Remote Gateway Remote Target
192.168.1.10 -> 192.168.1.1 -> 1.2.3.4 -> 192.168.50.50:5000
我希望Source计算机能够与Remote Target上的特定端口进行通信,就好像它可以直接从Router路由一样。在路由器上,eth0是专用网络,eth1是面向互联网的。远程网关是我可以使用的另一台Linux计算机,它可以直接路由到远程目标。
我尝试一个简单的解决方案是在路由器上设置ssh端口转发,例如:
ssh -L 5000:192.168.50.50:5000 1.2.3.4
这对于Router现在可以正常工作,它现在可以本地连接到端口5000。因此,“ telnet localhost 5000”将按预期连接到192.168.50.50:5000。
现在,我想通过现在建立的ssh隧道重定向来自Source和渠道的流量。我为此尝试了NAT规则:
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000
由于路由器已经是我的NAT网关,因此它已经具有所需的路由规则:
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
这个站点或其他地方的大多数问答似乎都与转发服务器端口或发夹式NAT有关,我在其他地方都可以正常工作,但都不适用于这种情况。我当然可以通过远程网关DMZ转发远程目标端口,但是我不希望这些端口可以通过Internet访问,我希望它们只能通过安全的SSH隧道访问。
我能找到的最佳答案与Linux内核中的火星数据包拒绝有关:
我已启用日志记录难者并确认内核将这些数据包作为难者而拒绝。除了它们不是:我确切地知道这些数据包是做什么用的,它们来自何处以及要去往何处(我的ssh隧道)。
此处提供的“回旋处”解决方案适用于该原始问题,但不适用于我的情况。
但是,在编写/研究此问题时,我通过使用SSH源IP绑定来解决问题,如下所示:
ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000
由于我没有使用环回,因此可以解决火星人拒绝的问题。
我仍然在此发布问题,原因有两个:
- 希望将来尝试进行类似操作的用户可以在搜索中找到此内容,并且此变通办法可能会对他们有所帮助。
- 我仍然更喜欢保持ssh端口转发连接仅绑定到环回并能够通过iptables路由到它们的想法。既然我确切地知道这些数据包是什么以及它们的去向,我是否应该以某种方式将它们标记为此类,以便Linux火星过滤不会拒绝它们?我在该主题上进行的所有搜索都导致产生rp_filter,这对我的测试完全没有帮助。即使它确实起作用,也不是我要允许的确切数据包专用。
我有兴趣将我的问题和解决方法贡献给一般搜索,以节省其他人为避免死胡同而花费的搜索时间,并希望有人回答我的问题的回送/火星人部分仍然保持开放对我来说。