一个计算机技术爱好者与学习者

0%

iptables实现端口映射

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
2
sudo -i
echo 1 > /proc/sys/net/ipv4/ip_forward

要想永久生效,还要把 /etc/sysctl.conf 文件中 net.ipv4.ip_forward 的值改为1。

2.2. 配置端口映射

1、新建portmap.sh,内容如下:

1
2
3
4
5
6
7
8
#!/bin/bash
pro='tcp'
NAT_Host='192.168.56.101'
NAT_Port=3480
Dst_Host='192.168.56.102'
Dst_Port=80
iptables -t nat -A PREROUTING -m $pro -p $pro --dport $NAT_Port -j DNAT --to-destination $Dst_Host:$Dst_Port
iptables -t nat -A POSTROUTING -m $pro -p $pro --dport $Dst_Port -d $Dst_Host -j SNAT --to-source $NAT_Host

2、添加执行权限

1
sudo chmod a+x portmap.sh

3、执行脚本

1
sudo ./portmap.sh

4、查看iptables规则

1
2
sudo iptables -t nat -vnL PREROUTING --line-number
sudo iptables -t nat -nL --line-number

5、如果不需要端口映射了,可以删除端口映射规则

1
2
sudo iptables -t nat -D PREROUTING 1 # 实际规则编号通过上一步确定
sudo iptables -t nat -D POSTROUTING 1 # 实际规则编号通过上一步确定

6、设置重启后依然有效
参考《Linux配置SNAT上网》

2.3. 测试效果

主机A上测试

1
2
3
4
5
curl 192.168.56.102 # 正常

curl 192.168.56.101:3480 # 报错 curl: (7) Failed to connect to 192.168.56.103 port 3480: Connection refused

telnet 192.168.56.101 3480 # 不通

主机B上测试

1
2
3
4
5
curl 192.168.56.102 # 正常

curl 192.168.56.101:3480 # 正常

telnet 192.168.56.101 3480 # 正常

在配置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端口的服务了。

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-iptables-port-map/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~