临时禁用Docker上的暴露端口

时间:2016-05-11 19:00:39

标签: networking docker ports

我想在runitme暂时禁用一些docker容器端口,这样就不需要更改图像或停止/启动容器。

我运行了一些服务,一个webclient,一个身份验证服务,一个mongodb实例以及一个负载均衡器,所有这些服务都位于同一个虚拟机中。

由于在docker中没有运行时修改公开端口的API,我必须使用iptables命令。

所以我已经构建了一些代码来禁用与作为参数传递的特定容器名称相关的端口。

我对身份验证服务器有以下规则:

-A DOCKER -d 172.18.0.16/32 ! -i br-3ec61cf14e6e -o br-3ec61cf14e6e -p tcp -m tcp --dport 8081 -j ACCEPT

我的代码修改如下:

-A DOCKER -d 172.18.0.16/32 ! -i br-3ec61cf14e6e -o br-3ec61cf14e6e -p tcp -m tcp --dport 8081 -j DROP

此时我希望我不能再进行身份验证,但我仍然可以这样做。

同时如果对负载均衡器尝试相同的代码,一切正常,我无法按预期访问URL。

这些是nginx的原始规则:

-A DOCKER -d 172.18.0.11/32 ! -i br-3ec61cf14e6e -o br-3ec61cf14e6e -p tcp -m tcp --dport 81 -j ACCEPT
-A DOCKER -d 172.18.0.11/32 ! -i br-3ec61cf14e6e -o br-3ec61cf14e6e -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER -d 172.18.0.11/32 ! -i br-3ec61cf14e6e -o br-3ec61cf14e6e -p tcp -m tcp --dport 443 -j ACCEPT

这里修改过的:

-A DOCKER -d 172.18.0.11/32 ! -i br-3ec61cf14e6e -o br-3ec61cf14e6e -p tcp -m tcp --dport 81 -j DROP
-A DOCKER -d 172.18.0.11/32 ! -i br-3ec61cf14e6e -o br-3ec61cf14e6e -p tcp -m tcp --dport 80 -j DROP
-A DOCKER -d 172.18.0.11/32 ! -i br-3ec61cf14e6e -o br-3ec61cf14e6e -p tcp -m tcp --dport 443 -j DROP

在docker ps命令的输出下面

[root@sandbox-test-28 ~]# docker ps 
CONTAINER ID        IMAGE                       COMMAND                   CREATED             STATUS              PORTS                                                               NAMES
d007479faaf4        service-auth-nodejs         "/bin/sh -c \"/usr/bin"   2 days ago          Up 2 days           0.0.0.0:8081->8081/tcp                                              authentication-microservice
c073989b49ce        nginx                       "/bin/bash -c /etc/ng"    2 days ago          Up 2 days           0.0.0.0:443->443/tcp, 0.0.0.0:9000->80/tcp, 0.0.0.0:10000->81/tcp   nginx-microservice
432ea895d90a        web                         "/bin/sh -c \"/usr/bin"   2 days ago          Up 2 days           0.0.0.0:8000->8000/tcp                                              webclient-microservice
0c8141da8c0b        mongo                       "/entrypoint.sh mongo"    2 days ago          Up 2 days           0.0.0.0:27017->27017/tcp                                            mongo-microservice
[root@sandbox-test-28 ~]# 

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

规则中的子网不同:

172.18.0.11/32 (authentication service)

VS

172.18.0.16/32 (nginx)

因此,您的身份验证服务器的数据包可能会通过172.18.0.16到达,并且仍然可以使用其他规则。