第44篇:NAT 服务器映射——内网服务器对外发布
一、写在前面
Easy-IP 解决了"内网上外网"的问题。但反过来——外网用户怎么访问内网的服务器?
比如公司的官网服务器在内网 10.0.1.100:80,外网用户通过公网 IP 100.1.1.1 访问,如果没有配置,NAT 只会拒绝外网主动发起的连接。
NAT 服务器映射(也叫端口映射、NAT Destination、NAT Static with Port)就是解决这个问题的——把公网 IP + 端口映射到内网服务器的 IP + 端口。
二、服务器映射原理
外网用户访问:
http://100.1.1.1:80
路由器收到:
目的 IP: 100.1.1.1
目的端口: TCP 80
查看服务器映射表:
公网 100.1.1.1:80 → 内网 10.0.1.100:80
修改数据包:
目的 IP: 10.0.1.100
目的端口: 80
转发给内网服务器。
三、配置方法
3.1 方式一:nat server(推荐)
[Router] interface gigabitethernet 0/0/1
[Router-GigabitEthernet0/0/1] ip address 100.1.1.1 255.255.255.0
# 将公网 IP 的 80 端口映射到内网服务器 10.0.1.100 的 80 端口
[Router] nat server protocol tcp global current-interface 80 inside 10.0.1.100 80
3.2 方式二:指定公网 IP(如果接口有多个公网 IP)
# 明确指定公网 IP 而不是 current-interface
[Router] nat server protocol tcp global 100.1.1.100 80 inside 10.0.1.100 80
3.3 多个服务映射
# Web 服务
[Router] nat server protocol tcp global current-interface 80 inside 10.0.1.100 80
# HTTPS 服务
[Router] nat server protocol tcp global current-interface 443 inside 10.0.1.100 443
# FTP 服务
[Router] nat server protocol tcp global current-interface 21 inside 10.0.1.101 21
# SSH 远程管理内网服务器(映射到不同端口,避免冲突)
[Router] nat server protocol tcp global current-interface 2222 inside 10.0.1.100 22
# 远程桌面
[Router] nat server protocol tcp global current-interface 3389 inside 10.0.2.200 3389
四、完整案例:企业对外服务发布
4.1 需求
公网 IP:100.1.1.1(企业出口路由器)
Web 服务器:10.0.1.100 → 对外发布 80/443
邮件服务器:10.0.2.100 → 对外发布 25/110/143/587
FTP 服务器:10.0.3.100 → 对外发布 21
SSH 管理跳板机:10.0.100.10 → 对外发布 2222(映射到 22)
4.2 配置
[Router] interface gigabitethernet 0/0/1
[Router-GigabitEthernet0/0/1] ip address 100.1.1.1 255.255.255.0
# Web 服务
[Router] nat server protocol tcp global current-interface 80 inside 10.0.1.100 80
[Router] nat server protocol tcp global current-interface 443 inside 10.0.1.100 443
# 邮件服务
[Router] nat server protocol tcp global current-interface 25 inside 10.0.2.100 25
[Router] nat server protocol tcp global current-interface 110 inside 10.0.2.100 110
[Router] nat server protocol tcp global current-interface 143 inside 10.0.2.100 143
[Router] nat server protocol tcp global current-interface 587 inside 10.0.2.100 587
# FTP
[Router] nat server protocol tcp global current-interface 21 inside 10.0.3.100 21
# 跳板机 SSH(端口转换,公网 2222 → 内网 22)
[Router] nat server protocol tcp global current-interface 2222 inside 10.0.100.10 22
4.3 验证
[Router] display nat server
NAT Server Information:
Server Name Inside IP Port Global IP Port
-----------------------------------------------------------------
http 10.0.1.100 80 100.1.1.1 80
https 10.0.1.100 443 100.1.1.1 443
smtp 10.0.2.100 25 100.1.1.1 25
pop3 10.0.2.100 110 100.1.1.1 110
ssh-jump 10.0.100.10 22 100.1.1.1 2222
五、映射前后端口不同
上一节的 SSH 跳板机用了端口转换——公网 2222 端口映射到内网 22 端口。
为什么要端口转换?
| 原因 | 说明 |
|---|---|
| 避免冲突 | 公网 IP 的 22 端口可能被路由器自己的 SSH 占用 |
| 安全考虑 | 改端口可以防止自动扫描 |
| 多台服务器同端口 | 两台内网服务器的 SSH(22/22)需要映射到公网不同端口 |
# 公网 2222 → 内网 10.0.100.10:22
nat server protocol tcp global current-interface 2222 inside 10.0.100.10 22
# 公网 2223 → 内网 10.0.100.11:22
nat server protocol tcp global current-interface 2223 inside 10.0.100.11 22
六、NAT 环回问题
6.1 问题描述
内网用户通过 公网 IP(100.1.1.1)访问内网服务器
路由器
/ \
内网用户 内网服务器
内网用户访问 http://100.1.1.1
→ 数据包到路由器
→ 路由器做 NAT 转换 → 10.0.1.100
→ 转发给内网服务器 → 服务器回复
→ 回复包的目的 IP 是内网用户的私网 IP
→ 但服务器直连路由器,可能会直接回复给用户(不经过路由器)
→ 用户的源 IP 是私网 IP,服务器的回复包的目的 IP 也是私网 IP
→ 但回复不经过 NAT 处理 → 用户的 TCP 状态不匹配 → 不通!
6.2 解决方案
# 开启 NAT 环回功能(DNS Mapping + NAT ALG)
[Router] nat dns-map
[Router] nat alg all enable
部分华为设备需要额外配置:
# 在入接口也做 NAT
[Router] interface gigabitethernet 0/0/0
[Router-GigabitEthernet0/0/0] nat server protocol tcp global current-interface 80 inside 10.0.1.100 80
或者最简单的方案——内网用户直接用内网 IP 访问服务器。
七、安全注意事项
| 措施 | 说明 |
|---|---|
| 只映射必要端口 | 不要映射 1-65535 全端口 |
| 使用非标准端口 | 如 SSH 用 2222 代替 22 |
| 结合安全策略 | 配合 ACL 限制映射的源 IP 范围 |
| 定期审计 | 检查不再使用的映射及时清理 |
限制某个映射只能被特定外网 IP 访问
# ACL:只允许特定外网 IP 访问 SSH 跳板机
[Router] acl 3000
[Router-acl-adv-3000] rule 5 permit tcp source 59.100.1.0 0.0.0.255 destination any eq 2222
[Router-acl-adv-3000] rule 10 deny tcp source any destination any eq 2222
[Router] interface gigabitethernet 0/0/1
[Router-GigabitEthernet0/0/1] traffic-filter inbound acl 3000
八、思考
- NAT 服务器映射(端口映射)和 Easy-IP 有什么不同?各解决什么问题?
- 外网用户访问
http://100.1.1.1:80是怎么到达内网 10.0.1.100:80 的?写出路由器上的转换过程。 - 为什么要做端口转换(如公网 2222 → 内网 22)?什么时候需要?
- 什么是 NAT 环回问题?怎么解决?
- 如果内网有两台 Web 服务器都需要发布 80 端口,只有一个公网 IP,怎么实现?
- 写一个配置:公网 IP 100.1.1.1,内网 10.0.1.200 的 80 端口映射到公网 8080 端口。
下篇预告:第45篇《NAT穿越问题与ALG》——理解NAT穿越问题和ALG(应用层网关)的解决原理。