我的 iptables 重定向规则不起作用

我的 iptables 重定向规则不起作用

这是我的网络拓扑,101.101.101.101 和 202.202.202.202 是全局 IP,而 10.0.1.1 和 10.0.1.251 是本地 IP。主机 B 是我的计算机。在此处输入图片描述

我可以 SSH 到路由器,然后在路由器上 SSH 到主机 A。现在我想通过在路由器上设置 iptables 来直接 SSH 到 A,如:将目标主机为 101.101.101.101 、端口为 25122 的数据包全部转发到 10.0.1.251:22。

应用以下三条指令:

iptables -t nat -A PREROUTING -d 101.101.101.101 -p tcp -m tcp --dport 25122 -j DNAT --to-destination 10.0.1.251:22
iptables -t nat -A POSTROUTING -o br-lan -j SNAT --to-source 10.0.1.1
iptables -t nat -A POSTROUTING -o eth0.2 -j SNAT --to-source 101.101.101.101

执行后会在 列表中显示 iptables -t nat -v -n -L,路由器上的路由规则如下:

#route -n
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         101.101.101.254 0.0.0.0         UG    0      0        0 eth0.2
10.0.1.0        0.0.0.0         255.255.255.0   U     0      0        0 br-lan

但是,完成所有这些操作后,我仍然无法通过 B 上的“ssh 101.101.101.101 25122”通过 SSH 连接到 A。它只是失败了:

Could not connect to '101.101.101.101' (port 25122): Connection failed.
  1. 情况是,路由器上无法安装 tcpdump 工具来查看那里的数据包状态。但我可以在主机 A 上运行 tcpdump 并确认没有数据包从路由器转发。

  2. 在路由器上,

    #cat /proc/sys/net/ipv4/ip_forward
    1
    

这表明转发已启用。

  1. iptables -t nat -v -n -L每次我在 B 上执行 ssh 后运行,我都可以看到路由器的 PREROUTING 数据包的变化。

    Chain PREROUTING (policy ACCEPT 39526 packets, 3345K bytes)
    pkts bytes target     prot opt in     out     source               destination
    14   712 DNAT       tcp  --  *      *       0.0.0.0/0            115.156.132.118     tcp dpt:25122 to:10.0.1.251:22
    

每次我运行 ssh 到主机 B 上的 25122 端口时,第一个数字(14)都会增加。这表明数据包到达了路由器但未被转发?

  1. 我运行iptables -v -n -L发现 FORWARD 链的默认策略是 DROP,而 INPUT 和 OUTPUT 链是 ACCEPT。然后我使用 将 FORWARD 链设置为 accept iptables --policy FORWARD ACCEPT。但是,ssh 仍然像上面一样失败。

所以,我来了。这可能是路由器的硬限制问题,还是 iptables 设置错误。如果是后者,我应该如何设置才能实现我的目标?

非常感谢您提供任何线索。

答案1

基本上,你需要先简化事情,然后尝试你非常确定的指导。以及常识。我非常理解iptables这些问题,因为我曾经花了 3 天时间研究这个问题,概念很快就会变得模糊,除非你得到一个正确的设置。

要使 ssh 正常工作,仅当默认策略为 ACCEPT 时才需要执行此操作:

iptables -t nat -A PREROUTING -d 101.101.101.101 -p tcp --dport 25122 -j DNAT --to-destination 10.0.1.251:22

然而,在服务器规则中,我更倾向于通过接口名称而不是 IP 地址来区分对象。假设外部接口是eth4,面向您的网络的接口是,eth1那么这应该可以工作并且足够了:

iptables -t nat -I PREROUTING -p tcp -i eth4 --dport 25122 -j DNAT --to-destination 10.0.1.251:22
iptables -A FORWARD -i eth4 -o eth1 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth4 -p tcp -j ACCEPT

如果 FORWARD 链策略不是 ACCEPT,则需要最后两条规则。

您可以像这样列出接口:ip addr list

在决定更改是否有效之前,请记住将防火墙恢复到您希望它在应用关键更改之前处于的默认状态。例如刷新链并重新启动 iptable 服务。并且您已经在内核中启用了转发。

祝你好运!

相关内容