iptables将一个外部端口转发到本地主机上的另一个端口

我有一个设置,我有一个CentOS服务器,充当互联网网关。 这台机器执行我们的主交换机和我们的互联网连接之间的NAT。 我还在这台服务器上托pipe一台虚拟机,可以通过端口3389上的远程桌面进行访问。

我想要做的就是设置iptables,使端口10101从wan端转发到3389端口。 我希望外面的人只能看到端口10101,并将其redirect到PC的本地IP地址上的端口3389。

在我的设置中,我有一个名为lan0(192.168.1.15)的本地适配器,另一个名为wan0的适配器将获得我们分配给它的公共IP地址。 所以我希望它看起来像这样:

wan0 xxx.xxx.xxx.xxx:10101 – > lan0 192.168.1.15:3389

我已经尝试了几件事情,而我似乎无法做到。 我所做的和网上的大多数例子之间的区别似乎是,大多数例子涉及一个网关,它将stream量转发到一个不同的pc,而我的networking仍然在同一个系统上。

更新:

为了使事情更清楚,这里是我的整个iptablesconfiguration文件,包括cjc的build议。 根据我的理解,我已经列出了关于这两行的评论。 我对于iptables了解得很less,所以如果我错了,请纠正我的错误。

# Generated by iptables-save v1.3.5 on Fri Jul 8 12:41:58 2011 *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [5:316] # route all requests for web traffic through squid on port 3128 -A PREROUTING -i lan0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.15:3128 # forward outside requests from 10101 to 3389 per cjc -A PREROUTING -i wan0 -p tcp --dport 10101 -j DNAT --to 192.168.1.15:3389 # needed for transparent squid proxy -A POSTROUTING -j MASQUERADE COMMIT # Completed on Fri Jul 8 12:41:58 2011 # Generated by iptables-save v1.3.5 on Fri Jul 8 12:41:58 2011 *filter :INPUT ACCEPT [89:5788] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1046:126223] :RH-Firewall-1-INPUT - [0:0] # accept all traffic from loopback -A INPUT -i lo -j ACCEPT # accept traffic destined to this machine regarding as part of existing connections -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # accept traffic destined to this machine from our local network -A INPUT -s 192.168.1.0/24 -j ACCEPT # accept traffic destined to this machine from the wan on port 10101 per cjc -A INPUT -i wan0 -p tcp --dport 10101 -j ACCEPT # reject all other wan traffic -A INPUT -i wan0 -j REJECT --reject-with icmp-port-unreachable # drop ping requests from the outside (is this needed and in the right order?) -A INPUT -i wan0 -p icmp -m icmp --icmp-type 8 -j DROP # allow forwarding of packets from the lan to the wan for squid proxying -A FORWARD -s 192.168.1.0/24 -i lan0 -o wan0 -m state --state NEW -j ACCEPT # allow forwarding of any packets pertaining to an existing connection -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT # Completed on Fri Jul 8 12:41:58 2011 

像这样的东西不起作用?

 iptables -A INPUT -i wan0 -p tcp --dport 10101 -j ACCEPT iptables -t nat -A PREROUTING -i wan0 -p tcp --dport 10101 -j DNAT --to 192.168.1.15:3389 

如果虚拟机与其他虚拟机位于不同的networking上,则可能还需要一个类似于前向的指令(假设其他规则尚未允许):

 iptables -A FORWARD -i wan0 -d 192.168.1.15 -j ACCEPT 

您在脚本的评论中清楚地说明了问题:

 "# accept traffic destined to **this machine** from the wan on port 10101" 

不,您不接受发往本机的stream量,您正在接受指定给其他某台机器的stream量。 如果要将stream量转发到192.168.1.15,则在FORWARD链中打开filter,而不是INPUT。

 iptables -A FORWARD -i wan0 -p tcp --dport 10101 -j ACCEPT 

PREROUTING的DNAT是正确的。

filter链上的“通用”RELATED ESTABLISHED规则也很酷,但是您可能希望将它们放在链的起始处。 如果更频繁匹配的规则(如属于已经允许的连接的大量数据包)尽可能快地离开表格,则会保存cpu。

这只会使用iptables。 由于这个请求的目的地是我的网关服务器,在这种情况下,它不是简单地作为代理服务器,所以我不能使用SNAT来更改数据包的源地址。 如果我阻止来自wan0的端口3389的请求,甚至从端口10101到3389被DNAT的包将被阻塞,因为wan0仍然是它们的源。

cjc指出,其他软件可以与iptables结合来实现这一点,但是这个复杂程度并不是我的问题所要求的。