默认分类 · 2023-09-05 0

Fix KVM network broken by docker

近日,组内一个同事把虚拟机主机上装了docker, 然后所有虚拟机全都连不上网,这里记录一下恢复的整个过程。

环境

主机安装了open-nebula, 基于KVM创建若干VM, 同时也从其它服务器转移过来几个VM,通过virsh安装的,然后在opennebula中导入了。

VM网络是基于br0的桥接网络

确认问题

  1. 主机ping不通VM
  2. VM ping不通主机
  3. 外部机器ping不通VM
  4. 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应该没什么用。