![使用 iptables 进行端口转发不起作用](https://linux22.com/image/544646/%E4%BD%BF%E7%94%A8%20iptables%20%E8%BF%9B%E8%A1%8C%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我正在使用 Ubuntu Server Box (10.04) 将我的网络路由到互联网。此盒子有 2 个以太网卡(eth0 用于互联网连接,eth1 用于局域网 - 192.168.1.1),我想将端口 80 转发到我的服务器(192.168.1.254)。因此,我设置了以下内容:
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
iptables -t mangle -F
# default route:
ip route add default via 200.160.111.67
# www tunnel:
iptables -I FORWARD -p tcp -d 192.168.1.254 --dport 80 -i eth0 -j ACCEPT
# this line locks up internet access for all users:
#iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.254:80
# ssh tunnel
iptables -I FORWARD -p tcp -d 192.168.1.254 --dport 22 -i eth0 -j ACCEPT
# this line uncommented locks all my accesses to external ssh servers:
#iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.1.254:22
# NAT
modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
我的网络内部连接的 NAT 正在运行,但两个端口转发(ssh 和 www)均不起作用,我不知道我做错了什么。你能帮助我吗?
答案1
您的 DNAT 规则需要更具体一些才能正常工作。一种方法是向每个规则添加一个--destination
(或)条件,例如-d
iptables -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 80 -j DNAT \
--to-destination 192.168.1.254
iptables -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 22 -j DNAT \
--to-destination 192.168.1.254
$EXT_IP
您的路由器的外部(全局可路由)IP 地址在哪里。
警告:如果内部客户端尝试通过外部(全局可路由)IP 地址连接到 192.168.1.254 上的 www 或 ssh 服务,则其连接尝试将失败(而直接连接到 192.168.1.254 将会成功)。
为了解决这个问题,最好告诉您的内部客户端通过其内部 IP 地址访问服务器。或者,您可以通过添加更多 iptables 规则来配置“发夹 NAT”,如下所示:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.254 -p tcp \
--dport 80 -j SNAT --to-source $INT_IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.254 -p tcp \
--dport 22 -j SNAT --to-source $INT_IP
其中$INT_IP
是路由器的内部 IP 地址(例如 192.168.1.1)。有了这些规则,从内部客户端到外部 IP 地址的连接将通过路由器。最好尽可能避免使用发夹 NAT,因为它对网络和路由器系统资源的使用效率相当低。