要让外网访问内网服务,核心是配置dnat:需网关双网卡、开启ipv4转发、外网ip可达;执行iptables -t nat -a prerouting -d 公网ip -p tcp --dport 端口 -j dnat --to-destination 内网ip:端口,并配套masquerade或forward放行。

要让外网能访问内网服务,核心是配置 DNAT(目的地址转换),把发往网关公网 IP 的请求,转发到内网服务器的私有 IP 上。这需要网关机器具备双网卡(一对外网、一对内网),且已开启 IP 转发。
网关必须满足的三个前提
缺一不可,否则 DNAT 不生效:
- 网关开启 IPv4 路由转发:临时启用运行 sudo sysctl -w net.ipv4.ip_forward=1;永久生效需在 /etc/sysctl.conf 中写入 net.ipv4.ip_forward = 1 并执行 sudo sysctl -p
- 内网服务器本身能通外网(至少能 ping 通网关的内网 IP),确保回程路径畅通
- 网关的外网接口已配置有效 IP(比如 203.0.113.10),且该 IP 可被外网客户端直接访问(例如通过桥接或 NAT 共享模式暴露)
DNAT 规则写法(以 Web 服务为例)
假设:网关外网 IP 是 203.0.113.10,内网 Web 服务器 IP 是 192.168.8.14,服务监听 80 端口。
执行以下命令:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
sudo iptables -t nat -A PREROUTING -d 203.0.113.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.8.14:80
说明:
- -t nat 指定操作 NAT 表
- -A PREROUTING 表示规则加在数据包刚进入网卡时(最前端处理链)
- -d 203.0.113.10 匹配目标为该公网 IP 的包(可省略,但显式写出更安全)
- --dport 80 限定只转发 80 端口请求(也可换成 443、22 等)
- --to-destination 后跟内网服务器 IP 和端口(端口可省略,默认相同)
别忘了配套的 SNAT 或转发放行
仅配置 DNAT,响应包可能无法正确返回。因为内网服务器回包时源 IP 是私有地址,外网无法路由。解决方法有两种:
-
方案一(推荐):开启网关的 masquerade(自动 SNAT)
运行:sudo iptables -t nat -A POSTROUTING -s 192.168.8.0/24 -o [外网网卡名,如 ens33] -j MASQUERADE
这样内网服务器回包会自动转成网关公网 IP 出去 -
方案二:放行 FORWARD 链
DNAT 本质是改目标地址,但包仍要经过 FORWARD 链。需确保:
sudo iptables -A FORWARD -i [外网网卡] -o [内网网卡] -d 192.168.8.14 -p tcp --dport 80 -j ACCEPT
sudo iptables -A FORWARD -i [内网网卡] -o [外网网卡] -s 192.168.8.14 -m state --state ESTABLISHED,RELATED -j ACCEPT
验证与排错要点
配置完后建议按顺序检查:
- 从外网客户端(如另一台机器或手机)执行:curl http://203.0.113.10,看是否返回内网 Web 页面
- 在网关上用 sudo iptables -t nat -vnL PREROUTING 查看 DNAT 规则是否命中(观察 pkts 字段是否增长)
- 确认内网服务器防火墙(如 ufw 或 firewalld)已允许 80 端口入站
- 若用 VMware/VirtualBox,确保网关外网网卡处于桥接或 NAT 模式,并分配了真实可达 IP










