网络与 IP

端口映射是什么意思?作用、设置方法与外部端口怎么选

端口映射就是在出口的 NAT 设备上写一条规则:发到公网 IP 某个端口的连接,转给内网某台主机的某个端口。内网服务器只有私网地址,外网无法直接访问,做了映射,外部访问“公网 IP:端口”就能到达它。外部端口可以和内部不同,但要避开设备自身占用和运营商封锁的端口,并且只对需要的来源开放。

作者 顶联产品团队发布于 8 分钟阅读

端口映射是什么意思?端口映射(Port Mapping)是在路由器、防火墙这类做 NAT 的出口设备上配置的一条规则:凡是发到“公网 IP:外部端口”的连接,都改写目标地址,转给“内网 IP:内部端口”。比如出口公网 IP 是 203.0.113.10,内网 Web 服务器是 192.168.10.20:443,配置一条“TCP 8443 → 192.168.10.20:443”的映射,外网用户访问 203.0.113.10:8443,就打开了这台内网服务器上的网站。它在技术上叫目的地址转换(DNAT),路由器界面里常叫“虚拟服务器”“端口转发”,华为、H3C 防火墙上叫 NAT Server。端口映射的作用,是让只有私网地址的服务器能被外网访问,同时一个公网 IP 可以按端口分给多台内网主机使用。

为什么 NAT 后面的服务器要映射才能被访问

内网主机用的是 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 这类私网地址,公网上不路由。主机访问外网时,出口设备做源地址转换(SNAT),把源地址换成公网 IP,并在连接跟踪表里记下这条连接,回包按记录转回内网主机。这个过程是“里面先发起”的,所以上网没问题。

反过来,外网主动连 203.0.113.10:8443 时,出口设备的连接表里没有任何记录,不知道该交给内网哪台机器,只能丢弃或者当作访问自己。端口映射就是事先告诉它:这个端口的新连接,交给 192.168.10.20:443。

一次访问的地址变化如下:

阶段 源地址:端口 目的地址:端口
外网用户发出 198.51.100.7:51000 203.0.113.10:8443
出口设备做 DNAT 后 198.51.100.7:51000 192.168.10.20:443
服务器回包 192.168.10.20:443 198.51.100.7:51000
出口设备还原后发出 203.0.113.10:8443 198.51.100.7:51000

从表里可以看出两个前提:

  • 出口必须有真正的公网 IP。路由器 WAN 口的地址如果是 100.64.0.0/10(运营商级 NAT 专用段)或者 10.x、192.168.x 这类私网地址,说明上面还有一层 NAT,在自己的路由器上做映射不会生效。
  • 回包必须经过同一台设备。服务器的默认网关要指向做映射的设备,回包才能被还原。服务器有两个出口时,回包从另一个出口出去,源地址没被改回 203.0.113.10:8443,客户端会直接丢掉。

正因为回包本来就经过出口设备,标准的端口映射不需要改源地址,服务器日志里看到的是用户的真实 IP。这一点和中转机上的端口转发不同,后者通常要同时做 SNAT,服务器看到的是中转机的地址。

端口映射常见的用途:在办公室或家里发布网站、NAS、监控录像机;在公司出口把几台内网服务器的服务用一个公网 IP 发布出去;云上多台没有公网 IP 的实例共用一个 NAT 网关对外服务;NAT 方式的 VPS 由商家按端口分给用户。

端口映射怎么设置:三类设备的写法

路由器与企业防火墙

家用和小型办公路由器在管理页面里设置,菜单名称因品牌而异,常见的有“虚拟服务器”“端口转发”“NAT 规则”。要填的字段大同小异:

字段 填什么
外部端口 公网上访问用的端口,例如 8443;可以填范围
内部 IP 内网服务器地址,例如 192.168.10.20
内部端口 服务实际监听的端口,例如 443
协议 TCP、UDP 或全部
WAN 接口 多线路出口时选从哪条线进来

内网服务器的地址要固定,用静态 IP 或在路由器上做 DHCP 地址保留;否则重启后换了地址,映射就指向了别的设备。家里如果是“光猫拨号、路由器再接光猫”的两级结构,路由器 WAN 口拿到的是光猫分的私网地址,要么在光猫上再映射一次到路由器,要么把光猫改成桥接、由路由器拨号。

企业防火墙用命令配置。华为 USG 系列防火墙:

nat server web8443 protocol tcp global 203.0.113.10 8443 inside 192.168.10.20 443 no-reverse

no-reverse 表示只做外到内的映射,不额外生成内网主机主动外出时的反向转换。配好之后还要写一条安全策略放行这条流量,策略里的目的地址要写转换后的内网地址 192.168.10.20,而不是公网地址,因为防火墙先做 NAT Server 转换、再匹配安全策略。

思科 IOS 路由器:

interface GigabitEthernet0/0
 ip nat outside
interface GigabitEthernet0/1
 ip nat inside
exit
ip nat inside source static tcp 192.168.10.20 443 203.0.113.10 8443

