家里用NAS跑几个ref="/tag/2019/" style="color:#B2A89E;font-weight:bold;">Docker服务,比如Home Assistant、Pi-hole、Jellyfin,挺方便。但很多人没意识到:默认情况下,这些容器是直接暴露在局域网里的,哪怕只开80端口,也可能被邻居扫到、被误操作访问,甚至被蹭网设备反向探测。
别信“Docker自带隔离就安全”
Docker的网络模式(bridge)确实做了端口映射和命名空间隔离,但它不等于防火墙。比如你执行 docker run -p 8080:80 nginx,只要主机防火墙放行了8080,整个局域网都能访问这台Nginx——不管你是想只让客厅电视访问,还是禁止手机连家里的数据库容器。
家庭场景最实用的组合:iptables + Docker自定义链
家用路由器一般不支持细粒度容器级策略,所以得在运行Docker的那台设备(比如树莓派、老笔记本装的Ubuntu)上动手。我们不用装复杂工具,直接用系统自带的iptables,加一条规则链专管容器流量。
先看看当前Docker创建的默认链:
sudo iptables -t nat -L DOCKER你会发现它只负责端口转发,没做访问控制。我们要加一层“守门人”:
sudo iptables -N DOCKER-USER
sudo iptables -I FORWARD -j DOCKER-USER
sudo iptables -A DOCKER-USER -i eth0 -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A DOCKER-USER -i docker0 -o eth0 -j ACCEPT
sudo iptables -A DOCKER-USER -i eth0 -o docker0 -s 192.168.1.100 -j ACCEPT # 只允许书房电脑访问
sudo iptables -A DOCKER-USER -i eth0 -o docker0 -j DROP上面这几行的意思是:所有从物理网卡(eth0)进、往docker0发的包,先过DOCKER-USER链;只放行来自192.168.1.100(你的台式机)的请求,其他一概拦掉。注意把eth0换成你实际的有线网卡名(可用ip a查看),192.168.1.100换成你真正想放行的设备IP。
更省心的办法:用ufw配合Docker
如果你用的是Ubuntu/Debian系系统,ufw更友好。先关掉Docker自动改iptables(避免冲突):
echo '{"iptables": false}' | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker然后用ufw设规则:
sudo ufw allow from 192.168.1.100 to any port 8080
sudo ufw deny 8080这样只有书房电脑能访问容器的8080端口,别人连telnet都通不过。
顺手检查下有没有漏网之鱼
配完别急着关终端,拿手机连同一Wi-Fi,试试ping主机IP,再telnet主机IP 8080——应该超时或拒绝连接。再换书房电脑试,必须通。家里有IoT设备(比如智能插座)也建议单独划个IP段,加一条-s 192.168.1.200/28白名单,防它们乱扫端口。
防火墙不是越严越好,而是按需放开。你家的Home Assistant真需要全屋都能访问编辑界面吗?大概率只需要自己手机和iPad能看。少开一个端口,就少一分被误点、误配置的风险。