iptables网关流量调度核心是开启转发、配置snat/dnat、放行forward链;需启用ip_forward,用masquerade或snat实现共享上网,dnat映射外网端口至内网服务,并通过forward规则控制转发路径。

用 iptables 配置网关服务器做流量调度,核心是三件事:开启转发、设置地址转换(SNAT/DNAT)、控制转发路径。它不直接做带宽限速或负载均衡,但能精准决定“谁的流量走哪条路”,为后续调度打下基础。
开启 IP 转发功能
这是所有网关行为的前提,否则系统会直接丢弃非本机目的的包:
- 临时启用:echo 1 > /proc/sys/net/ipv4/ip_forward
- 永久生效:编辑 /etc/sysctl.conf,确保含 net.ipv4.ip_forward = 1,再运行 sysctl -p
配置 SNAT 实现内网共享上网
让内网设备发出的请求,源 IP 自动替换成网关的公网 IP:
- 若公网接口是 eth0,内网网段是 192.168.1.0/24,推荐用 MASQUERADE(适配动态 IP):
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE - 若公网 IP 固定(如 203.0.113.5),可用 SNAT 提升效率:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.5
配置 DNAT 实现外网访问内网服务
把公网 IP 的特定端口请求,转发到内网某台服务器:
- 例如将公网 eth0 上的 80 端口映射到内网 Web 服务器 192.168.1.100:80:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80 - 若需映射 HTTPS(443)、SSH(22)等其他端口,只需改 --dport 和目标地址即可
放行必要的 FORWARD 流量
nat 表只改地址,真正让包通过还得靠 filter 表的 FORWARD 链:
- 允许已建立连接的返回流量:
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT - 允许内网主动发起的出向流量:
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT - 如需限制某台内网主机只能访问特定外网服务,可加条件,例如只许访问 8.8.8.8 的 DNS:
iptables -A FORWARD -s 192.168.1.50 -d 8.8.8.8 -p udp --dport 53 -j ACCEPT











