第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

八、思考

  1. NAT 服务器映射(端口映射)和 Easy-IP 有什么不同?各解决什么问题?
  2. 外网用户访问 http://100.1.1.1:80 是怎么到达内网 10.0.1.100:80 的?写出路由器上的转换过程。
  3. 为什么要做端口转换(如公网 2222 → 内网 22)?什么时候需要?
  4. 什么是 NAT 环回问题?怎么解决?
  5. 如果内网有两台 Web 服务器都需要发布 80 端口,只有一个公网 IP,怎么实现?
  6. 写一个配置:公网 IP 100.1.1.1,内网 10.0.1.200 的 80 端口映射到公网 8080 端口。

下篇预告:第45篇《NAT穿越问题与ALG》——理解NAT穿越问题和ALG(应用层网关)的解决原理。