家用住宅主机Linux容器网络隔离防内网扫描
家用住宅主机如果直接暴露在内网,很容易被邻居设备、访客设备甚至智能家电扫描到开放端口,进而遭受探测或攻击。
利用 Linux 容器(比如 Docker)将服务隔离在独立网络内,是成本最低且效果明显的方案。
本文从零开始,把准备、操作、避坑和验证一次讲清楚。
环境准备与隔离思路
你需要一台运行 Linux 系统的家用主机(推荐 Ubuntu 22.04 或 Debian 11+),并确保已经安装 Docker 引擎。
本文以 Docker 为例,Podman 用户可参考类似命令。
隔离的核心思路:
- 创建一个自定义 Docker 网络,不绑定到主机物理网卡。
- 运行容器时指定该网络,容器只暴露必要端口给宿主机(或指定 IP)。
- 通过宿主机防火墙 iptables / nftables 限制外部对容器端口的访问。
首先确认 Docker 已安装:
docker --version
如果未安装,参考官方文档用一键脚本安装,注意不要直接从系统源安装旧版本。
创建隔离网络与容器
默认的 bridge 网络会让容器通过宿主机的 Docker0 网桥与外界通信,所有容器都能彼此连通,不符合隔离需求。
我们需要创建自定义网络,并禁止自动发布端口。
1. 创建自定义网络
docker network create --driver bridge --subnet 172.20.0.0/24 --gateway 172.20.0.1 isolated_net
这里指定了一个不常用的私有子网,避免与宿主机现有网络冲突。
2. 运行容器并加入隔离网络
例如运行一个 Nginx 容器:
docker run -d --name web --network isolated_net --restart unless-stopped nginx:alpine
此时容器仅在网桥内部有 IP(如 172.20.0.2),宿主机外部无法直接访问。
3. 按需暴露端口
如果确实需要从外部访问服务,使用 -p 映射到宿主机指定端口,例如:
docker run -d --name web --network isolated_net -p 127.0.0.1:8080:80 nginx:alpine
注意绑定到 127.0.0.1,这样只有宿主机本机才能访问 8080,内网其他设备无法直接扫到。
如果必须对内网开放,至少用防火墙限制来源 IP。
配置防火墙与默认拒绝策略
光靠容器网络隔离还不够,宿主机上的 iptables 规则也会影响。
Docker 默认会修改防火墙规则,允许容器出网。
为了防内网扫描,需要单独设置。
以下使用 ufw(Uncomplicated Firewall)简化操作,适合新手:
# 安装 ufw(如果未安装)
sudo apt install ufw -y
# 默认拒绝入站,允许出站
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 放行 SSH(防止被锁)
sudo ufw allow ssh
# 如果容器端口映射到宿主机,例如 8080,允许本机访问
sudo ufw allow from 127.0.0.1 to any port 8080 comment '容器 web 映射'
# 启用防火墙
sudo ufw enable
sudo ufw status verbose
注意:启用 ufw 后,Docker 的端口映射规则依然生效,但 ufw 会阻断外部对宿主机端口的访问。
这样即使内网扫描仪扫到宿主机的 8080 端口,也会被 ufw 拒绝。
如果使用 iptables 直接管理,可增加一条拒绝所有来自容器网络外部的输入规则,但新手更推荐 ufw。
常见问题与避坑指南
- 为什么容器能访问外网,但外部扫描不到? 因为 Docker 默认开启了 IP 转发和 NAT,容器出网不受影响。入站靠防火墙规则拦截,只要物理网卡上的端口没有被放行,外网就扫不到。
- 容器之间的通讯能否控制? 自定义网络默认允许同网络内容器互通。如需进一步隔离,使用
--internal选项创建完全隔离网络(没有外网访问能力)。 - 重启后配置是否持久? Docker 网络和容器启动参数会持久化,ufw 规则也会重启后生效。注意不要手动修改
/etc/docker/daemon.json中的 iptables 选项为 false,否则容器端口映射会失效。 - 被扫描到宿主机的其他端口(如 22)怎么办? 确保 SSH 端口只监听内网或使用密钥登录,并且 ufw 限制了来源 IP。
效果验证
完成配置后,验证隔离是否生效:
1. 容器内网络测试
docker exec -it web sh
/ # ping 8.8.8.8 # 应能通
/ # ping 192.168.1.1 # 宿主机局域网 IP,应能通
/ # exit
2. 从另一台内网设备扫描宿主机 IP
使用 nmap 扫描宿主机的开放端口:
nmap -p 1-65535 192.168.1.100 # 替换为宿主机实际 IP
预期结果:除了 22(SSH)和已明确放行的端口(如 8080),其余端口应显示 filtered(被过滤)或 closed。
如果看到某个容器映射端口显示 open,检查是否忘记绑定 127.0.0.1 或 ufw 规则未生效。
3. 确认容器无法被直接访问
尝试直接在浏览器访问 http://宿主机IP:8080,如果绑定的是 127.0.0.1,则无法访问。
只有从宿主机本机 http://127.0.0.1:8080 才能打开。
通过以上步骤,家用住宅主机的容器服务就能有效防内网扫描。
后续如果你需要跑更多服务,可以沿用同一个隔离网络,或者按业务拆分成不同的网络。
遇到异常时,先回看避坑部分的说明,再检查防火墙状态。