sup*_*ova 4 iptables port-forwarding
我想将 ssh 端口转发到另一台主机和不同的端口和接口。
server1:22 -> server1:22
公共互联网 -> eth0 -> server1:23 -> eth1 -> server2:22
我启用了 ipv4 转发
sysctl -p
net.ipv4.ip_forward = 1
Run Code Online (Sandbox Code Playgroud)
并创建了以下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
Run Code Online (Sandbox Code Playgroud)
但我无法让它工作,我错过了什么?
最后在 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
Run Code Online (Sandbox Code Playgroud)
如果 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
请注意:如果 server1 有多个接口,并且 DNATed 数据包从一个接口路由到另一个接口(就像在这种情况下一样),那么目标匹配 IP 和 SNAT IP 是不同的。
“-p tcp”在第二行应该不是必需的,但 iptables 或 Netfilter 需要它。-m comment --comment "DNAT SSH from port 23 to server2"在所有行中添加 eg以使 optputiptables -L -nv更容易理解可能很有用。
| 归档时间: |
|
| 查看次数: |
4285 次 |
| 最近记录: |