前几天遇到一个小问题:
一个小的网络,拥有一个电信公网IP。用LINUX做NAT后所有用户都走这个IP出去。内部有一些服务器要向外公布,如:80
在NAT上做SNAT(让大家都走这里上外网):
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 222.111.33.88
然后给要公布的服务做DNAT(外面的客户可以通过公网IP访问服务器):
iptables -t nat -A PREROUTING -d 222.111.33.88 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.250:80
这样两步之后,应该内部用户能上外网了,外面的用户也能访问到我们内部的服务器。
**注:要打开转发,和清空以前的规则。******
echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
********************************
一个小的网络,拥有一个电信公网IP。用LINUX做NAT后所有用户都走这个IP出去。内部有一些服务器要向外公布,如:80
在NAT上做SNAT(让大家都走这里上外网):
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 222.111.33.88
然后给要公布的服务做DNAT(外面的客户可以通过公网IP访问服务器):
iptables -t nat -A PREROUTING -d 222.111.33.88 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.250:80
这样两步之后,应该内部用户能上外网了,外面的用户也能访问到我们内部的服务器。
**注:要打开转发,和清空以前的规则。******
echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
********************************
但是现在出现一个问题,就是NAT后面(LAN)的用户不通直接通过WAN IP:222.111.33.88 来访问内部服务器。客户觉得只记一个IP(222.111.33.88 )方便点,而且他们也不想买域名,觉得没撒意思。他只想让大家记得这个IP。随时随地(在内网和外网)都可以访问。
现在我们来看看为什么在内网无法通过WAN IP来访问服务器:
我们看看数据包是怎么走的:
假设内网访问的用户IP是:192.168.1.123 服务器IP是:192.168.1.250,那整个过程是这样的:
192.168.1.123通过XXX端口访问222.111.33.88的80端口,源IP端口:192.168.1.123:XXX 目标IP端口:222.111.33.88:80
NAT在接到数据包后,发现这个请求是向内部的(DNAT),直接将数据包直接发给192.168.1.250。
192.168.1.250收到来自192.168.1.123的包后。再回应给192.168.1.123,
192.168.1.123会收到一个类似:192.168.1.250:80 --->192.168.1.123XXX的回应。
但192.168.1.123请求的是:222.111.33.88:80,所以不接收192.168.1.250:80 的回应。数据传输失败。
所以内部用户无法直接通过WAN IP来访问。
通过上面的过程我们发现问题主要出在内网请求到网关后,进入第一个链PREROUTING就是DNAT(端口映射)不会经过SNAT做源地址转换,因为不是从外网网卡出去的。所以要想让数据包正确回来,就得在PREROUTING后做一次SNAT。
iptables -t nat -I POSTROUTING -s 192.168.1.0/255.255.255.0 -p tcp -d 192.168.1.250 --dport 80 -j SNAT --to 192.168.1.1
OK,问题解决了。
***如果是FORWARD DROP了的话,记得打开192.168.1.250:80
iptables -A FORWARD -p tcp -d 192.168.1.250 --dport 80 -j ACCEPT
我们看看数据包是怎么走的:
假设内网访问的用户IP是:192.168.1.123 服务器IP是:192.168.1.250,那整个过程是这样的:
192.168.1.123通过XXX端口访问222.111.33.88的80端口,源IP端口:192.168.1.123:XXX 目标IP端口:222.111.33.88:80
NAT在接到数据包后,发现这个请求是向内部的(DNAT),直接将数据包直接发给192.168.1.250。
192.168.1.250收到来自192.168.1.123的包后。再回应给192.168.1.123,
192.168.1.123会收到一个类似:192.168.1.250:80 --->192.168.1.123XXX的回应。
但192.168.1.123请求的是:222.111.33.88:80,所以不接收192.168.1.250:80 的回应。数据传输失败。
所以内部用户无法直接通过WAN IP来访问。
通过上面的过程我们发现问题主要出在内网请求到网关后,进入第一个链PREROUTING就是DNAT(端口映射)不会经过SNAT做源地址转换,因为不是从外网网卡出去的。所以要想让数据包正确回来,就得在PREROUTING后做一次SNAT。
iptables -t nat -I POSTROUTING -s 192.168.1.0/255.255.255.0 -p tcp -d 192.168.1.250 --dport 80 -j SNAT --to 192.168.1.1
OK,问题解决了。
***如果是FORWARD DROP了的话,记得打开192.168.1.250:80
iptables -A FORWARD -p tcp -d 192.168.1.250 --dport 80 -j ACCEPT
如果要用FTP服务,记得要加载相应的FTP模块:
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
还得注意主、被动模式
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
还得注意主、被动模式
转载于:https://blog.51cto.com/piaolang/115571