一、Centos重启restart network 网络导致docker容器Web业务服务异常
因为要变更DNS,所以修改了一下 /etc/resolve.conf 然后使用 service network restart 重启了网络。但没过多久就发现服务器上的所有docker业务都不能用了,排查到 docker 容器内部有报错:
docker: Error response from daemon: driver failed programming external connectivity on endpoint awesome_pasteur (...): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.17.0.3:8800 ! -i docker0: iptables: No chain/target/match by that name.
主要看这里:iptables: No chain/target/match by that name. 看提示是和防火墙有关,难道是网络重启把防火墙打开了?之前我记得防火墙是开的,但是呢通过 firewall-cmd 命令将一些端口进行了单独处理。
于是我使用命令关闭防火墙。我这里是Centos7, systemctl stop firewalld起作用。
systemctl stop firewalld
systemctl status firewalld
发现还是不行,最后是使用 service docker restart 把docker 重启了一下,业务才正常,后来我自己再重新试了一下。发现只要使用 service network restart 重启网络之后,docker下的业务就是会出问题。只需要使用 service docker restart 或 systemctl restart docker 重启 docker 就行。
看来网络重启操作不会导致 docker 里的 iptables 更新。所以启动Docker后对防火墙 firewalld 进行的操作,会导致上述报错。深入一点的原因就是当 firewalld 启动或者重启的时候,将会从 iptables 中移除 DOCKER 的规则,从而影响了 Docker 的正常运行。解决办法也是 systemctl restart docker 重启 docker 服务重新生成自定义链 DOCKER。
二、Centos7已加防火墙控制但系统漏洞扫描反馈能扫到Docker部署的Mysql 3306/3307端口
我在一台 Centos7 服务器上部署了MYSQL服务,使用的3307端口,但系统漏洞扫描反馈能扫到3307端口,但已加防火墙控制仅限业务服务器IP能访问到。问题是出现在搭建的 Mysql 服务使用的是 Docker 方式。
docker默认安装部署服务的时候会设置 iptables 把需要开放的端口,自动放到 iptables 的白名单规则中。这就导致虽然防火墙开启了,但是在限制之外的服务器依然能扫到 数据库的端口。这里可以使用一些方法来检测服务器的某个端口是否开放:Docker默认的路由规则是允许所有客户端访问,如果你希望避免 Docker 中容器被局域网内访问,要进行一些处理。
第一、在被监测的服务器上检查端口开放
1. 使用netstat和SS命令。ss命令的效率远高于netstat,如在统计服务器并发连接数时,ss的效率远超netstat。ss命令的用法,与netstat功能相同,可以用来查看系统上的端口是否开放。
2. 使用Lsof命令。在终端中输入lsof命令,用于列出当前系统打开的文件和进程信息,包括网络连接,可以用来检查端口是否开放。
第二、从其它服务器检测被监测的服务器上检查端口是否可扫到
A. Telnet命令。在终端中输入telnet命令,指定主机和端口如 telnet 192.168.0.1 80,如果成功,则表明该端口能扫到。
B. nc(Netcat)命令。在终端中输入nc命令,指定主机和端口如nc -zv 192.168.0.1 80,如果成功,表明该端口能扫到。
C. 使用Ping和Traceroute网络工具。这些工具可以通过向目标主机发送数据包,并记录数据包的传输路径和传输时间来实现这一目的。
其中nc命令很好用,Telnet命令也不错,但很多服务器都默认没有安装这个命令。有了方便的检测办法,也方便解决已加防火墙控制但系统漏洞扫描反馈能扫到Docker部署的端口问题了。
1、是修改docker的配置文件。
也推荐使用这个方法,修改daemon.json配置文件,这样的修改对所有容器都能生效,且在重启docker服务对在更改设置之前创建的容器也起作用。
vim /etc/docker/daemon.json
{
"iptables": false
}
2、修改docker容器启动命令
修改docker容器启动命令文件,手动指定 iptables=false 参数。docker daemon 存在一个 --iptables 的参数,用于控制是否使用 iptables 。我们使用以下命令启动一个 docker daemon 并关闭 iptables 支持。
docker run ... dockerd -iptables=false
docker run -d --privileged mysql:latest dockerd --iptables=false
------------------------------------