我想将 ssh 端口转发到另一个主机和不同的端口和接口。
服务器1:22 -> 服务器1:22
公共互联网 -> eth0 -> server1:23 -> eth1 -> server2:22
我启用了 ipv4 转发
sysctl -p
net.ipv4.ip_forward = 1
并创建以下 ip 表规则
iptables -t nat -I PREROUTING -p tcp -i eth0 --dport 23 -j DNAT --to-destination 192.168.0.3:22
iptables -A FORWARD -i eth0 -o eth0 -p tcp --dport 23 -j ACCEPT
但我无法让它工作,我错过了什么?
最后在 haukes 的帮助下我终于成功了
iptables -t mangle -A PREROUTING -d <Server1_eth0> -p tcp --dport 2223 -j MARK --set-mark 1 -i eth0
iptables -t nat -A PREROUTING -p tcp -m mark --mark 1 -j DNAT --to-destination <Server2>:2222 -i eth0
iptables -t nat -A POSTROUTING -m mark --mark 1 -j SNAT --to-source <Server1_eth1> -o eth1
iptables -A FORWARD -m mark --mark 1 -j ACCEPT -o eth1
where Server1_eth0 is my public ip
答案1
如果 server1 不是 server2 的网关,那么您也需要 SNAT。否则 server2 将向无法识别数据包的客户端发送回复,因为其源地址不是 server1,而是 server2。
iptables -t nat -A POSTROUTING -p tcp -m conntrack --ctstate DNAT --ctorigdst server1 --ctorigdstport 23 -j SNAT --to-source server1
FORWARD、PREROUTING 和 POSTROUTING 规则的一个精确且易于理解的过滤标准是数据包标记:
iptables -t mangle -A PREROUTING -d $server1_ip -p tcp --dport 23 -j MARK --set-mark 22
iptables -t nat -A PREROUTING -p tcp -m mark --mark 22 -j DNAT --to-destination $server2_ip:22
iptables -t nat -A POSTROUTING -m mark --mark 22 -j SNAT --to-source $server1_ip
iptables -A FORWARD -m mark --mark 22 -j ACCEPT
请注意:如果 server1 有多个接口,并且 DNATed 数据包从一个接口路由到另一个接口(就像在这种情况下一样),那么目标匹配 IP 和 SNAT IP 是不同的。
第二行中不需要“-p tcp”,但 iptables 或 Netfilter 需要它。-m comment --comment "DNAT SSH from port 23 to server2"
在所有行中添加 eg 可能会很有用,以使 optputiptables -L -nv
更容易理解。