我有一个奇怪的网络拓扑,并且我尝试转发端口,但没有成功。
问题是,我有一个公共服务器,并且所有端口都必须从路由器转发到同一个服务器(某种 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