linux主机级网络隔离与访问控制需分层协同:1.用firewalld区域实现接口/来源级隔离;2.用策略路由+iptables标记实现服务级流量定向;3.用网络命名空间构建完全隔离运行环境;4.用selinux实现进程级网络行为限制,且须确保出向与回向路径一致。

Linux 主机级网络隔离与访问控制,核心目标是让不同服务、用户或流量路径之间互不干扰、权限分明、边界清晰。这不是靠单一工具能完成的,而是分层协同:底层隔离资源、中层控制流向、上层约束行为。下面从四个实用维度展开,每项都可独立部署,也支持组合使用。
用 firewalld 区域实现接口/来源级隔离
firewalld 的“区域”本质是一套绑定到接口或源 IP 的规则模板,适合快速划分信任等级。
- 把公网网卡(如 eth0)分配给 public 区域,只开放 80/443 和必要管理端口;内网网卡(eth1)分配给 internal 区域,允许 SSH、数据库等内部服务;
- 对特定 IP 段(如运维跳板机 10.10.5.0/24)直接加入 trusted 区域:
firewall-cmd --permanent --zone=trusted --add-source=10.10.5.0/24; - 自定义区域更灵活:创建
db-only区域,仅放行 3306 端口且只接受来自应用服务器段的连接,再将数据库监听接口绑定过去。
用策略路由 + iptables 标记实现服务级流量定向
当需要某个服务(比如监控 agent 或备份脚本)强制走指定出口、绕过主路由时,必须用策略路由配合标记。
- 先用 iptables 给流量打标:对 www-data 用户发起的连接打 mark 100:
iptables -t mangle -A OUTPUT -m owner --uid-owner www-data -j MARK --set-mark 100; - 创建独立路由表(如
100 rt_monitor),添加对应规则:ip rule add fwmark 100 table rt_monitor,再配置该表的默认网关和直连路由; - 关键一步:启用
net.ipv4.conf.all.rp_filter = 2(宽松反向路径检查),避免回程包被丢弃;同时用 CONNMARK 同步 ESTABLISHED 连接的状态标记。
用网络命名空间构建完全隔离的运行环境
命名空间提供真正的网络栈隔离——独立的 loopback、路由表、iptables、socket 接口,适合高敏感服务或测试场景。
- 创建并进入新 netns:
ip netns add vpnns,然后在其中配置独立 IP、路由、防火墙; - 把进程拉入命名空间执行:
ip netns exec vpnns curl https://api.example.com,该命令全程不经过主机网络栈; - 配合 veth 对 + bridge,还能让多个 netns 互通但与主机隔离,形成轻量“私有子网”。
用 SELinux 实现进程级网络行为限制
SELinux 在内核层面控制进程能否 bind 端口、connect 到某地址、使用某协议,属于强制访问控制(MAC),比防火墙更底层。
- 启用 enforcing 模式后,即使 root 用户也无法绕过策略——例如限制 nginx 只能 listen 80/443,禁止访问 8080;
- 通过 MCS 标签为不同服务打标:
runcon -l s0:c100,c200 -- nginx,再配策略使其只能与同标签服务通信; - 结合 audit2allow 分析拒绝日志,生成最小权限策略模块,避免“一刀切”禁用导致服务异常。
不复杂但容易忽略的是:这些机制要生效,必须协同处理出向与回向路径一致性。比如策略路由只设了 OUTPUT,但响应包若从主表发出,就会触发连接中断;SELinux 放行了 connect,但防火墙 DROP 了返回包,同样失败。实际部署时,建议先用 tcpdump 抓包验证双向路径,再逐步加固。











