iptables本身不直接创建沙箱,但结合网络/用户命名空间、ipset和精细链路控制,可构建强隔离网络环境:先用unshare启动专属netns,配置veth、ip与路由;再通过iptables+ipset限制进出流量、阻断跨命名空间探测,并辅以策略路由与snat确保会话一致性。

iptables 本身不直接创建“沙箱”,但它能为特定应用构造强隔离的网络环境——关键在于结合网络命名空间、用户命名空间、ipset 和精细链路控制,把应用流量锁死在指定路径内,使其对外不可见、对内不可扰。
绑定应用到独立网络命名空间
真正隔离始于命名空间。不能只靠 iptables 过滤,必须先让应用运行在专属 netns 中:
- 用
unshare --net --user --pid --fork --mount-proc /bin/bash启动隔离 shell - 在该 netns 内配置虚拟网卡(如 veth pair)、IP 地址和路由,不设默认网关或仅配受限出口
- 启动目标应用(如 python server.py)时确保它在该 netns 中运行(
nsenter -n -t $PID -- your-app)
用 iptables + ipset 锁定进出方向
在专属 netns 的宿主机侧接口上施加规则,避免流量“逃逸”:
- 创建动态白名单集合:
ipset create app-egress hash:ip,port timeout 300 - 仅允许应用进程(通过
-m owner --uid-owner或--pid-owner)访问白名单目标:iptables -A OUTPUT -m owner --uid-owner 1001 -m set ! --match-set app-egress dst,dst -j REJECT - 禁止该 netns 接口接收非预期入向连接:
iptables -I INPUT -i veth-app0 -p tcp ! --dport 8080 -j DROP
阻断跨命名空间探测与状态泄露
Docker 默认隔离易被绕过,需主动堵住 netlink 和 proc 访问通道:
- 禁用宿主机对容器 netns 的读取:
iptables -t filter -A OUTPUT -p netlink --nlmsg-type 17 -m owner ! --uid-owner 1001 -j DROP - 配合
sysctl net.ipv4.conf.all.route_localnet=0防止 localhost 伪装绕过 - 挂载
/proc/net为只读或使用hidepid=2(需 kernel ≥ 3.3)限制非属主进程查看
配套策略路由与源地址强制
防止响应包从错误接口发出,破坏会话一致性:
- 为该应用 netns 分配专用源 IP(如 10.200.1.100),并在 POSTROUTING 做 SNAT:
iptables -t nat -A POSTROUTING -s 10.200.1.0/24 -o eth0 -j SNAT --to-source 10.200.1.100 - 添加策略路由:
ip rule add from 10.200.1.100 table 200,再定义ip route add default via 10.200.1.1 dev veth-app0 table 200 - 关闭反向路径校验:
echo 0 > /proc/sys/net/ipv4/conf/veth-app0/rp_filter











