SNAT 和 DNAT

https://bbs.huaweicloud.com/blogs/416624

由网络架构的需求和设备的配置决定的。同一台设备(如你的家用路由器、企业防火墙)通常可以同时执行这两种操作。

核心:关键在于“谁主动发起连接”。

 

核心区分点:连接的发起方向

 

  • SNAT (源地址转换):当内网设备主动访问外网时发生。它修改的是数据包的“来源地址”。

    • 目的:让内网众多设备共享一个或少量的公网IP上网,并隐藏内网结构。

    • 你的例子完全正确:家用路由器为内部手机、电脑提供的“上网功能”,就是最典型的SNAT。

  • DNAT (目标地址转换):当外网设备主动访问内网某服务时发生。它修改的是数据包的“目标地址”。

    • 目的:将公网IP上的某个服务(如Web、游戏端口)“映射”或“暴露”给内网的某台服务器。

    • 经典场景:你在家架设了一个网站服务器(IP: 192.168.1.100),想让它能从公网访问。你会在路由器上设置一条规则:“所有发往路由器公网IP的80端口(HTTP)的请求,都转发给内网的192.168.1.100:80”。这个过程就是DNAT。

 

 DNAT的核心是:修改数据包的"目标地址"和"目标端口"

实际应用场景分类
1. 端口映射/端口转发(最常见) 将公网IP的特定端口映射到内网服务器的端口。 # 常见配置:一对一端口映射 公网IP:443 → 内网服务器:443 公网IP:80 → 内网服务器:8080 公网IP:2222 → 内网服务器:22(SSH安全端口映射) 场景1:家庭NAS远程访问 家庭路由器配置: - 公网IP: 114.114.114.114 - 内网NAS: 192.168.1.100 配置DNAT规则: 1. 外部访问 114.114.114.114:5000 → 内网 192.168.1.100:5000(Web管理界面) 2. 外部访问 114.114.114.114:32400 → 内网 192.168.1.100:32400(Plex媒体服务器) 3. 外部访问 114.114.114.114:2222 → 内网 192.168.1.100:22(SSH管理) 场景2:企业对外服务发布 公司防火墙配置: - 公网IP: 202.96.128.86 - 内网服务器: 网站服务器:10.0.0.10:80 邮件服务器:10.0.0.20:25,143,993 FTP服务器:10.0.0.30:21 配置DNAT规则: iptables -t nat -A PREROUTING -d 202.96.128.86 -p tcp --dport 80 -j DNAT --to 10.0.0.10:80 iptables -t nat -A PREROUTING -d 202.96.128.86 -p tcp --dport 443 -j DNAT --to 10.0.0.10:443 iptables -t nat -A PREROUTING -d 202.96.128.86 -p tcp --dport 25 -j DNAT --to 10.0.0.20:25 iptables -t nat -A PREROUTING -d 202.96.128.86 -p tcp --dport 21 -j DNAT --to 10.0.0.30:21 2. 负载均衡分发 将公网IP的流量分发到多个内网服务器。 # 负载均衡DNAT示例 用户访问 202.96.128.86:80 ↓ 轮询分发到: 1. Web服务器1: 10.0.0.11:80 2. Web服务器2: 10.0.0.12:80 3. Web服务器3: 10.0.0.13:80 实际配置(使用iptables + ipvs): # 创建负载均衡池 ipvsadm -A -t 202.96.128.86:80 -s rr ipvsadm -a -t 202.96.128.86:80 -r 10.0.0.11:80 -m ipvsadm -a -t 202.96.128.86:80 -r 10.0.0.12:80 -m ipvsadm -a -t 202.96.128.86:80 -r 10.0.0.13:80 -m # DNAT规则 iptables -t nat -A PREROUTING -d 202.96.128.86 -p tcp --dport 80 -j REDIRECT --to-ports 8080 3. 协议转换和端口重定向 场景:将HTTP自动重定向到HTTPS # 用户访问 http://example.com:80 自动转到 https://example.com:443 iptables -t nat -A PREROUTING -d 202.96.128.86 -p tcp --dport 80 -j REDIRECT --to-port 443 # 或者转发到另一台服务器的HTTPS iptables -t nat -A PREROUTING -d 202.96.128.86 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.10:443 场景:不同协议转发 # 将SMB共享(445端口)转发到特定服务器 iptables -t nat -A PREROUTING -d 202.96.128.86 -p tcp --dport 445 -j DNAT --to-destination 10.0.0.40:445 # 将远程桌面(3389)转发到内网电脑 iptables -t nat -A PREROUTING -d 202.96.128.86 -p tcp --dport 13389 -j DNAT --to-destination 192.168.1.50:3389 4. 故障转移和高可用 当主服务器宕机时,自动将流量切换到备用服务器。

  

