iptables默认使用filter表,-t filter可省略; forward链用于转发流量,需开启ip转发,通过-i指定入站网卡实现隔离,配合conntrack状态可精准控制新连接与响应包,规则需持久化保存。

注意:iptables -t filter 是默认表,无需显式指定 -t filter;-t 用于指定其他表(如 nat、mangle),而 filter 表是 iptables 的默认工作表。因此正确命令是 iptables -A FORWARD ...,而非 iptables -T filter ...(-T 并非合法选项,可能是误写)。
以下是在 Linux 中利用 iptables 的 FORWARD 链,基于入站网卡(in-interface)实现强制网络隔离的实用方法:
明确隔离目标与前提
Forward 链只处理经本机转发的流量(即源和目的均非本机)。要基于入站网卡做隔离,需确保:
- Linux 主机已开启 IP 转发(
echo 1 > /proc/sys/net/ipv4/ip_forward或永久配置net.ipv4.ip_forward=1in/etc/sysctl.conf) - 被隔离设备位于不同网段,且流量必须经过该主机路由/桥接
- 物理或逻辑网卡清晰可辨(如
eth0接办公网,eth1接访客网)
按入站网卡拒绝转发(单向隔离)
例如:禁止从 eth1 进来的所有流量转发到其他网卡(即访客网段无法访问任何其他网络):
iptables -A FORWARD -i eth1 -j DROP
该规则匹配所有以 eth1 为入接口的转发包,立即丢弃,不进入后续规则。
若需更精细控制(如仅阻断到特定网段),可加 -o(出接口)或 -d(目的地址):
iptables -A FORWARD -i eth1 -o eth0 -j DROP # 禁止 eth1→eth0 转发<br>iptables -A FORWARD -i eth1 -d 192.168.10.0/24 -j DROP # 禁止 eth1 访问内网 192.168.10.0/24
结合状态实现“有来无回”或双向隔离
仅靠 -i 可能导致响应包也被拦截(尤其在连接跟踪未启用时)。推荐搭配 conntrack 状态使用:
- 允许已建立连接的返回流量(必需):
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - 再按入网卡限制新连接:
iptables -A FORWARD -i eth1 -m conntrack --ctstate NEW -j DROP - 最后放行其他可信方向(如内部→外部):
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
这样既阻止访客主动发起连接,又不影响已有会话的响应包通过。
持久化与调试建议
iptables 规则重启后失效,需保存:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - RHEL/CentOS 7+:
service iptables save(需安装 iptables-services)或用iptables-save+ systemd 服务
调试时用以下命令验证:
-
iptables -L FORWARD -v -n:查看 FORWARD 链计数器,确认规则命中 -
tcpdump -i eth1 host 192.168.20.5:抓包确认流量是否到达网卡 -
cat /proc/sys/net/ipv4/ip_forward:确认转发已启用(值为 1)
不复杂但容易忽略











