要让外网访问内网服务,关键配置DNAT并开启IP转发:先执行echo 1 > /proc/sys/net/ipv4/ip_forward临时启用,再在/etc/sysctl.conf中写入net.ipv4.ip_forward = 1并运行sysctl -p永久生效;然后添加DNAT规则iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80,并放行FORWARD链流量。

要让外网能访问你内网里的服务,关键就是配置 DNAT(目标地址转换),把进来的请求“转”到内网某台机器上。这通常用在发布 Web、SSH、数据库等服务的场景。
DNAT 必须配合 IP 转发才能生效
Linux 默认不转发数据包,得先打开路由转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
让它永久生效,编辑 /etc/sysctl.conf,确保有这一行:
net.ipv4.ip_forward = 1
然后运行 sysctl -p 加载。
DNAT 规则写在 nat 表的 PREROUTING 链上
假设你的网关(防火墙)有一块外网网卡(比如 ens33),IP 是 203.0.113.1,你想把外部访问 203.0.113.1:8080 的请求,转发到内网服务器 192.168.1.100:80:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
-
-t nat:指定操作 NAT 表 -
-A PREROUTING:在数据包刚进来、还没做路由决策前就处理 -
-p tcp --dport 8080:只匹配目标端口为 8080 的 TCP 包 -
--to-destination 192.168.1.100:80:把目标地址和端口改成内网服务的真实地址
注意:如果你的网关本身也想通过
203.0.113.1:8080访问这个内网服务(即本机发包),还得加一条 SNAT 或 MASQUERADE 规则,否则响应包会走错路。常见做法是:
Zynq Linux Hardware Debug下载Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
iptables -t nat -A POSTROUTING -d 192.168.1.100 -p tcp --dport 80 -j MASQUERADE
别忘了放行 FORWARD 链的流量
DNAT 只改地址,真正让包穿过网关,还得允许转发:
iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT iptables -A FORWARD -s 192.168.1.100 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
或者更简洁地按连接状态放行:
iptables -A FORWARD -i ens33 -o ens37 -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT iptables -A FORWARD -i ens37 -o ens33 -s 192.168.1.100 -p tcp --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
其中 ens33 是外网口,ens37 是内网口 —— 请按你实际网卡名调整。
验证和保存规则
测试通后,记得保存,否则重启就没了:
iptables-save > /etc/iptables/rules.v4 # Debian/Ubuntu # 或 iptables-save > /etc/sysconfig/iptables # RHEL/CentOS/Rocky/OpenEuler
确认规则已加载:
iptables -t nat -L -n -v iptables -L FORWARD -n -v
不复杂但容易忽略


















