1. 需求描述
主机A和主机B在同一个局域网。
主机A eth0的IP为内网IP:192.168.56.101,eth1为公网IP:120.77.36.222。
主机B eth0的IP为内网IP:192.168.56.102,80端口开启了Web服务。
通过外网访问到主机A,无法访问到主机B。
现在想要访问外网访问主机B的Web服务,怎么办?答:使用端口映射。
参考文档:
2. 具体配置
2.1. 开启路由功能
主机A上开启路由功能
1 | sudo echo 1 > /proc/sys/net/ipv4/ip_forward |
如果报错:-bash: /proc/sys/net/ipv4/ip_forward: Permission denied
那就切换到root用户:
1 | sudo -i |
要想永久生效,还要把 /etc/sysctl.conf 文件中 net.ipv4.ip_forward
的值改为1。
2.2. 配置端口映射
1、新建portmap.sh,内容如下:
1 |
|
2、添加执行权限
1 | sudo chmod a+x portmap.sh |
3、执行脚本
1 | sudo ./portmap.sh |
4、查看iptables规则
1 | sudo iptables -t nat -vnL PREROUTING --line-number |
5、如果不需要端口映射了,可以删除端口映射规则
1 | sudo iptables -t nat -D PREROUTING 1 # 实际规则编号通过上一步确定 |
6、设置重启后依然有效
参考《Linux配置SNAT上网》。
2.3. 测试效果
主机A上测试
1 | curl 192.168.56.102 # 正常 |
主机B上测试
1 | curl 192.168.56.102 # 正常 |
在配置iptables的主机A上,直接测试端口映射是没有效果的,必须从另外的主机上进行测试才能确认端口映射已经生效。原理不明,了解的大佬欢迎留言解惑。
3. 本机端口映射
有主机A,eth0的IP为内网IP:192.168.56.101,eth1为公网IP:120.77.36.222。
访问 http://192.168.56.101 正常,访问 http://120.77.36.222 失败。这是因为,电信会封锁80端口和8080端口。为了使外网也可以访问80端口的服务,可以把10180端口映射为80端口。
1 | sudo iptables -t nat -A PREROUTING -p tcp --dport 10180 -j REDIRECT --to-ports 80 |
然后,就可以通过 http://120.77.36.222:10180 来访问80端口的服务了。