当前位置: 首页 > news >正文

【计算机网络】Linux配置SNAT/DNAT策略

什么是NAT?

NAT 全称是 Network Address Translation(网络地址转换),是一个用来在多个设备共享一个公网 IP上网的技术。

NAT 的核心作用:将一个网络中的私有 IP 地址,转换为公网 IP 地址,从而实现上网功能。

没有NAT的情况:
在这里插入图片描述

环境准备

VMware 创建两台 Linux 虚拟机:

server1:nat-router
  • 作用: NAT 路由器,作为网络地址转换的中介。
  • 网卡配置:
    • ens32:NAT 模式(连接外网)
    • ens33:仅主机模式(与 server2 通信)
[root@nat-router ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
BOOTPROTO=static
NAME=ens32
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.100.202
NEKMASK=255.255.255.0
GATEWAY=192.168.100.2
DNS1=223.5.5.5
DNS2=8.8.8.8[root@nat-router ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.200.253
NETMASK=255.255.255.0
server2:nat-client
  • 作用: NAT 客户端,通过 server1 上网。
  • 网卡配置:
    • ens32:仅主机模式(连接 server1)
[root@nat-client ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
BOOTPROTO=static
NAME=ens32
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.200.201
NEKMASK=255.255.255.0
GATEWAY=192.168.200.253
DNS1=223.5.5.5

NAT 实现原理

使用 iptables 实现 NAT 转换

  • iptables 是一个 防火墙工具,用于配置 Linux 内核的网络行为。
  • 本身不做 NAT 转换,它的作用是 告诉内核怎么做

实际执行 NAT 转换的是 Linux 内核

  • 负责对底层网络数据包进行管理、处理与转发。
  • 管理网卡、路由、数据包过滤等功能。
NAT 数据包处理流程:
人(配置命令) -> iptables(设置规则) -> 内核(执行SNAT) -> 网络通信

防火墙(Firewall)概念

  • 作用: 管控进出网络的数据,防止非法访问或数据泄露。
  • Linux 中常见防火墙工具有:
    • iptables(传统,功能强大)
    • firewalld(基于 zone 的新型防火墙,CentOS 7+ 默认)

SNAT配置

server1(NAT 路由器)上配置 SNAT(源地址转换)

# 清除规则
iptables -F
iptables -t nat -F
  • 清除原有的 iptables 规则,避免旧规则干扰。
    • -F:清空 filter 表(默认表)的所有规则。
    • -t nat -F:清空 nat 表的所有规则。
# 开启路由功能
echo 1 > /proc/sys/net/ipv4/ip_forward
  • 启用 IP 转发,使 Linux 内核可以作为路由器转发数据包。
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o ens32 -j SNAT --to-source 192.168.100.202
  • 设置 SNAT 规则:
    • -t nat:操作 NAT 表。
    • -A POSTROUTING:在数据包离开本机之前改变源地址。
    • -s 192.168.200.0/24:匹配从 nat-client 发来的内网地址段。
    • -o ens32:数据包从哪张网卡出去(外网网卡)。
    • -j SNAT --to-source 192.168.100.202:将源地址改成 server1 外网 IP。
[root@nat-router ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destinationChain INPUT (policy ACCEPT)
target     prot opt source               destinationChain OUTPUT (policy ACCEPT)
target     prot opt source               destinationChain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  192.168.200.0/24     0.0.0.0/0            to:192.168.100.202

nat-client测试网络情况

                             My traceroute  [v0.85]
nat-client (0.0.0.0)                                   Sat Apr  5 22:15:10 2025
Keys:  Help   Display mode   Restart statistics   Order of fields   quitPackets               PingsHost                                Loss%   Snt   Last   Avg  Best  Wrst StDev1. 192.168.200.253                   0.0%     7    0.5   0.5   0.4   0.7   0.02. 192.168.100.2                     0.0%     7    0.5   0.7   0.4   1.3   0.03. ???

可以看到正常转发网络请求
在这里插入图片描述

DNAT 配置

什么是 DNAT?

DNAT(Destination Network Address Translation,目的地址转换)是一种 NAT 技术,用于将 访问公网 IP 的请求转发到内网指定主机

  • 常见于部署在路由器上的 端口映射 功能,比如访问公网 80 端口,就自动转发到内网 Web 服务器的 80 端口。

使用场景

假设你希望让外部主机访问 192.168.100.202:80(server1 公网 IP + 端口),但实际要访问的是 内网的 server2(192.168.200.201)的 Web 服务


开启 DNAT 转发规则

iptables -t nat -A PREROUTING -i ens32 -d 192.168.100.202 -p tcp --dport 80 -j DNAT --to-destination 192.168.200.201
  • -t nat:操作 NAT 表。
  • -A PREROUTING:在数据包进入防火墙(内核处理)前修改其目标地址。
  • -i ens32:从外网接口进来的数据包。
  • -d 192.168.100.202:目的 IP 是 server1 的公网 IP。
  • -p tcp --dport 80:匹配 TCP 协议的 80 端口(Web 请求)。
  • -j DNAT --to-destination 192.168.200.201:将请求转发到内网 server2 的 IP 地址。

开启 IP 转发功能(如果还没启)

echo 1 > /proc/sys/net/ipv4/ip_forward
  • 允许 Linux 内核像路由器一样转发数据包。

查看 DNAT 配置是否生效

iptables -t nat -nL PREROUTING
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  0.0.0.0/0            192.168.100.202       tcp dpt:80 to:192.168.200.201

访问验证

从任意一台外部机器(能访问 server1)访问:

curl http://192.168.100.202

如果 server2(192.168.200.201)运行着 Web 服务,会成功响应!


可选:如果 server2 没有默认网关指向 server1,还需配置 SNAT(返回地址转换)

如果 server2 的返回数据包没有经过 server1,那么客户端可能收不到响应。这时需要配合 SNAT:

iptables -t nat -A POSTROUTING -d 192.168.200.201 -j SNAT --to-source 192.168.200.253
  • 强制 server2 把响应发回 server1,再由 server1 转发出去。

这种 DNAT+SNAT 的搭配也叫 双向 NAT,常用于网络地址“伪装”或负载均衡。


结构图示意:

   ┌─────────────┐│  外部客户端  │└─────┬───────┘↓┌────────────────────┐│   server1 (NAT网关) ││ ens32: 192.168.100.202│ ens33: 192.168.200.253└────────┬───────────┘↓ DNAT转发┌────────────────────┐│  server2 (内网Web) ││ ens32: 192.168.200.201└────────────────────┘

总结:SNAT 与 DNAT 的区别

类型全称修改内容作用方向常用于
SNATSource NAT源 IP 地址出去的包内网访问公网(上网)
DNATDestination NAT目的 IP 地址进入的包公网访问内网服务(端口映射)

http://www.mrgr.cn/news/97299.html

相关文章:

  • Android学习总结之算法篇五(字符串)
  • Java基础-设计模式详解
  • [项目总结] 在线OJ刷题系统项目技术应用(上)
  • 燕山大学计算机网络实验(包括实验指导书)
  • 7B斗671B:扩散模型能否颠覆自回归霸权?
  • 网络编程—TCP/IP模型(TCP协议)
  • 通过Postman和OAuth 2.0连接Dynamics 365 Online的详细步骤
  • Java 进化之路:从 Java 8 到 Java 21 的重要新特性
  • 数据库原理
  • (二)输入输出处理——打造智能对话的灵魂
  • AI Agent开发大全第二十课-如何开发一个MCP(从0开发一个MCP Server)
  • 250405-VSCode编辑launch.json实现Debug调试Open-WebUI
  • Android学习总结之应用启动流程(从点击图标到界面显示)
  • STM32F103C8T6实现 SG90 180 °舵机任意角度转动
  • 【蓝桥杯】算法笔记3
  • JJJ:generic netlink例程分析
  • Flask+Vue构建图书管理系统及Echarts组件的使用
  • 第3课:状态管理与事件处理
  • 高级:分布式系统面试题精讲
  • 一、简单的 Django 服务