iptables将本地连接redirect到远程系统/端口

我试图使用SSH端口转发Windows机器本地端口3389到一个任意的端口(在非特权区域)的红帽服务器,我已经在防火墙后面保护,然后将红帽服务器上的非特权端口转发到用户的远程桌面。 本质上创build一个高度specalized VPN只处理一个任务:使用encryption的隧道让用户到他们的系统防火墙我有控制权。

我知道几年前这是可能的使用命令:

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来启用它,但显然在更新的内核中它已被删除。 我已经尝试转发所有本地stream量,所以它将进入PREROUTING链,并且成功有限,这只是一个坏主意,因为那么我必须打开服务器上的非特权端口,以便将其反馈回eth0接口。 我肯定有更多的时间我可以找出一些奇怪的kludge或解决方法,但我宁愿不破坏我的防火墙脚本那么多。 似乎必须有一个更简单的方法来做到这一点,我没有看到。 社区可以提供的任何帮助或指导将非常有帮助! 提前致谢

我不完全确定,如果我明白,但我认为你只是在错误的链条。 :-)当我第一次使用iptables的时候,我也感到困惑。 但是转发 本地港口$ {LOCAL UNPRIV PORT}的方式如下:

 $IPT -t nat -A PREROUTING -i eth0 -p tcp --dport ${LOCAL UNPRIV PORT} -j DNAT --to ${ANOTHER SYSTEM}:${REMOTE PORT} 

这是一个语义问题和netfilter工作方式之间的混合:在过去,转发本地端口涉及转发的框的连接,再加上到目的地的第二个连接。 iptables完成这一步。 所以,而不是两个连接 – 您正在转发到该端口的stream量直接到目的地。 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 :每个连接使用更安全,更灵活,更less的内存和CPU

Contra iptables :将连接从内部机器转发到内部机器(将其反馈回eth0)对iptables没有意义(当然,您可以始终直接连接),转发本地生成的stream量不起作用一个端口转发守护进程可能会有帮助 – 但通常没有意义)

实际上,这可能是问题所在 :您尝试在非路由器上使用NAT,因此您应该使用转发守护程序或完全跳过此额外的端口转发,并执行以下操作:

 ssh -L 1234:${ANOTHER SYSTEM}:${REMOTE PORT} special-vpn-box 

在特别的vpn-box上,你只能使用iptables允许来自路由器的传入连接和传出连接到$ {另一个系统}:$ {REMOTE PORT}。 那样的特殊vpn框的用户只能访问$ {另一个系统}:$ {远程端口},如果他们不被信任,将不能做任何事情。

 # Enable IP Forwarding echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -p tcp \ --dport ${LOCAL UNPRIV PORT} -j DNAT --to-destination ${ANOTHER SYSTEM}:${REMOTE PORT} iptables -t nat -A POSTROUTING -p tcp \ --dst ${ANOTHER SYSTEM} --dport ${REMOTE PORT} -j SNAT --to-source ${LOCAL SYSTEM} 

以下是我专门为本地主机转发做的事情:

 iptables -t nat -A OUTPUT -m addrtype --src-type LOCAL --dst-type LOCAL -p tcp --dport 3306 -j DNAT --to-destination ip.ip.ip.ip iptables -t nat -A POSTROUTING -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE sysctl -w net.ipv4.conf.all.route_localnet=1 

确保将ip.ip.ip.ipreplace为真实的公有IP,并且还要为要转发的端口使用--dport 3306

最后运行sysctl命令并更新你的/etc/sysctl.conf

您可以使用以下命令更新sysctl.ctl以允许本地主机的路由:

 echo "net.ipv4.conf.all.route_localnet=1" >> /etc/sysctl.conf 

现在看来这一切都很简单,但确实需要一些研究和狩猎。 警告并理解转发localhost / 127.0.0.1需要这种方法,典型的其他示例不起作用。 一些不能用localhost的解决scheme的例子:

 iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to ip.ip.ip.ip:3306 iptables -t nat -A POSTROUTING -d ip.ip.ip.ip -j MASQUERADE 

http://realtechtalk.com/iptables_how_to_forward_localhost_port_to_remote_public_IP-1788-articles