要在linux上用iptables -i forward实现跨网段精细化访问控制,核心是将中间机设为策略网关,通过-i/-o限定接口、-s/-d指定ip范围、-p及-m tcp/udp控制协议与端口、-m state匹配连接状态,并配合开启ip_forward和snat/masquerade完成完整转发。

要在 Linux 上用 iptables -I FORWARD 实现跨网段访问的精细化控制,核心是把中间机器当作“策略网关”——它不只转发流量,还要按源、目标、协议、端口、连接状态等维度做细粒度放行或拦截。关键不在“能不能通”,而在“谁在什么条件下能通到哪里”。
明确 FORWARD 链的作用场景
FORWARD 链只处理**经由本机转发的数据包**(即目的不是本机、也不从本机发出,而是“过路”流量)。跨网段访问必须经过具备双网卡(或多网卡)且开启 IP 转发的主机,此时所有跨子网的通信都走 FORWARD 链,而不是 INPUT 或 OUTPUT。
常见误区:只加了 SNAT/DNAT 却没放开 FORWARD,结果流量被默认 DROP;或规则顺序错乱,导致策略失效。
精细化控制的四类关键匹配条件
通过 iptables -I FORWARD 插入规则时,可组合以下条件实现精细管控:
-
接口方向:用
-i enp0s3(入接口)和-o enp0s8(出接口)限定流量走向,例如只允许从内网口进、外网口出 -
IP 范围与协议:用
-s 10.20.40.0/24+-d 172.16.25.73+-p tcp锁定源网段、目标地址及协议 -
端口级控制:配合
-m tcp --dport 8080或--sport 53,精确到服务端口(UDP 同理用-m udp) -
连接状态识别:用
-m state --state ESTABLISHED,RELATED确保回程包自动放行,避免手动写双向规则
典型策略示例:分层控制跨网段访问
假设 A 机(网关)有 enp24s0f0(10.20.40.221/24) 接 B 机(10.20.40.22),enp24s0f2(192.168.133.46/24) 可达目标服务 172.16.25.73:
- 只允许 B 所在网段访问目标服务的 HTTPS:
iptables -I FORWARD -i enp24s0f0 -o enp24s0f2 -s 10.20.40.0/24 -d 172.16.25.73 -p tcp --dport 443 -j ACCEPT - 拒绝该网段访问目标的数据库端口(如 3306):
iptables -I FORWARD -i enp24s0f0 -o enp24s0f2 -s 10.20.40.0/24 -d 172.16.25.73 -p tcp --dport 3306 -j DROP - 放行已建立连接的回程流量(必须放在拒绝规则之后,但插入时用 -I 可指定位置):
iptables -I FORWARD -i enp24s0f2 -o enp24s0f0 -d 10.20.40.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT - 最后设默认策略为 DROP(需确保已有 ACCEPT 规则覆盖必要路径):
iptables -P FORWARD DROP
配套必须项:转发开关与 NAT 协同
仅靠 FORWARD 规则无法完成跨网段访问,还需两步支撑:
-
开启内核转发:临时执行
echo 1 > /proc/sys/net/ipv4/ip_forward;永久生效写入/etc/sysctl.conf并运行sysctl -p -
配置 SNAT/MASQUERADE:确保目标服务回包能正确返回,例如
iptables -t nat -A POSTROUTING -s 10.20.40.0/24 -o enp24s0f2 -j MASQUERADE
否则目标看到的是原始源 IP,可能无路由返回,或因防火墙策略丢弃











