如何配置snat(让内网访问外网)和dnat(将外网请求转发到内网服务器)

配置 DNAT 和 SNAT 的核心是使用 iptables 的 nat 表,并确保内核已开启 IP 转发。

📌 前提:开启 IP 转发

NAT 涉及数据包在不同网络间转发,因此必须先启用内核的 ip_forward 功能。

bash 复制代码
# 临时生效
sudo sysctl -w net.ipv4.ip_forward=1

# 永久生效(推荐)
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

🔄 SNAT(源地址转换):让内网访问外网

SNAT 用于修改数据包的源 IP 地址 。典型场景是让私有内网(如 192.168.1.0/24)通过网关(服务器)的公网 IP 访问互联网。

规则需要添加到 POSTROUTING 链(数据包发出前最后一步处理)。

假设:

  • 内网网段:192.168.1.0/24
  • 网关公网接口:eth1
  • 网关公网 IP:203.0.113.1
bash 复制代码
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to-source 203.0.113.1

参数解释:

  • -t nat:指定使用 nat 表。
  • -A POSTROUTING:在 POSTROUTING 链追加规则。
  • -s 192.168.1.0/24:匹配来自该内网网段的流量。
  • -o eth1:匹配从 eth1 接口发出的流量。
  • -j SNAT:执行源地址转换。
  • --to-source 203.0.113.1:将源 IP 改为公网 IP 203.0.113.1。

替代方案: 如果公网 IP 是动态获取的(如 DHCP),建议使用 MASQUERADE,它会自动使用接口当前的 IP 地址,更省事。

bash 复制代码
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

🔀 DNAT(目的地址转换):将外网请求转发到内网服务器

DNAT 用于修改数据包的目的 IP 地址,常被称为"端口转发"。典型场景是将公网 IP 的 80 端口请求转发给内网的 Web 服务器。

规则需要添加到 PREROUTING 链(数据包到达后、路由决策前处理)。

假设:

  • 网关公网接口:eth1
  • 公网 IP:203.0.113.1
  • 内网 Web 服务器:192.168.1.10
bash 复制代码
# 将访问公网 80 端口的流量转发到内网 Web 服务器
sudo iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80

参数解释:

  • -A PREROUTING:在 PREROUTING 链追加规则。
  • -d 203.0.113.1:匹配目标是公网 IP 的流量。
  • -p tcp --dport 80:匹配 TCP 协议的 80 端口。
  • -j DNAT:执行目的地址转换。
  • --to-destination 192.168.1.10:80:将目的地址改为 192.168.1.10,端口改为 80。

注意 :DNAT 只负责修改地址,并不自动放行流量 。你还需要在 FORWARD 链中添加规则,允许转发到内网服务器的流量。

💾 保存规则(防止重启丢失)

iptables 规则默认是临时的,重启后会丢失。可以使用 iptables-persistent 工具来保存。

bash 复制代码
# Debian/Ubuntu
sudo apt install iptables-persistent
sudo netfilter-persistent save

# CentOS/RHEL 可使用 service iptables save

🔍 查看与调试

bash 复制代码
# 查看 nat 表的所有规则,带行号
sudo iptables -t nat -L -n -v --line-numbers

# 查看当前活动的 NAT 连接(需安装 conntrack)
sudo conntrack -L
相关推荐
yyuuuzz1 小时前
云服务器搭建个人博客记录:一次访问超时的复盘
运维·服务器·数据库
自变量yjs1 小时前
Linux --- 线程控制
linux·运维·服务器
陌上花开缓缓归以2 小时前
linux 内核4.4 内存分配使用分析
linux·运维·服务器
科技象限2 小时前
电脑防拍照系统:屏幕被手机拍走,还能追得回来吗
运维·网络安全·电脑·安企神
燕落南枝2 小时前
C 语言学习大总结:从入门到进阶的完整知识体系
服务器·c语言·学习
开开心心就好2 小时前
打印机卡住打不了?一键清理卡死打印队列
服务器·开发语言·算法·pdf·ocr·idea·visual studio code
茉莉玫瑰花茶2 小时前
GO [ 数据格式 ]
服务器·网络·算法·golang
欢乐的小猪2 小时前
Linux命令 chmod
linux·运维·服务器
silvamux_2 小时前
MCP 协议如何让大模型完成工具调用
大数据·服务器·elasticsearch·fastapi·vllm