龙空技术网

玩转Docker:解决Docker容器未授权直接绕过宿主机禁用端口的BUG

小林软件工作室 469

前言:

今天各位老铁们对“centos7停止docker”大约比较重视,你们都需要学习一些“centos7停止docker”的相关资讯。那么小编也在网上搜集了一些关于“centos7停止docker””的相关资讯,希望我们能喜欢,我们一起来学习一下吧!

我以为经过前面四篇博文的学习,自己对docker的了解最起码入门了,但是当我用docker启动一个81端口的nginx后(宿主机:容器/81:80),在宿主机的firwall防火墙没有添加81端口的情况下,竟然可以直接访问成功,然后试下docker运行mysql容器用3308端口,发现也是在firwall没有添加端口的情况下,仿佛绕过了防火墙可以直接访问到容器,当时就懵逼了…

环境

CentOS7firewalldockernginx
解决流程1、以为是docker和firewall的启动顺序问题导致的

开始我以为是因为我先启动docker后面重启了firewall导致firewall不能够监控docker,然后我还美滋滋的觉得终于找到问题了。最后发现,太天真了,启动顺序完全没影响。

2、宿主机的防火墙和docker容器的防火墙冲突

后面我想到docker也是一个轻量级的linux操作系统,也有自己的防火墙,会不会是因为docker启动自己的防火墙后,权限级别直接绕过了宿主机的防火墙,因此百度了很多,后面按照网上的说法启动容器的时候加上—iptables=false,这样可能就关闭掉了容器的iptables防火墙,然而经过尝试并没有什么用,而且好像第二次启动容器直接就启动不了了,报什么iptables错误

3、直接修改配置文件不使用docker的iptables防火墙

因为我现在的操作系统是CentOS7,所以宿主机用的是firewall,而docker用的是iptables,百度查找说需要在文件/etc/default/docker中添加如下内容

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"

然后我美滋滋的跟着执行,发现这个文件根本不存在,因此我又直接新建这个文件,保存,接着执行如下两条命令重新加载文件和重启docker

#重载systemctl daemon-reload#重启docker服务service docker restart

启动容器,重新访问,喵的,还是可以直接访问,仿佛这个配置文件完全没有用然后直接百度,发现需要在文件/usr/lib/systemd/system/docker.service中添加如下配置,一下是我的文件

[Unit]Description=Docker Application Container EngineDocumentation= firewalld.service containerd.serviceWants=network-online.targetRequires=docker.socket[Service]Type=notify# the default is not to use systemd for cgroups because the delegate issues still# exists and systemd currently does not support the cgroup feature set required# for containers run by dockerExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_OPTSExecReload=/bin/kill -s HUP $MAINPIDTimeoutSec=0RestartSec=2Restart=alwaysEnvironmentFile=-/etc/default/docker# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.# Both the old, and new location are accepted by systemd 229 and up, so using the old location# to make them work for either version of systemd.StartLimitBurst=3# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make# this option work for either version of systemd.StartLimitInterval=60s# Having non-zero Limit*s causes performance problems due to accounting overhead# in the kernel. We recommend using cgroups to do container-local accounting.LimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinity# Comment TasksMax if your systemd version does not supports it.# Only systemd 226 and above support this option.TasksMax=infinity# set delegate yes so that systemd does not reset the cgroups of docker containersDelegate=yes# kill only the docker process, not all processes in the cgroupKillMode=process[Install]WantedBy=multi-user.target
a、添加配置文件,(-代表ignore error)
EnvironmentFile=-/etc/default/docker
b、在ExecStart后面添加如下内容
$DOCKER_OPTS

虽然搞不懂为什么,反正接下来修改完/etc/default/docker后重载重启

#重载systemctl daemon-reload#重启docker服务service docker restart

重新启动nginx容器,我的天,终于不能访问了。执行如下命令开启81端口

firewall-cmd --zone=public --add-port=81/tcp --permanentfirewall-cmd --reload

我的天,终于可以访问了,测一下docker启动mysql的访问,也被firewall拦截了。真是要命的东西

结语

虽然最终解决了,但是具体原理并不是太过明了,但是最起码docker启动的容器再也不会绕过firewall的限制,服了。

标签: #centos7停止docker