近日,组内一个同事把虚拟机主机上装了docker, 然后所有虚拟机全都连不上网,这里记录一下恢复的整个过程。
环境
主机安装了open-nebula, 基于KVM创建若干VM, 同时也从其它服务器转移过来几个VM,通过virsh安装的,然后在opennebula中导入了。
VM网络是基于br0的桥接网络
确认问题
- 主机ping不通VM
- VM ping不通主机
- 外部机器ping不通VM
- VM ping不通外部机器
卸载docker
docker肯定是不能留的,因为docker对网络的控制比较深,我对其中的机制不是很清楚,无法保证docker与VM共存情况下的网络不出问题。
sudo systemctl stop docker
sudo systemctl stop docker.socket
sudo yum remove docker-ce
发现卸载完成后,网络仍然没有恢复,继续查找问题
删除docker0
docker0这个bridge仍然存在,于是删除之
sudo ifconfig docker0 down
sudo brctl delbr docker0
之后,发现主机与VM可以互相ping通了,但是外部主机仍然不行。
于是继续删除其它br-开头的网络,这些应该是docker容器的网络
无果,考虑是不是docker修改了转发规则
sudo sysctl -p |grep ip_forward
发现规则还在,并不是这个问题。
iptables
查看iptables, 发现docker残留了一些chain, 于是删掉
sudo iptables -X DOCKER
sudo iptables -X DOCKER-ISOLATION-STAGE-1
sudo iptables -X DOCKER-ISOLATION-STAGE-2
结果,仍然不行
重启
最后,只能祭出重启大法了。果不其然,重启服务器后网络一切正常了。
现在想来,以上步骤的,卸载docker+删除docker0+重启应该是解决问题的办法, iptables应该没什么用。