1 为什么要做端口映射?
其实现在大多数公司都搭建了内网服务器环境,有时候我们的员工需要外网访问内部服务器的时候就有一道屏障了,那么这个时候就需要做端口映射,从而让内外网进行没有阻碍的数据传输。
下面我们来实操一下在Windows和Linux服务器中如何实现端口映射。
2 Windows 服务器环境下完成端口映射
- 方案一
直接使用市面三方工具,例如花生壳等。
- 方案二
查看端口映射情况,命令如下:
netsh interface portproxy show v4tov4
使用方式:
netsh interface portproxy show v4tov4 | find "ip"
使用示例:
netsh interface portproxy show v4tov4 | find "192.168.110.***"
增加一个端口映射,命令如下:
netsh interface portproxy add v4tov4 listenaddress=[外网IP地址] listenport=[外网端口] connectaddress=[内网IP地址] connectport=[内网端口]
使用示例:
netsh interface portproxy add v4tov4 listenaddress=5.5.5.5 listenport=8080 connectaddress=192.168.110.*** connectport=80
删除一个端口映射,命令如下:
netsh interface portproxy delete v4tov4 listenaddress=[外网IP] listenport=[外网端口]
使用示例:
netsh interface portproxy delete v4tov4 listenaddress=5.5.5.5 listenport=8080
3 Linux 服务器中环境下端口映射
首先设置服务器允许数据包转发,命令如下:
echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -i [内网网卡名称] -j ACCEPT
iptables -t nat -A POSTROUTING -s [内网网段] -o [外网网卡名称] -j MASQUERADE
使用示例:
echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -i ens33 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.110.100/200 -o ens37 -j MASQUERADE
再设置端口映射,命令如下:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport [外网端口] -j DNAT --to-destination [内网ip地址]:[内网端口]
使用示例:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8090 -j DNAT --to-destination 192.168.110.100:8090
然后来实际操作,把内外服务映射到外网:
提前准备好:VMWare(搭建虚拟机的平台)、5台Linux Centos7 服务器
从图中很明了了,server是外网和内网的分界点。
Server是双网卡主机,连接192.168.110.0/300和172.16.2.300/500两个。
Server3、Server4是两台内网服务器,Server1、Server2是两台外网服务器。
Server1服务器是我们的用户端。
Server3、Server4、Server2三台服务器搭建HTTP服务:
注意这里需要用到Python,不了解的可以查找一下资料。
cd ~
echo "server3" > index.html
python -m SimpleHTTPServer 8080
cd ~
echo "server4" > index.html
python -m SimpleHTTPServer 8080
cd ~
echo "server2" > index.html
python -m SimpleHTTPServer 8080
用户端Server1访问Server3和Server4的资源:
curl http://192.168.110.12:8080/index.html
curl http://192.168.110.13:8080/index.html
访问后给的错误提示:
用户端Server2访问的资源:
curl http://192.168.110.11:8080/index.html
访问后给的,访问成功的提示。
这里可以看出来,server1访问server2时,因他们本身处于同一个内网环境,一次访问成功。server1访问server3和server4时就出现了无法访问内网资源了。
到server服务上配置端口映射:
#允许数据包转发
echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -i ens33 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.110.0/24 -o ens37 -j MASQUERADE
#设置端口映射
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8081 -j DNAT --to-destination 192.168.110.12:8080
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8082 -j DNAT --to-destination 192.168.110.13:8080
注意这种配置方式是临时的,如果你重启了虚拟机或服务器就会失效的。
如果需要永久配置,则把上面的命令追加到/etc/rc.local文件中。
再用户端Server1访问Server3、Server4、Server2的资源:
curl http://192.168.110.12:8080/index.html
curl http://192.168.110.13:8080/index.html
curl http://192.168.110.11:8080/index.html
这样就反应全部访问成功了。
注意:
如果这里你都server服务是window服务,就哟啊用到前面window的配置方式了。
netsh interface portproxy add v4tov4 listenaddress=192.168.110.12 listenport=8081 connectaddress=192.168.110.10 connectport=8080
netsh interface portproxy add v4tov4 listenaddress=192.168.110.13 listenport=8082 connectaddress=192.168.110.11 connectport=8080
netsh interface portproxy show v4tov4