在Linux系统中,端口映射(也称端口转发)是一种将网络流量从一个IP地址和端口重定向到另一个IP地址和端口的技术,常用于内网服务暴露、负载均衡或安全隔离等场景,实现端口映射主要依赖防火墙工具(如iptables、firewalld)和内核IP转发功能,以下分步骤详细介绍配置方法。
开启系统IP转发功能
端口映射需依赖Linux内核的IP转发能力,默认情况下系统可能关闭此功能,需编辑/etc/sysctl.conf
文件,添加或修改以下参数:
net.ipv4.ip_forward = 1
保存后执行sysctl -p
使配置立即生效,或通过systemctl restart network
(CentOS 7+)/etc/init.d/network restart
(Ubuntu)重启网络服务。
使用iptables实现端口映射
iptables
是Linux传统的防火墙工具,通过NAT(网络地址转换)规则实现端口映射,适用于大多数发行版(如CentOS 6/7、Ubuntu 14.04+等)。
基本DNAT规则(目标地址转换)
假设场景:将服务器公网IP(0.113.10
)的8080
端口映射到内网主机168.1.100
的80
端口(TCP协议)。
# 添加PREROUTING规则(修改目标端口和IP) iptables -t nat -A PREROUTING -p tcp -d 203.0.113.10 --dport 8080 -j DNAT --to-destination 192.168.1.100:80 # 添加POSTROUTING规则(确保返回流量正确路由) iptables -t nat -A POSTROUTING -d 192.168.1.100 -p tcp --dport 80 -j MASQUERADE
参数说明:
-t nat
:指定NAT表;-A PREROUTING
:在数据包进入路由前修改目标地址;-A POSTROUTING
:在数据包离开前修改源地址(MASQUERADE隐藏内网IP);--dport
:目标端口;--to-destination
:映射到的内网IP和端口。
保存iptables规则
不同发行版保存命令不同:
- CentOS/RHEL:
service iptables save
(CentOS 6)或iptables-save > /etc/sysconfig/iptables
(CentOS 7+); - Ubuntu/Debian:
iptables-save > /etc/iptables/rules.v4
。
常见iptables映射规则示例
场景 | 命令 |
---|---|
UDP端口映射(53→192.168.1.100:53) | iptables -t nat -A PREROUTING -p udp -d 203.0.113.10 --dport 53 -j DNAT --to-destination 192.168.1.100:53 |
映射到多个内网端口(8080→80, 8443→443) | 分别执行两条DNAT规则,对应不同端口映射 |
使用firewalld实现端口映射
firewalld
是CentOS 7+、RHEL 7+、Fedora等系统的默认防火墙,支持更灵活的富规则(Rich Rules)配置。
开启端口转发功能
firewall-cmd --permanent --add-service=portforwarding # 启用端口转发服务 firewall-cmd --reload # 重新加载防火墙
添加富规则实现映射
同样以0.113.10:8080→192.168.1.100:80
为例:
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=0.0.0.0/0 forward-port port=8080 protocol=tcp to-port=80 to-addr=192.168.1.100'
参数说明:
family=ipv4
:指定IPv4协议;forward-port
:端口转发;to-addr
:内网目标IP;to-port
:内网目标端口。
检查并启用端口
确保防火墙允许目标端口流量(如80
端口):
firewall-cmd --permanent --add-port=80/tcp firewall-cmd --reload
验证端口映射是否生效
- 本地测试:在服务器上执行
telnet 127.0.0.1 8080
或curl http://localhost:8080
,若返回内网服务内容则成功。 - 远程测试:从外部网络访问
http://203.0.113.10:8080
,若能访问内网服务则映射生效。 - 查看规则:
- iptables:
iptables -t nat -L -n -v
; - firewalld:
firewall-cmd --list-rich-rules
。
- iptables:
相关问答FAQs
Q1:端口映射后仍无法访问,如何排查?
A:可按以下步骤排查:
- 检查内网服务是否正常运行(如
systemctl status nginx
); - 确认内网主机防火墙是否允许目标端口(如
ufw allow 80
); - 检查IP转发是否开启(
sysctl net.ipv4.ip_forward
); - 查看iptables/firewalld规则是否正确(
iptables -t nat -L -n
); - 使用
tcpdump
抓包分析流量(如tcpdump -i eth0 port 8080 -vv
)。
Q2:如何永久保存iptables规则?
A:不同系统保存方式不同:
- CentOS 6/7:使用
service iptables save
(CentOS 6)或iptables-save > /etc/sysconfig/iptables
(CentOS 7+),规则会自动加载; - Ubuntu/Debian:安装
iptables-persistent
包(apt install iptables-persistent
),配置后执行netfilter-persistent save
保存规则; - 注意:重启后需确认规则是否生效(
iptables -L -n
),避免因服务启动顺序导致规则丢失。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/22600.html