家用住宅主机Linux容器横向渗透攻击防护配置
为什么家用容器也要防横向渗透?
很多人在家里的NAS或小主机上跑Docker容器时,只图方便,往往把容器网络设置成默认的bridge模式,甚至直接把宿主机端口映射出去。
但默认模式下,同一宿主机上的容器之间默认是可以互相通信的——万一某个容器被入侵(比如运行了有漏洞的镜像或弱口令服务),攻击者就能通过横向渗透跳转到其他容器甚至宿主机,造成更大的损失。
本文就从零开始,手把手教你给家用容器加上防护围栏。
准备工作:你需要什么?
- 一台运行 Linux 的家用主机(Ubuntu 22.04 / Debian 11 或 CentOS Stream 8+ 均可)
- 已经安装好 Docker 或 Podman(本文以 Docker 示例)
- sudo 权限的用户
- 基本的命令行操作能力(会复制粘贴即可)
操作前先确认当前 Docker 版本:
docker --version
建议使用 20.10 以上版本以支持完整的安全配置。
第一步:阻断容器间默认通信
Docker 默认的 bridge 网络允许同一宿主机上所有容器互访。
我们需要创建自定义网络并手动禁止容器间通信。
创建自定义隔离网络
docker network create --driver bridge --opt com.docker.network.bridge.enable_icc=false secure_net
--opt com.docker.network.bridge.enable_icc=false就是关键,它禁用了同一网络下的容器间通信(ICC, Inter-Container Communication)。
将容器接入隔离网络
创建容器时用 --network secure_net 参数:
docker run -d --name web --network secure_net nginx:alpine
如果容器已运行,先断开再连接(会中断服务,建议新建):
docker network disconnect bridge web
docker network connect secure_net web
这样,web、app、db 等容器之间就不能直接 ping 通或建立 TCP 连接了。
如果确实需要容器间通信(例如 app 连 db),可以再用 --link 或另行创建共享网络。
第二步:限制容器特权能力和系统调用
即使网络隔离了,如果容器以 --privileged 运行或绑定了敏感目录,攻击者仍可能突破。
必须去掉不必要的权限。
安全启动容器
docker run -d --name myapp \
--security-opt no-new-privileges:true \
--cap-drop=ALL \
--cap-add=NET_BIND_SERVICE \
your_image
no-new-privileges:禁止容器内进程通过 setuid 等方式提权。--cap-drop=ALL再--cap-add=NET_BIND_SERVICE:只保留绑定低端端口的权限,其他能力全部移除。
使用 Seccomp 限制系统调用
Docker 默认有一个 seccomp 策略,但你可以自定义更严格的配置。
这里直接使用 Docker 默认的安全运行参数即可:
docker run --security-opt seccomp=default.json ...
一般默认策略已经够用,但如果你要运行需要某些系统调用的程序(如 ptrace),需单独调整。
第三步:配置宿主机防火墙和内核参数
即使容器隔离了,也可能通过端口映射暴露给外网。
用 iptables 或 firewalld 限制入站和出站。
限制容器访问宿主机内部服务
编辑 /etc/docker/daemon.json(没有就创建),加入:
{
"iptables": true,
"ip-forward": true
}
重启 Docker:sudo systemctl restart docker。
Docker 会自动管理 iptables 规则,但你可以再加一条自定义规则拒绝容器访问宿主机敏感端口(如 SSH 22):
sudo iptables -I DOCKER-USER -i docker0 -p tcp --dport 22 -j DROP
注意:docker0 是默认桥接网卡,如果用了自定义网络则规则要对应修改。
启用内核安全参数
修改 /etc/sysctl.conf 或 /etc/sysctl.d/99-security.conf:
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.ip_forward=1
net.ipv4.conf.all.log_martians=1
kernel.kptr_restrict=2
kernel.dmesg_restrict=1
执行 sudo sysctl -p 生效。
这些参数能减少信息泄露和 IP 欺骗风险。
避坑指南:新手最容易踩的雷
- 忘记禁用 ICC: 很多人只创建了自定义网络,但没加
--opt enable_icc=false,容器间依然能通信。一定要带上这个参数。 - 容器仍用默认 bridge 网络: 默认 bridge 无法禁用 ICC,必须使用自定义网络。
- 启动容器带
--privileged: 这相当于把宿主机完全开放给容器,绝对不要在生产或家用环境使用。 - 端口映射到 0.0.0.0: 如果只在局域网使用,绑定到内网 IP(例如
-p 192.168.1.100:8080:80)而不是0.0.0.0,避免暴露到公网。 - 忽略 Docker 版本: 旧版 Docker 的 iptables 规则管理有缺陷,建议升级到最新稳定版。
效果验证:检查防护是否生效
验证容器间通信是否被阻断
在一个容器中 ping 另一个容器的 IP:
docker exec -it web ping 172.20.0.3
如果返回 Destination Host Unreachable 或长时间无响应,说明网络隔离生效。
验证权限限制
尝试在容器内运行 apt update 或 mount 等提权命令,应该被拒绝。
验证防火墙规则
从另一台机器扫描宿主机的容器映射端口,或者尝试 ssh 本机,确认规则生效。
使用安全扫描工具
可以用 docker run --network host --rm aquasec/trivy image --severity CRITICAL,HIGH your_image 检查镜像自身漏洞,
但横向渗透防护更多靠网络和权限。
总结
配置家用主机容器的横向渗透防护并不复杂,核心就三步:隔离网络、剥夺特权、收紧防火墙。
按照本文步骤操作后,你的容器环境安全性会大幅提升。
后续还可以考虑使用 Docker 的 V2 插件网络(如 Calico)实现更细粒度的安全策略,但对家用场景,以上配置已经足够。
遇到配置报错时,优先检查 Docker 版本和 daemon.json 语法。