我想在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 ~]#
我错过了什么吗?
答案 0 :(得分:1)
规则中的子网不同:
172.18.0.11/32 (authentication service)
VS
172.18.0.16/32 (nginx)
因此,您的身份验证服务器的数据包可能会通过172.18.0.16
到达,并且仍然可以使用其他规则。