由于最近的项目需要,要实现端口的映射,通过公网IP访问服务器的内网提供的服务,因此写下该文章记录整个过程。在这个过程中,我尝试了如何配置iptables,结果发现服务器用的是ufw实现linux服务器的防火墙,又转而去配置ufw的转发。也因此文章中两种方法都会记录,但是一定记得在实现端口映射的时候,一定要注意自己的服务器用的是哪种方式!!!
允许服务器进行转发
首先是基础配置,这里两种方法使用的操作都是一样的。需要开启linux的数据转发功能。通过命令
vim /etc/sysctl.conf
在里面添加一行:
net.ipv4.ip_forward=1
保存退出后,使用以下命令使其生效:
sysctl -p
如果想要检查,还可以直接查看/proc/sys/net/ipv4/ip_forward
的内容,如果是1表示设置成功生效。
使用iptables实现端口映射
通过修改iptables可以实现NAT映射功能,举例来说,如果要访问的实际服务为内网192.168.0.2的端口号为9000的服务,但是需要通过公网IP123.123.123.123,端口号19000访问,则可以通过以下命令实现端口映射:
iptables -t nat -A PREROUTING -d 123.123.123.123 -p tcp --dport 19000 -j DNAT --to-destination 192.168.0.2:9000
上述命令是将192.168.0.2:9000的服务映射到了公网的123.123.123.123:19000上。每个映射发都需要添加一条,在完成配置后,通过下述命令保存:
iptables-save -t nat
保存的结果可以通过以下命令查看:
iptables -t nat --list
如果有需要删除的列表信息,则用以下命令删除:(一定要慎重删除,无法恢复)
iptables -t nat -D PREROUTING 1 //序号从1 开始,后边以此+1.
由于我的服务器上使用的不是iptables的服务,所以没法验证下述操作的可行性,但是如果是使用了iptables服务的服务器,应该可以通过以下命令保存设置并重启服务:
service iptables save
service iptables restart
使用ufw实现端口映射
首先需要修改/etc/default/ufw,添加如下内容:
DEFAULT_FORWARD_POLICY="ACCEPT"
然后在/etc/ufw/before.rules中,在 *filter 之前,加入以下内容:
*nat
:PREROUTING - [0:0]
-A PREROUTING -i eth0 -p tcp --dport 公网映射端口 -j DNAT --to-destination 内网IP:内网服务端口
-A POSTROUTING -j MASQUERADE
COMMIT
需要注意上面的eth0是设备的网卡名称,需要用ifconfig来确定。dport后的值便是监听的公网端口。
添加完上述内容后,需要对每个监听的端口(公网映射的端口)使用以下命令:
sudo ufw allow from any to any port xxxxx
最后,使用以下命令重启服务
sudo ufw reload
sudo ufw enable //没启动则使用该命令,否则不用使用
至此,端口映射成功实现。