我知道几年前这可以使用命令:
iptables -A OUTPUT -t nat --dport ${LOCAL UNPRIV PORT} \ -j DNAT ${ANOTHER SYSTEM}:${REMOTE PORT}
但是根据我的阅读,看起来该功能已被删除,我在/ var / log / messages中收到了消息
kernel: NAT: no longer support implicit source local NAT
我发现资源表明从内核2.6.X – 2.6.10,有一种方法可以在内核中使用IP_NF_NAT_LOCAL启用它,但显然在更新的内核中它已被删除.我已经尝试转发所有本地流量,因此它将进入PREROUTING链,并且取得了有限的成功,这只是一个坏主意,因为那时我必须打开服务器上的非特权端口,以便我可以将其反馈到eth0接口.我确信我有更多时间可以找到某种奇怪的kludge或解决方法,但我宁愿不要那么多地破解我的防火墙脚本.似乎必须有一个更简单的方法来做到这一点,我没有看到.社区可以提供的任何帮助或指导都会非常有帮助!提前致谢
解决方法
$IPT -t nat -A PREROUTING -i eth0 -p tcp --dport ${LOCAL UNPRIV PORT} -j DNAT --to ${ANOTHER SYSTEM}:${REMOTE PORT}
它是语义问题和netfilter工作方式的混合:在过去,转发本地端口涉及到转发的盒子的连接,以及到目的地的第二个连接. Iptables一步到位.因此,而不是两个连接 – 您将流量转发到该端口直接到达目的地. Netfilter执行所有健全性检查和簿记:只有属于有效连接的数据包才会被NAT,因此可以转发.
启用DNAT不允许转发任何数据包.您还必须添加规则:
$IPT -N INET-PRIV $IPT -A FORWARD -i eth0 -o eth1 -j INET-PRIV $IPT -A FORWARD -j DROP $IPT -A INET-PRIV -p tcp -d ${ANOTHER SYSTEM} --dport ${REMOTE PORT} -j ACCEPT $IPT -A INET-PRIV -j DROP
而且你必须启用转发.
echo "1" > /proc/sys/net/ipv4/ip_forward
Pro iptables:每个连接使用更安全,更灵活,更少的内存和cpu
Contra iptables:从内部机器转发连接到内部机器(将其反馈到eth0)对iptables没有意义(当然你总是可以直接连接),本地生成的转发流量不起作用(端口转发守护进程可能有所帮助 – 但通常没有意义)
确切地说,这可能是问题:您尝试在非路由器上使用NAT,因此您应该使用转发守护程序或完全跳过此额外端口转发并执行:
ssh -L 1234:${ANOTHER SYSTEM}:${REMOTE PORT} special-vpn-Box
在special-vpn-Box上,您只能使用iptables允许来自路由器和传出连接的传入连接到${ANOTHER SYSTEM}:${REMOTE PORT}.这样,special-vpn-Box的用户只能访问${ANOTHER SYSTEM}:${REMOTE PORT},如果不受信任,将无法执行任何其他操作.