如何阻止特定IP访问Docker服务?
如何阻止特定IP访问Docker服务?
我太懂这种无奈了——明明手动给iptables加了DROP规则,结果目标IP还是能畅通无阻地连上Docker里的服务,核心原因就是Docker会自动修改系统的iptables规则,而且它的规则优先级比你手动添加的要高,你的规则根本没机会生效。
给你几个靠谱的解决办法,按推荐程度排序:
方法一:利用Docker专属的iptables链(最推荐)
Docker专门预留了DOCKER-USER链,所有和Docker相关的流量都会先经过这个链,你只需要把拦截规则插在这个链的最前面就行,优先级最高,能直接覆盖Docker的默认规则。
执行这条命令替换掉你原来的规则:
iptables -I DOCKER-USER -s 你的目标IP地址 -j DROP
解释下参数:
-I是插入规则到链的开头,确保你的拦截规则第一个被匹配DOCKER-USER是Docker指定的用户自定义规则链,专门用来让用户添加自定义拦截/放行规则
添加完后可以用这条命令验证规则是否生效:
iptables -L DOCKER-USER -n
能看到你刚加的DROP规则排在最前面就对了。
方法二:禁用Docker的iptables自动管理(谨慎使用)
如果不想让Docker插手iptables,你可以修改Docker的配置,关闭它的iptables自动管理功能,这样你手动加的规则就能正常生效了。不过要注意:关闭后你得自己负责所有网络规则,包括Docker容器的联网、端口映射的放行等,操作不当可能导致容器无法联网。
步骤如下:
- 编辑Docker的配置文件
/etc/docker/daemon.json(如果没有就新建一个),添加以下内容:
{ "iptables": false }
- 重启Docker服务让配置生效:
systemctl restart docker
- 这时候你原来的
iptables -A INPUT -s 目标IP -j DROP规则就能正常工作了,但记得要手动放行Docker容器需要的网络流量(比如端口映射的端口)。
方法三:针对特定容器做网络限制(适合精细化管控)
如果只是想拦截某个特定Docker服务的访问,也可以通过自定义Docker网络来实现。比如创建一个只允许指定IP访问的网络,然后把容器挂载到这个网络上。不过这种方法相对复杂,适合有一定Docker网络基础的用户。
比如先创建自定义网络:
docker network create --driver bridge --subnet 172.20.0.0/16 restricted-net
然后启动容器时指定这个网络,并且配合iptables规则限制该网络的访问源,或者用Docker的--ip参数绑定固定IP后再做拦截。
备注:内容来源于stack exchange,提问作者birgersp




