温馨提示×

ubuntu iptables如何做nat

小樊
45
2026-10-18 14:42:11
栏目: 智能运维

在 Ubuntu 上使用 iptables 做 NAT,常见场景有两类:

  1. SNAT / MASQUERADE(内网访问外网)
  2. DNAT(端口映射 / 外网访问内网)

下面一步步说明。


一、开启内核 IP 转发

NAT 必须开启转发:

sudo sysctl -w net.ipv4.ip_forward=1

永久生效(推荐):

sudo vim /etc/sysctl.conf

添加或修改:

net.ipv4.ip_forward=1

然后执行:

sudo sysctl -p

二、SNAT / MASQUERADE(最常见)

场景

  • 内网:192.168.1.0/24
  • 外网网卡:eth0
  • 让内网机器通过这台 Ubuntu 上网

方式 1:MASQUERADE(推荐,动态 IP 用)

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

方式 2:SNAT(固定公网 IP)

假设公网 IP 是 1.2.3.4:

sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 1.2.3.4

三、DNAT(端口映射)

场景

  • 公网 IP:1.2.3.4
  • 内网服务器:192.168.1.10:80
  • 想通过 1.2.3.4:8080 访问
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 \
-j DNAT --to-destination 192.168.1.10:80

还需要允许转发:

sudo iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT

四、保存 iptables 规则(Ubuntu)

Ubuntu 20.04 / 22.04

sudo apt install iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload

规则会保存在:

/etc/iptables/rules.v4

五、完整示例(网关 NAT)

# 开启转发
sysctl -w net.ipv4.ip_forward=1

# 内网共享上网
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 允许转发
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

六、常见问题

1. NAT 不生效?

  • 是否开启 ip_forward
  • 是否写错网卡名(ip addr 查看)
  • 是否忘记 FORWARD 规则

2. 容器 / Docker?

Docker 已自动做 NAT,一般不用手动加。


如果你愿意,可以告诉我:

  • Ubuntu 版本
  • 网卡名称
  • 具体 NAT 场景(上网 / 端口映射 / 多出口)

我可以给你一份可直接用的配置。

0 踩