我尝试将来自 127.0.0.1:8095 的数据包重定向到本地网络 10.11.12.5 : 22 中的另一台主机。例如,我想实现:
ssh [email protected] -p 8095
并重定向至
ssh [email protected]
我正在使用 nat 表的 OUTPUT 链:
iptables -t NAT -A OUTPUT -p tcp --dport 8095 -j DNAT --to-destination 10.11.12.5:22
但它不起作用。我尝试使用以下选项扩展上述规则:
-o lo
--source 127.0.0.1
--destination 127.0.0.1
但没有人帮助解决这个问题。我的 /etc/sysctl.conf 中也有:
net.ipv4.ip_forward = 1
net.ipv4.conf.eth0.route_localnet = 1
你能解释一下吗,我做错了什么?
往返于本地主机的数据包是网络地址转换的特殊情况。
当你连接到本地主机时,数据包中的源地址也将是本地主机
127.0.0.1
(或::1
对于 IPv6)DNAT 规则不会重写源 IP 地址
Linux 网络堆栈中有特殊的路由规则,明确防止具有本地主机源地址的数据包泄漏到互联网和/或您的系统连接到的其他网络。
因此:DNAT 之后,具有源本地主机和目标的数据包
10.11.12.5:22
将立即自动丢弃。最后一点可能只是您遇到的问题之一。
route_localnet=1
最后一个难题可以通过在正确的接口上进行设置来解决,例如sysctl -w net.ipv4.conf.eth0.route_localnet=1
;这可以防止这些数据包被立即丢弃。此外我认为(但我不确定你到底需要什么):你可能仍然需要做更多的数据包重写,你需要设置某种 SNAT 规则来将本地主机源地址重写为你将用于访问的接口的 IP 地址
10.11.12.5