同一台内网主机映射多个端口时,规则末尾要带 extendable 关键字。各型号的具体语法以设备版本的命令手册为准。

Linux 网关:iptables DNAT

Linux 做出口网关时(eth0 接公网 203.0.113.10,eth1 接内网 192.168.10.0/24),把外部 8443 映射到 Web 服务器的 443,再把外部 2222 映射到它的 SSH,并且只允许运维网段 198.51.100.0/24 访问:

sysctl -w net.ipv4.ip_forward=1        # 长期生效要写进 /etc/sysctl.d/ 下的配置文件

# 改目的地址:8443 → 192.168.10.20:443
iptables -t nat -A PREROUTING -i eth0 -d 203.0.113.10 -p tcp --dport 8443 \
  -j DNAT --to-destination 192.168.10.20:443
# 2222 → 192.168.10.20:22,只对运维网段生效
iptables -t nat -A PREROUTING -i eth0 -s 198.51.100.0/24 -d 203.0.113.10 -p tcp --dport 2222 \
  -j DNAT --to-destination 192.168.10.20:22

# 放行转发:这里写转换后的地址和端口
iptables -A FORWARD -i eth0 -o eth1 -d 192.168.10.20 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -s 198.51.100.0/24 -d 192.168.10.20 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

内网服务器的默认网关是 192.168.10.1(这台 Linux),回包自然经过它,由连接跟踪自动把源地址改回 203.0.113.10:8443,不需要再写 SNAT。用 iptables -t nat -L PREROUTING -n -v 看规则前面的包计数在不在涨,就知道外部访问有没有命中。规则重启后会丢失,要用发行版的方式保存。

还有一个常被问到的现象:外网能访问,内网用公网地址访问却不通。内网的电脑 192.168.10.50 访问 203.0.113.10:8443,请求被 DNAT 到 192.168.10.20,但服务器发现客户端和自己在同一网段,直接回包给 192.168.10.50;电脑等的是 203.0.113.10 的回包,收到一个陌生地址发来的包,连接建不起来。这叫 NAT 回流(Hairpin NAT)问题,解决办法是在内网侧也做 DNAT,同时把源地址换成网关,让回包绕回网关:

iptables -t nat -A PREROUTING -i eth1 -d 203.0.113.10 -p tcp --dport 8443 \
  -j DNAT --to-destination 192.168.10.20:443
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.10.0/24 -d 192.168.10.20 -p tcp --dport 443 \
  -j MASQUERADE
iptables -A FORWARD -i eth1 -o eth1 -d 192.168.10.20 -p tcp --dport 443 -j ACCEPT

另一种办法是内网 DNS 把域名直接解析到 192.168.10.20,内网用户就不经过映射了。

云平台的 NAT 网关

云上的实例只有私网地址时,在 NAT 网关上添加 DNAT 条目(不同平台叫端口映射、端口转发或 DNAT 规则),字段基本一致:

字段 示例 说明
公网 IP 203.0.113.30 绑定在 NAT 网关上的弹性公网 IP
公网端口 8443 外部访问用的端口
私网 IP 172.16.0.20 实例的内网地址
私网端口 443 实例上服务监听的端口
协议 TCP UDP 要另加一条

配完还要在实例的安全组里放行私网端口 443,来源按需要限制。是否需要把子网路由指向 NAT 网关、实例另外绑了弹性公网 IP 时 DNAT 是否生效,各平台规则不同,以平台文档为准;也不是所有云平台的 NAT 网关都支持 DNAT,有的只做出方向的 SNAT。只有一台实例要对外服务时,直接给它绑弹性公网 IP 更简单;多台实例共用一个公网 IP,才需要用 NAT 网关按端口分。

外部端口怎么选:端口随便设吗

外部端口的取值范围是 1–65535,技术上大部分都能用,但下面几条决定了“能用”和“好用”的区别:

  1. 给公众用的服务尽量用标准端口。网站用 80 和 443,访问时不用在网址里带端口号;邮件的 25 端口是协议约定,对方服务器只会连 25,不能改。
  2. 避开出口设备自己占用的端口。路由器管理页面常用 80、443、8080,防火墙的 SSL VPN 常用 443,Linux 网关自己的 SSH 是 22。映射了同一个端口,要么规则不生效,要么把自己的管理入口挡在外面。
  3. 家庭宽带避开被封锁的端口。不少家庭宽带封锁入方向的 80、443、8080 等端口,具体以运营商为准,这时改用 8443、18080 这类端口。
  4. 网页服务避开浏览器拦截的端口。Chrome 会拒绝访问 6000、6665–6669、10080 等端口并报 ERR_UNSAFE_PORT,Firefox 也有类似的拦截列表,映射本身没问题,浏览器就是不打开。
  5. 同一个公网 IP、同一种协议的一个端口,只能映射给一台主机。TCP 8443 和 UDP 8443 是两个端口,可以分给不同的主机。
  6. 换个冷门端口不等于安全。扫描器会扫遍全部 65535 个端口,把 22 改成 2222 只能减少一些自动化的撞库日志。SSH、3389、数据库端口映射出去,必须加来源限制或改用 VPN。

