You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何阻止特定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容器的联网、端口映射的放行等,操作不当可能导致容器无法联网

步骤如下:

  1. 编辑Docker的配置文件/etc/docker/daemon.json(如果没有就新建一个),添加以下内容:
{
  "iptables": false
}
  1. 重启Docker服务让配置生效:
systemctl restart docker
  1. 这时候你原来的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

火山引擎 最新活动