iptables通过-i(INPUT/PREROUTING链)和-o(OUTPUT/POSTROUTING链)参数指定网卡过滤流量,需结合协议、端口、状态等条件精细化控制,并建议默认策略设为DROP以保障安全。

Linux 中用 iptables 针对指定网卡过滤流量,关键在于在规则中明确指定网络接口(interface),通过 -i(入站)和 -o(出站)参数限定物理或逻辑网卡设备名,比如 eth0、ens33、docker0 或 lo。
只允许/拒绝某张网卡的入站流量
适用于多网卡服务器(如内外网分离场景),例如仅允许管理流量从 eth1 进入,禁止从 eth0 连 SSH:
-
iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT(放行 eth1 上的 SSH) -
iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP(明确丢弃 eth0 的 SSH 请求) - 注意:
-i只在INPUT和PREROUTING链生效,不能用于OUTPUT
限制某张网卡的出站流量
控制本机向外发送的数据走哪张网卡,常用于隔离服务出口路径:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
iptables -A OUTPUT -o eth0 -p tcp --dport 80 -j REJECT(禁止从 eth0 访问外部 HTTP) -
iptables -A OUTPUT -o docker0 -d 172.17.0.0/16 -j ACCEPT(仅允许 docker0 访问容器内网) -
-o只在OUTPUT和POSTROUTING链有效
结合状态与协议做精细化控制
单靠网卡名不够安全,需叠加连接状态、协议、端口等条件,避免误拦或绕过:
- 先放行已建立连接的返回包(无论走哪张卡):
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - 再按网卡细化新连接:
iptables -A INPUT -i ens33 -p tcp --dport 3306 -s 10.0.1.0/24 -j ACCEPT(仅允内网通过 ens33 访问 MySQL) - 默认策略仍建议设为
DROP,确保未匹配规则的流量被拦截
验证与调试技巧
规则生效后,快速确认是否按网卡生效:
- 查看带接口条件的规则:
iptables -L INPUT -v -n | grep 'eth0\|ens33'(-v 显示匹配计数) - 临时加 LOG 规则观察实际匹配:
iptables -I INPUT 1 -i eth0 -j LOG --log-prefix "ETH0-IN: ",然后查dmesg或/var/log/kern.log - 注意:虚拟网卡(如 veth、br-xxx)、bond 接口、VLAN 子接口(如 eth0.100)均可直接用作
-i/-o参数值

