选好之后,把每条映射记成一张表:公网 IP、外部端口、协议、内网 IP、内部端口、用途、负责人、来源限制。半年后没人记得 18080 为什么开着,是映射规则越积越多、最终出事的常见原因。

端口映射和端口转发、DMZ 的区别

名称 做什么 服务器看到的来源地址 适用场景
端口映射(DNAT、虚拟服务器、NAT Server) 公网 IP 的指定端口转给内网主机的指定端口 用户真实 IP 出口设备上发布内网服务
端口转发 泛指把某个端口收到的流量转到别处,包括端口映射、中转机转发、SSH 隧道、用户态转发程序 视实现而定,用户态转发和做了 SNAT 的,看到的是转发机的地址 线路中转、跳板访问
DMZ 主机 公网 IP 上没被占用的全部端口都转给一台内网主机 用户真实 IP 家用路由器图省事的做法,主机完全暴露,不建议
一对一 NAT(静态 NAT) 一个公网 IP 整体对应一个内网 IP 用户真实 IP 出口有多个公网 IP 时,给一台服务器独占一个
内网穿透 内网客户端主动连出,公网服务器经隧道反向转发 穿透客户端的地址 出口没有公网 IP

日常说话里“端口映射”和“端口转发”经常混用,路由器界面里两个词指的也常是同一个功能。服务器需要看到用户真实 IP(日志、访问控制、风控)时,要用出口设备上的 DNAT,而不是用户态的转发程序。

端口映射软件

所谓端口映射软件,大多是在一台机器上监听端口、再把连接转到另一个地址的用户态程序,适合临时使用或者没有出口设备权限的场景:

# Windows 自带的 portproxy,只支持 TCP,依赖 IP Helper 服务
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8443 connectaddress=192.168.10.20 connectport=443
netsh interface portproxy show all
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=8443
# Linux 上用 socat 临时转发一个 TCP 端口
socat TCP-LISTEN:8443,fork,reuseaddr TCP:192.168.10.20:443

长期使用还可以选 rinetd、HAProxy、Nginx 的 stream 模块。这些程序在本机监听端口,所以本机防火墙要放行监听端口,也要避开系统的临时端口范围(Linux 默认 32768–60999,Windows 默认 49152–65535)。另外,路由器上的 UPnP 功能会让内网程序自动给自己开映射,服务器所在的网络建议关闭它,所有映射都由管理员手工配置、登记。

映射了还是访问不通,按这个顺序查

顺序 检查什么 怎么查
1 是不是在内网测的 用手机流量或外部服务器测试:nc -zv 203.0.113.10 8443,Windows 用 Test-NetConnection 203.0.113.10 -Port 8443;内网测不通可能只是 NAT 回流问题
2 出口是不是真公网 IP 对比路由器 WAN 口地址和对外显示的公网 IP,不一致或者是 100.64.x.x,就是上面还有 NAT
3 服务有没有监听在对的地址 服务器上 ss -tlnp 看监听地址,只监听 127.0.0.1 的服务外部永远连不上
4 服务器本机防火墙 放行的是内部端口 443,不是外部端口 8443
5 服务器的默认网关 必须指向做映射的设备,多网卡、多出口时最容易出错
6 规则是否命中 协议选对没有、内网 IP 有没有变;Linux 看 nat 表计数,防火墙看会话表
7 运营商是否封了端口 换一个外部端口再测,换了就通,基本可以确定是封锁

在管理系统里怎么落地

IDC 机房里,客户的服务器通常直接配公网 IP,不需要端口映射;最容易出现的“映射”反而是不该做的那种:为了远程处理故障,把服务器 BMC 的 Web、远程控制台端口映射到公网。BMC 拥有整台服务器的控制权,暴露在公网上风险很高。Toplink DCIM 的做法是 BMC 接入独立的管理网络,由部署在各机房的 DCIM 从节点就近连接,运维人员只访问 DCIM 后台,在 IPMI 远程管理里打开浏览器控制台,不需要为任何 BMC 端口做映射。BMC 用的地址段可以在 IP 地址管理里标记为 IPMI 类型,与公网 IP、客户内网分开登记和统计。

常见问题

宽带的公网 IP 隔一段时间就变,映射还能用吗?

路由器上的映射规则跟着 WAN 口走,公网 IP 变了规则照样生效,变的只是外部访问的地址。在路由器上开启 DDNS(动态域名),让一个域名自动跟随当前的公网 IP,外部改用域名访问即可。

UDP 端口也能映射吗?

能,但 TCP 和 UDP 是两套端口,要分别写规则。游戏、语音、部分 VPN 服务两种协议都要用,路由器界面里协议选“全部”或“TCP+UDP”,iptables 则各写一条。

没有公网 IP,外网还能访问内网服务吗?

可以向运营商申请公网 IP;访问双方都有 IPv6 时可以直接用 IPv6 地址访问,但要在光猫或路由器上放行入方向的连接;也可以用内网穿透,经一台有公网 IP 的服务器反向转发。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88