Linux iptables ssh端口转发(Martian拒绝)


12

我有一个为我的家庭网络执行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内核中的火星数据包拒绝有关:

iptables,如何从环回重定向端口?

我已启用日志记录难者并确认内核将这些数据包作为难者而拒绝。除了它们不是:我确切地知道这些数据包是做什么用的,它们来自何处以及要去往何处(我的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

由于我没有使用环回,因此可以解决火星人拒绝的问题。

我仍然在此发布问题,原因有两个:

  1. 希望将来尝试进行类似操作的用户可以在搜索中找到此内容,并且此变通办法可能会对他们有所帮助。
  2. 我仍然更喜欢保持ssh端口转发连接仅绑定到环回并能够通过iptables路由到它们的想法。既然我确切地知道这些数据包是什么以及它们的去向,我是否应该以某种方式将它们标记为此类,以便Linux火星过滤不会拒绝它们?我在该主题上进行的所有搜索都导致产生rp_filter,这对我的测试完全没有帮助。即使它确实起作用,也不是我要允许的确切数据包专用。

我有兴趣将我的问题和解决方法贡献给一般搜索,以节省其他人为避免死胡同而花费的搜索时间,并希望有人回答我的问题的回送/火星人部分仍然保持开放对我来说。


在进一步阅读有关UL vs SF的元文章时,我还注意到Michael提出的不要交叉张贴的要求。我只是交叉张贴了这个问题,因为它在SF上被专门标记为脱题,因此,如果更合适和可行的办法是仅移动原始问题并关闭此问题,那也将很棒。
标记

net.ipv4.conf.default.rp_filter = 0和net.ipv4.conf.all.rp_filter = 0放在/etc/sysctl.conf中并执行“ sudo sysctl -p”是否可以解决您的问题?
Rui F Ribeiro 2015年

我试图直接应用这两个,即。'sysctl net.ipv4.conf.default.rp_filter = 0',还包括一个用于我特定的专用接口的文件。我已经确认它们是通过'sysctl -a'设置的,但是,火星数据包127.0.0.1仍被拒绝。即使这样做可行,我也不希望向火星人开放所有接口。我什至也不想打开一个(albiet专用)界面。我确切地知道我想允许哪些火星数据包,并且希望/希望得到一个iptables NAT / mangle表达式来完成此任务。
标记

您可能希望net.ipv4.conf.default.rp_filter = 2和其他一些iptables规则
Rui F Ribeiro

Answers:


1

对127.0.0.1:5000进行DNAT的问题在于,当远程端做出响应时,这些数据包将返回到路由引擎,就好像它们是本地发出的(来自127.0.0.1)一样,但是它们具有外部目标地址。匹配外部接口的SNAT / MASQUERADE会捕获它们并重写它们,但是必须首先确定要使数据包到达该接口的路由决策,并且它们不允许这些默认情况下为假的数据包。路由引擎无法保证您会记得以后再进行重写。

相反,您应该能够做的就是使用源地址规范!之前的参数拒绝iptables INPUT上与192.168.1.1:5000的任何外部连接,而不是那些来自192.168.1.10的连接-s。如果将TCP重置用作拒绝机制(-j REJECT --reject-with tcp-reset,而不是默认的ICMP目标不可达),则与在外部环境下什至没有监听该address:port组合的情况基本相同。


0

我将使用openVPN创建从路由器到RemoteGateway的隧道。

然后,我将在路由器上添加一条路由:

路由添加-host RemoteTarget gw RemoteGateway-VPNaddress

使用简单的iptables规则来限制Source可以访问的端口。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.