我想转发一个SSH端口到另一个主机和不同的端口和接口。
server1:22 – > server1:22
公共互联网 – > eth0 – > server1:23 – > eth1 – > server2:22
我启用了ipv4转发
sysctl -p net.ipv4.ip_forward = 1
并创build了以下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
如果server1不是server2的网关,那么你也需要SNAT。 否则,服务器2将把答复发送给不识别数据包的客户端,因为它没有server1作为源地址,而是服务器2。
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"可能会很有用,使iptables -L -nv更易于理解。