虚拟机ping不通主机|外网IP连不上虚拟机

【摘要】 虚拟机ping不通主机|外网IP连不上虚拟机
参考网址:https://www.lullabot.com/articles/fixing-docker-and-vpn-ip-address-conflicts
问题:虚拟机有个web服务,开启了3000端口监听,VMware已经设置了NAT IP映射,将虚拟机IP:3000映射到宿主机的8888端口,浏览器能够通过l…

虚拟机ping不通主机|外网IP连不上虚拟机

参考网址:https://www.lullabot.com/articles/fixing-docker-and-vpn-ip-address-conflicts

问题:虚拟机有个web服务,开启了3000端口监听,VMware已经设置了NAT IP映射,将虚拟机IP:3000映射到宿主机的8888端口,浏览器能够通过localhost:8888打开网页,但是不能通过ip:8888打开网站,并且发现虚拟机不能够ping通主机,折腾了一天,终于发现了问题并解决了。

宿主机的IP为172.21.XX.XX。

虚拟机的IP为192.168.100.128。

1、查看虚拟网卡

首先先用ifconfig或者ip addr来查看所有虚拟网卡

6: br-08e37aab0021: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:40:a3:a0:63 brd ff:ff:ff:ff:ff:ff inet 172.21.0.1/16 brd 172.21.255.255 scope global br-08e37aab0021 valid_lft forever preferred_lft forever
8: br-70d04f7b2a8c: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:35:bb:bc:eb brd ff:ff:ff:ff:ff:ff inet 172.19.0.1/16 brd 172.19.255.255 scope global br-70d04f7b2a8c valid_lft forever preferred_lft forever
9: br-86768d2533cf: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:71:49:8e:d7 brd ff:ff:ff:ff:ff:ff inet 172.18.0.1/16 brd 172.18.255.255 scope global br-86768d2533cf valid_lft forever preferred_lft forever
10: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:a0:61:83:8f brd ff:ff:ff:ff:ff:ff inet 172.240.0.1/24 brd 172.240.0.255 scope global docker0 valid_lft forever preferred_lft forever

  
 

发现172.21.XX.XX被ubuntu创建的虚拟网卡给占用了,所以ping宿主机会ping不通。

因此关掉这一个虚拟网卡就行了。

ifconfig xxx down

  
 

这样子虚拟机就能够ping主机了。

但这种方法治标不治本,因为下次重启的时候还会有虚拟网卡占用位置,需要解决根本问题

2、查找根源

经过我的推理,发现docker0是从172.17开始的,然后一群br-打头的是在docker0按序排列的,因此怀疑是docker的容器问题,通过后续的验证,确实是这个问题。

查看所有docker的网络。

docker network ls

  
 
NETWORK ID NAME DRIVER SCOPE
5a2ae899ce99   bridge bridge local
08e37aab0021   ca bridge local
.......

  
 

会发现network id正好和上面br-08e37aab0021相对应!

通过下面的语句来查看网络声明了哪些子网。

docker network inspect 08e37aab0021

  
 

可以看到下面的输出,因此确实是docker的其中一个容器使用了这些网络

"Subnet": "172.21.0.0/24",
"Gateway": "172.21.0.1"

  
 

找到这里,已经发现了根源,因此只需要解决问题就行了。

3、解决问题

要解决此问题,我们可以修改docker使用的默认daemon.json文件。

$ vi /etc/docker/daemon.json
{
  "default-address-pools" : [ { "base" : "172.240.0.0/16", "size" : 24 }
  ]
}

  
 

上面配置意思:docker所有的服务在地址池 172.240.0.0/16 网段范围划分,每个子网掩码划分为 255.255.255.0

因此docker0的地址会是172.240.0.XX

下一个br-的地址会是172.240.1.XX

以此类推。

4、重启docker

停止所有的容器。

docker stop $(docker ps -a -q)

  
 

重启docker服务

systemctl restart docker

  
 

删除所有未使用的网络

docker network prune

  
 

到这里你再查看所有虚拟网卡

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500 inet 172.32.0.1  netmask 255.255.0.0  broadcast 172.32.255.255 ether 02:42:0c:b7:b6:ef  txqueuelen 0  (以太网) RX packets 0  bytes 0 (0.0 B) RX errors 0  dropped 0  overruns 0  frame 0 TX packets 0  bytes 0 (0.0 B) TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  
 

会发现docker会按照你之前给定的ip开始,如果开启新的docker容器,也是按照地址池的范围来进行设置。

到这里我们就解决了问题,可以互相ping通了,并且浏览器也能通过ip访问到了虚拟机内搭建的网页。

文章来源: blog.csdn.net,作者:晓凹凸曼,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_41109085/article/details/116671530

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享