不同设备上的DNAT配置

1. 家用路由器(TP-Link/华硕等)
通过图形界面配置

位置:转发规则 → 虚拟服务器
规则1:
  服务端口:8080
  内部端口:80
  IP地址:192.168.1.100
  协议:TCP


2. Linux iptables(最灵活)

# 基本DNAT
iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 外部端口 \
         -j DNAT --to-destination 内网IP:内部端口


3. 企业防火墙配置示例
华为防火墙:
思科ASA防火墙:

  

image

 

image

 负载均衡器对外是“一个入口”,对内是“多个目标”,DNAT负责把每个进来的请求动态转发到不同内网服务器。

 

案例:

wechatmini.xx.com:443 -> 112.122.2.223:443 -> 内网192.168.80.22:443 (nginx:443)

这是一个非常典型的对外提供Web服务的架构
dns:
112.122.2.223 wechatmini.xx.com
网闸: 112.122.2.223:443 -> 192.168.80.22:443

原理:直接端口转发(DNAT)

  流量方向:

  • 外网访问内网:微信小程序用户访问xx服务

  • 这是典型的DNAT(端口转发/反向代理)

 

DNS解析流程

客户端(微信小程序)访问流程:
1. 用户打开微信小程序
2. 小程序代码请求 wechatmini.xx.com
3. DNS解析过程:
   客户端 → 本地DNS缓存 → 公共DNS(如114.114.114.114) 
          → 权威DNS(xx.com的DNS服务器)
          → 返回 A 记录:112.122.2.223
4. 客户端获得IP地址:112.122.2.223

  

网络访问流程(详细步骤)

时序图:

微信小程序                          公网IP                       边界设备                         内网Nginx
     |                              |                            |                                 |
     | 1. DNS解析: wechatmini.xx.com |                            |                                 |
     |------------------------------>|                            |                                 |
     | 返回: 112.122.2.223          |                            |                                 |
     |<------------------------------|                            |                                 |
     |                              |                            |                                 |
     | 2. TCP三次握手: 112.122.2.223:443 |                        |                                 |
     |------------------------------>|                            |                                 |
     |   SYN                         |                            |                                 |
     |                               | 3. DNAT: 112.122.2.223:443 |                                 |
     |                               |    → 192.168.80.22:443    |                                 |
     |                               |--------------------------->|                                 |
     |                               |         SYN               |                                 |
     |                               |<---------------------------|                                 |
     |                               |         SYN-ACK           |                                 |
     |<------------------------------|         ACK              |                                 |
     |   SYN-ACK, ACK               |                            |                                 |
     |                              |                            |                                 |
     | 4. SSL/TLS握手               |                            |                                 |
     |------------------------------>|                            |                                 |
     |   ClientHello                |                            |                                 |
     |                               |--------------------------->|                                 |
     |                               |                           | 5. Nginx处理SSL                  |
     |                               |                           |   - 验证域名: wechatmini.xx.com  |
     |                               |                           |   - 使用证书私钥解密            |
     |                               |                           |   - 生成会话密钥               |
     |                               |<---------------------------|                                 |
     |<------------------------------|   ServerHello, Certificate|                                 |
     |   Key Exchange, Finished     |   ChangeCipherSpec, Finished |                              |
     |------------------------------>|                            |                                 |
     |   ChangeCipherSpec, Finished |--------------------------->|                                 |
     |                              |                            |                                 |
     | 6. HTTPS应用数据传输         |                            |                                 |
     |<==============================|============================|================================>|

  

posted @ 2025-12-23 13:47  Peter.Jones  阅读(6)  评论(0)    收藏  举报