我想将 ssh 流量从 A 端口 2222 转发到 B 端口 22。我在两个接口上都将 ipv4 转发设置为 1。尽管如此,这仍然行不通。怎么了?
机器A:eth0 192.168.0.150
eth1217.27.166.110
机器 B:eth0192.168.0.200
iptables -L
:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT icmp -- anywhere anywhere icmp echo-request
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere 192.168.0.200 tcp dpt:ssh state NEW,RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
iptables -L -t nat
:
root@lbpub01:~# iptables -L -tnat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere 217.27.166.110 tcp dpt:2222 to:192.168.0.200:22
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 217.27.166.110 192.168.0.200 tcp dpt:ssh
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
更新
我从 irc@freenode 的好人那里得到了帮助,所以这是我的工作iptables-save
文件:
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp -d 217.27.166.110 --dport 2222 -j DNAT --to-destination 192.168.0.200:22
-A POSTROUTING -o eth+ -j MASQUERADE
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp --dport http -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j DROP
COMMIT
我一直在研究同样的问题一段时间。似乎对我有用的解决方案(至少在我使用 VM 进行演示时)最终看起来与您在此处发布的内容大不相同。
真的很快,这是我的配置:
iptables -L
:iptables -S
:(澄清一下,最后一条 INPUT 规则是允许 ssh 访问机器 A。)
iptables -t nat -L
:iptables -t nat -S
:因此,有趣的是,我不需要 FORWARD 链中的任何内容,但似乎 PREROUTING 规则足以将来自客户端的第一个数据包转发到机器 B。
那么,问题是响应数据包在通过网关时丢失了。直到我对机器 A 上的 eth1 进行 Wireshark 操作,并注意到发往机器 B 的数据包上的源地址仍然是客户端机器的源地址时,我才意识到这一点。然后我使用 POSTROUTING 表将源地址更改为机器 A 在 eth1 上的 IP 地址,以便机器 B 知道将响应发送到机器 A 而不是网关。
在这一点上,我能够建立从与机器 A 的 eth0 接口到机器 B 位于同一网络上的客户端的连接。虽然我不是 100% 确定防火墙如何知道如何处理从机器发送的响应数据包B到客户端机器,我认为最可能的原因是INPUT链中的规则允许通过防火墙建立连接: