我正在使用Ubuntu Server Box(10.04)将我的网络路由到互联网.这个盒子有2个以太网卡(eth0用于互联网连接,eth1用于lan – 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)都不起作用,我不知道我做错了什么.你可以帮帮我吗?
您的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,因为它对网络和路由器系统资源的使用效率相当低.