使用 iptables 进行端口转发

使用 iptables 进行端口转发

我有一个奇怪的网络拓扑,并且我尝试转发端口,但没有成功。

问题是,我有一个公共服务器,并且所有端口都必须从路由器转发到同一个服务器(某种 DMZ)。

我的拓扑:

   internet
      |
    router
      |
 /----+--+------\
 |       |      |
pc1   server   etc

服务器运行 Linux(ubuntu)iptables。防火墙配置大致如下:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

# for every port I accept on the server (this part works perfectly)
iptables -A INPUT -p tcp --dport xxxx -j ACCEPT

# for every port I want to forward to pc1 (this is the part that doesn't work)
iptables -A FORWARD -p tcp --dport xxxx -j ACCEPT
iptables -t nat -P PREROUTING -p tcp --dport xxxx -j DNAT --to $PC1_IP
# I've also tried with the following line:
iptables -t nat -P POSTROUTING -p tcp --sport xxxx -j SNAT --to $PC1_IP

但转发似乎不起作用。

当我启用转发时,连接可以连接(或似乎可以连接),但没有数据传输。也许它们只是超时了。
当我不启用上述转发时,连接会立即被拒绝。

目标电脑已经检查并且可以接受连接。

我也尝试在两台机器上使用 Wireshark 进行嗅探。在服务器上,数据包被接受,但没有找到传出的数据包(我假设如果 DNAT 重新路由确实发生了,应该会有一个)。在 上pc1,没有收到任何数据包。

有人能建议解决办法吗?我已经在 Google 上搜索了好几天,也尝试了该端口的几种设置 - 但都不起作用。

答案1

尝试添加

echo 1 > /proc/sys/net/ipv4/ip_forward

在 Linux 上启用路由

添加

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

否则本地电脑的响应将不会被转发回互联网。

您可能还想使用:

iptables -t nat -P PREROUTING -p tcp --dport xxxx -d your.public.ip.addr -j DNAT --to $PC1_IP

如果你遵守规则 - 从本地网络通过端口 xxxx 发送的任何流量都将被转发到 $PC1_IP

相关内容