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

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

我有一个 CentOS 服务器作为互联网网关。这台机器在我们的主交换机和互联网连接之间执行 NAT。我还在这台服务器上托管了一个虚拟机,可以使用端口 3389 上的远程桌面访问它。

我想要做的是设置 iptables,以便将端口 10101 从 wan 端转发到 lan 端的 3389。我希望外部人员只能看到端口 10101,并将其重定向到 PC 本地 IP 地址上的端口 3389。

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

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

我尝试了几种方法,但似乎都无法解决问题。我所做的和网上大多数示例之间的区别似乎在于,大多数示例都涉及一个网关,该网关将流量转发到另一台电脑,而我的仍在同一个系统上。

更新:

为了更清楚起见,下面是我的整个 iptables 配置文件,包括cjc 的建议。我根据自己的理解对这些行进行了注释。我对 iptables 了解甚少,所以如果我有任何错误,请纠正我。

# 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

答案1

这样的事情不起作用吗?

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

如果虚拟机与您的其他机器位于不同的网络上,您可能还需要一个前向指令,如下所示(假设您的其他规则还不允许它):

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

答案2

您在脚本的此注释中清楚地陈述了问题:

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

不,您没有接受发往这台机器的流量,而是接受发往其他机器的流量。如果您要将流量转发到 192.168.1.15,请在 FORWARD 链上打开过滤器,而不是 INPUT。

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

PREROUTING 处的 DNAT 是正确的。

过滤器链中的“通用” RELATED、ESTABLISHED 规则也很不错,但您可能希望将它们放在链的开头。如果匹配更频繁的规则(如属于已允许连接的大量数据包)尽快离开表,您将节省 CPU。

答案3

仅使用 iptables 无法实现此目的。由于请求发往我的网关服务器,并且在这种情况下它不只是充当代理,因此我无法使用 SNAT 来更改数据包的源地址。如果我阻止从 wan0 到端口 3389 的请求,即使从端口 10101 到 3389 进行 DNAT 的数据包也会被阻止,因为 wan0 仍然是它们的源。

陳細指出其他软件可以与 iptables 结合来实现这一点,但我的问题不需要这种程度的复杂程度。

相关内容