0%

linux下端口映射

Linux 端口映射配置指南:使用 iptables 实现网络地址转换

在 Linux 系统中,端口映射(端口转发)是实现不同网络间通信的重要手段,通常用于将外部网络的请求转发到内部网络的特定服务。以下是基于 iptables 的端口映射配置详解,包括临时配置和永久生效方案。

基础配置:启用数据包转发

端口映射依赖内核的 IP 转发功能,需先开启:

临时启用 IP 转发(立即生效,重启失效)

1
2
3
4
5
# 允许 IPv4 数据包转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 验证配置(返回 1 表示已启用)
cat /proc/sys/net/ipv4/ip_forward

配置 iptables 转发规则

1
2
3
4
5
6
7
8
9
10
# 1. 允许 NAT 表的 POSTROUTING 链进行地址伪装(适用于动态 IP 环境)
iptables -t nat -A POSTROUTING -j MASQUERADE

# 2. 允许内网网卡的转发请求
# 替换 [内网网卡名称] 为实际网卡(如 ens33、eth0)
iptables -A FORWARD -i [内网网卡名称] -j ACCEPT

# 3. 针对特定内网网段的地址转换(适用于静态 IP 环境)
# 替换 [内网网段](如 192.168.50.0/24)和 [外网网卡名称](如 ens37)
iptables -t nat -A POSTROUTING -s [内网网段] -o [外网网卡名称] -j MASQUERADE

示例(假设内网网卡为 ens33,外网网卡为 ens37,内网网段为 192.168.50.0/24):

1
2
3
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -i ens33 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o ens37 -j MASQUERADE

核心配置:设置端口映射规则

使用 iptablesDNAT(目的地址转换)实现端口映射,将外部请求转发到内部服务。

基本语法

1
2
3
4
5
# 将外部端口 [外网端口] 转发到内网 [内网地址]:[内网端口]
iptables -t nat -A PREROUTING -p tcp -m tcp --dport [外网端口] -j DNAT --to-destination [内网地址]:[内网端口]

# 如需支持 UDP 协议,替换 tcp 为 udp
iptables -t nat -A PREROUTING -p udp -m udp --dport [外网端口] -j DNAT --to-destination [内网地址]:[内网端口]

示例

1
2
3
4
5
# 将外部 6080 端口的 TCP 请求转发到内网 10.0.0.100 的 6090 端口
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 6080 -j DNAT --to-destination 10.0.0.100:6090

# 将外部 53 端口的 UDP 请求转发到内网 DNS 服务器 192.168.1.10 的 53 端口
iptables -t nat -A PREROUTING -p udp -m udp --dport 53 -j DNAT --to-destination 192.168.1.10:53

配置永久生效

以上配置在系统重启后会失效,需通过以下方式持久化:

方法 1:保存规则到文件(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装 iptables 持久化工具(部分系统默认已安装)
# CentOS/RHEL:
yum install iptables-services -y
# Ubuntu/Debian:
apt install iptables-persistent -y

# 保存当前规则
# CentOS/RHEL:
service iptables save
# Ubuntu/Debian:
netfilter-persistent save

# 验证规则是否保存
iptables-save

方法 2:添加到启动脚本(兼容旧系统)

将配置命令追加到 /etc/rc.local(需确保文件有执行权限):

1
2
3
4
5
6
7
8
9
10
11
12
# 编辑 rc.local
vi /etc/rc.local

# 在 exit 0 前添加以下内容(替换为实际配置)
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -i ens33 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o ens37 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 6080 -j DNAT --to-destination 10.0.0.100:6090

# 赋予执行权限
chmod +x /etc/rc.local

管理与验证规则

1. 查看已配置的规则

1
2
3
4
5
# 查看 nat 表中的规则(端口映射主要在此表)
iptables -t nat -L --line-numbers

# 查看所有表的规则
iptables -L -n

2. 删除规则

1
2
# 删除 nat 表 PREROUTING 链中第 1 条规则(--line-numbers 可查看序号)
iptables -t nat -D PREROUTING 1

3. 验证端口映射是否生效

1
2
3
4
5
# 从外部主机测试连接
telnet [外网IP] [外网端口]

# 或使用 curl 测试 HTTP 服务
curl http://[外网IP]:[外网端口]

注意事项

  1. 防火墙冲突:确保防火墙(如 firewalld、ufw)未阻止转发的端口,必要时关闭或添加对应规则。
  2. 网络接口名称:通过 ip addrifconfig 确认内网 / 外网网卡名称,避免配置错误。
  3. 动态 IP 环境:若外网 IP 动态变化,使用 MASQUERADE 而非 SNAT(固定 IP 用 SNAT 更高效)。
  4. 安全性:限制转发规则的源 IP 范围(如 -s 192.168.0.0/24),避免开放不必要的访问。

linux下端口映射

1. 允许数据包转发

1
2
3
echo 1 >/proc/sys/net/ipv4/ip_forwardiptables -t nat -A POSTROUTING -j MASQUERADEiptables -A FORWARD -i [内网网卡名称] -j ACCEPTiptables -t nat -A POSTROUTING -s [内网网段] -o [外网网卡名称] -j MASQUERADE
# 例:
echo 1 >/proc/sys/net/ipv4/ip_forwardiptables -t nat -A POSTROUTING -j MASQUERADEiptables -A FORWARD -i ens33 -j ACCEPTiptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o ens37 -j MASQUERADE

2. 设置端口映射

1
2
3
iptables -t nat -A PREROUTING -p tcp -m tcp --dport [外网端口] -j DNAT --to-destination [内网地址]:[内网端口]
# 例:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 6080 -j DNAT --to-destination 10.0.0.100:6090

如果需要永久配置,则将以上命令追加到/etc/rc.local文件

欢迎关注我的其它发布渠道