Linux怎么配置NAT转换_Linux如何用iptables做地址转换【教程】

陌枫酱_2535

陌枫酱_2535

2026-03-22

462人浏览

原创

绝大多数家用或动态ip场景下必须用masquerade;snat仅适用于固定ip且维护成本高。需永久开启ipv4转发、将masquerade规则插入postrouting链首行、确保内网设备网关指向nat主机,并显式放行forward链流量。

linux怎么配置nat转换_linux如何用iptables做地址转换【教程】

iptables 的 POSTROUTING 链必须用 -j MASQUERADE 还是 SNAT?

绝大多数家用或动态 IP 场景下,MASQUERADE 是唯一安全的选择;硬写 SNAT 会导致外网流量发不出去。

  • MASQUERADE 自动感知出口网卡的实时 IP(比如 DHCP 分配的公网 IP),适合拨号、4G、云主机弹性 IP 等场景
  • SNAT 要求你手动写死源地址,一旦网卡 IP 变更(比如重启网络服务),NAT 规则立刻失效,且不会报错,只表现为“能 ping 通网关但上不了网”
  • 如果你确定出口 IP 固定(如 IDC 服务器),SNAT 性能略好(少一次查表),但维护成本高,不推荐新手碰

开启 IPv4 转发只是第一步,/proc/sys/net/ipv4/ip_forward 会被重置

临时开转发只是治标:echo 1 > /proc/sys/net/ipv4/ip_forward 下次 reboot 就回 0。

  • 永久生效必须改配置文件:/etc/sysctl.conf 里加一行 net.ipv4.ip_forward = 1,再执行 sysctl -p
  • 某些发行版(如 Ubuntu 22.04+)默认启用 systemd-sysctl,但若你手动改过 /etc/sysctl.d/*.conf,优先级可能冲突,建议统一用 /etc/sysctl.conf
  • 验证是否真生效:运行 sysctl net.ipv4.ip_forward,输出必须是 net.ipv4.ip_forward = 1,不能只看文件里有没有那行

iptables 规则顺序错了,NAT 就完全不工作

NAT 规则必须插在 POSTROUTING 链最前面,否则被前面的 ACCEPT 或 DROP 拦截掉,包根本到不了 NAT 层。

  • 别用 iptables -A POSTROUTING ...(追加到末尾),要用 iptables -t nat -I POSTROUTING 1 ...(插入第 1 行)
  • 典型错误:先写了 -A FORWARD -i eth0 -o eth1 -j ACCEPT,再写 NAT,结果流量在 FORWARD 链就放行了,压根不进 POSTROUTING
  • 检查顺序:用 iptables -t nat -L -n --line-numbers,确认 MASQUERADE 规则在第 1 行,且目标接口(-o)是你真正的出口网卡(比如 eth0 或 ens3),不是内网桥接口

内网设备默认网关没指向 Linux 主机,NAT 就是摆设

Linux 做 NAT 不是“装完规则就自动接管”,内网机器必须把它的默认路由设成这台 Linux 的内网 IP。

  • 比如 Linux 内网口 IP 是 192.168.100.1,那么 Windows 或手机的网关就得设成这个地址,不能是光猫或路由器的 IP
  • 如果内网是另一个路由器(比如 OpenWrt),得关掉它的 DHCP,或者把它设为纯交换模式,否则内网设备会从它那里拿到错误网关
  • 验证方法:在内网机器上执行 ip route show default(Linux)或 route print(Windows),确认默认网关确实是你的 NAT 主机内网 IP

最容易被忽略的是:NAT 规则本身没问题,但 FORWARD 链默认是 DROP,必须显式放行内网→外网的流量。很多人只加了 MASQUERADE,忘了加 iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT(假设 eth1 是内网口)。没有这条,包连转发都进不去,更别说做地址转换了。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

2540

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

249

24

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3088

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4509

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3709

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

406

15

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.07

357

5

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3099

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2658

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习