要让Linux主机承担跨网段“策略网关”角色,关键在于用iptables -I FORWARD精准匹配接口、源/目标IP、协议端口及连接状态,并配合开启ip_forward和SNAT/DNAT实现可控转发。

要让 Linux 主机真正承担跨网段访问的“策略网关”角色,不能只靠开启转发或简单放行,关键在于用 iptables -I FORWARD 精准匹配流量特征,并配合 NAT 协同工作。核心不是打通网络,而是控制谁、从哪来、去哪、走什么协议和端口。
确认并启用 IP 转发
这是所有转发功能的前提。没有它,数据包进不来也出不去:
- 临时开启:
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:向
/etc/sysctl.conf追加net.ipv4.ip_forward = 1,再执行sysctl -p - 验证是否生效:
sysctl net.ipv4.ip_forward返回值应为1
明确 FORWARD 链的适用场景
FORWARD 链只处理“过路”流量——即目的地址不是本机、源地址也不是本机的数据包。比如内网主机 A(10.20.40.22)访问外网服务(172.16.25.73),中间那台双网卡主机(如 enp24s0f0 接内网、enp24s0f2 接外网)收到该包后,因目标不是自己,就会交由 FORWARD 链处理。
常见错误是只配了 DNAT/SNAT,却忘了放开 FORWARD,结果包被默认 DROP;或者规则顺序混乱,导致精细策略失效。
用 -I FORWARD 插入精细化控制规则
每条规则都可组合多个条件,实现“按需放行”或“定向拦截”:
-
限定方向:用
-i enp24s0f0(入接口)和-o enp24s0f2(出接口),确保只对指定路径生效 -
锁定源与目标:
-s 10.20.40.0/24限制来源网段,-d 172.16.25.73指定目标地址 -
细化到协议与端口:加
-p tcp -m tcp --dport 443只允许 HTTPS;用-p udp -m udp --dport 53控制 DNS -
识别连接状态:回程包必须放行,否则通信中断,常用
-m state --state ESTABLISHED,RELATED -j ACCEPT
示例:只允许内网段访问目标的 443 端口,禁止访问 3306,同时保障回程畅通:
iptables -I FORWARD -i enp24s0f0 -o enp24s0f2 -s 10.20.40.0/24 -d 172.16.25.73 -p tcp --dport 443 -j ACCEPT iptables -I FORWARD -i enp24s0f0 -o enp24s0f2 -s 10.20.40.0/24 -d 172.16.25.73 -p tcp --dport 3306 -j DROP iptables -I FORWARD -i enp24s0f2 -o enp24s0f0 -d 10.20.40.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT
配套配置 NAT 保证路由可达
仅控制转发不等于能通——跨网段通信还需地址转换:
-
SNAT/MASQUERADE:内网访问外网时,修改源 IP。例如:
iptables -t nat -A POSTROUTING -o enp24s0f2 -s 10.20.40.0/24 -j MASQUERADE -
DNAT:外网访问内网服务时,重写目标 IP 和端口。例如:
iptables -t nat -A PREROUTING -i enp24s0f2 -p tcp --dport 8080 -j DNAT --to-destination 10.20.40.22:80 -
默认策略设为 DROP:在所有 ACCEPT 规则添加完毕后,执行
iptables -P FORWARD DROP,堵住未明确允许的流量
最后别忘了保存规则(如 CentOS 执行 service iptables save),避免重启后失效。

















