将 ssh 端口从一台主机转发到另一台主机,并在另一个接口上转发不同的端口。

将 ssh 端口从一台主机转发到另一台主机,并在另一个接口上转发不同的端口。

我想将 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更容易理解。

相关内容