在Linux系统中,端口映射(通常指端口转发)是将网络流量从一个IP地址和端口转发到另一个IP地址和端口的过程,常用于内网服务暴露到公网、容器端口映射等场景,实现端口映射的主要工具包括iptables(传统Linux防火墙)和firewalld(CentOS 7+、RHEL 7+等系统默认防火墙),下面分别介绍这两种方法的配置步骤。
使用iptables实现端口映射
iptables是Linux内核集成的包过滤工具,通过NAT(网络地址转换)表实现端口转发,配置步骤如下:
开启IP转发功能
Linux系统默认可能禁止IP转发,需通过以下命令临时开启(永久开启需修改/etc/sysctl.conf
文件,添加net.ipv4.ip_forward=1
并执行sysctl -p
):
sysctl -w net.ipv4.ip_forward=1
添加NAT转发规则
假设将服务器的公网端口8080
转发到内网主机168.1.100
的80
端口(TCP协议),执行:
# 添加PREROUTING规则(将进入的8080端口流量目标地址转换为内网IP) iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 # 添加POSTROUTING规则(将响应流量源地址转换为服务器公网IP) iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j MASQUERADE
保存规则(不同系统命令不同)
- CentOS 6/7:
service iptables save
- Ubuntu/Debian:
iptables-save > /etc/iptables/rules.v4
开放防火墙端口
确保服务器允许8080
端口入站流量:
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
使用firewalld实现端口映射
firewalld是CentOS 7+、RHEL 7+、Ubuntu 16.04+等系统的默认防火墙,支持动态配置,步骤更简洁:
开启IP转发
编辑/etc/sysctl.conf
文件,添加net.ipv4.ip_forward=1
,执行:
sysctl -p
添加端口转发规则
假设将服务器的8080
端口转发到内网168.1.100:80
,需先确保8080
端口已开放:
firewall-cmd --permanent --add-port=8080/tcp
配置端口转发
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toaddr=192.168.1.100:toport=80
重新加载防火墙
firewall-cmd --reload
不同工具对比
特性 | iptables | firewalld |
---|---|---|
适用系统 | 所有Linux发行版 | CentOS 7+、RHEL 7+、Ubuntu 16.04+ |
配置方式 | 命令行规则 | 命令行/图形界面(firewall-config) |
规则生效 | 需手动保存(临时规则重启失效) | 支持动态加载(无需重启) |
复杂度 | 较高,需理解NAT表和链 | 较低,封装了常用操作 |
注意事项
- 内网主机设置:确保内网目标主机(如
168.1.100
)的防火墙允许目标端口(如80
)访问,且服务器与内网主机网络互通。 - 公网IP绑定:若服务器有多个公网IP,需在
DNAT
/MASQUERADE
规则中指定具体IP,避免流量错误转发。 - 协议匹配:TCP和UDP端口需分别配置,不可混用。
- 安全限制:建议限制允许访问映射端口的源IP(如iptables中添加
-s 192.168.1.0/24
),避免公网直接暴露服务。
相关问答FAQs
Q1:端口映射配置后,外部仍无法访问,如何排查?
A:首先检查目标服务是否正常运行(如systemctl status nginx
);其次确认服务器防火墙已开放映射端口(如iptables -L -n | grep 8080
);然后检查IP转发是否开启(sysctl net.ipv4.ip_forward
);最后使用telnet 服务器公网IP 8080
或nc -zv 服务器公网IP 8080
测试网络连通性,若不通可能是路由器或运营商端口限制。
Q2:如何删除已配置的端口映射规则?
A:
- iptables:删除对应链的规则,例如删除
8080
端口转发:iptables -t nat -D PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 iptables -t nat -D POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j MASQUERADE
- firewalld:移除端口转发并重新加载:
firewall-cmd --permanent --remove-forward-port=port=8080:proto=tcp:toaddr=192.168.1.100:toport=80 firewall-cmd --reload
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/35176.html