.04無法訪問中虛擬機的網(wǎng)絡
宿主機:.04
虛擬機:.9
虛擬機網(wǎng)絡配置:NAT
問題描述:宿主機和虛擬機無法互相ping,但虛擬機可以訪問外網(wǎng)
一、虛擬機配置
將虛擬機網(wǎng)絡設置為NAT模式(網(wǎng)上有教程說要設置成橋接模式才能實現(xiàn)虛擬機和宿主機的互通,這顯然沒有好好了解過這幾種網(wǎng)絡模式的工作原理和網(wǎng)絡原理)
查看虛擬機NAT網(wǎng)關的IP
打開edit、 :
查看虛擬機的NAT網(wǎng)關設置情況,虛擬機的NAT網(wǎng)卡名稱為:
本機的網(wǎng)關IP為172.16.54.2
網(wǎng)上的教程一直有個誤區(qū),認為網(wǎng)關的IP一定是xxx.xxx.xxx.1
配置的網(wǎng)絡
默認是不開啟網(wǎng)卡的,剛安裝完成后,運行ip addr,只有一個127.0.0.1的IP
查看網(wǎng)卡配置文件:
vi /etc/sysconfig/network-scripts/ifcfg-ens33
確保=yes,如果不是yes,請修改為yes,然后運行 重新啟動網(wǎng)絡服務。
配置靜態(tài)IP
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改文件:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=59d44424-e881-4777-aa56-8a559bffdf47
DEVICE=ens33
ONBOOT=yes
GATEWAY=172.16.54.2
DNS1=8.8.8.8
DNS2=114.114.114.114
NETMASK=255.255.255.0
IPADDR=172.16.54.101
主要改的是:
虛擬機IP配置完成
二、宿主機的配置
ok,現(xiàn)在問題來了,我的宿主機想通過ssh連接虛擬機,結果發(fā)現(xiàn)IP無法到達。
查看宿主機的IP:
ip addr
查看虛擬機NAT網(wǎng)卡對應的IP無法往虛擬機復制文件,本機的IP為172.16.54.1:
嘗試在虛擬機中去ping宿主機的IP,發(fā)現(xiàn)無法ping通,而在宿主機中去ping虛擬機的IP發(fā)現(xiàn)也無法ping通。
但是,虛擬機可以ping通網(wǎng)關的IP,宿主機無法ping通網(wǎng)關的IP,說明宿主機的路由配置有問題。
分析路由表
用route -n命令查看雙方路由表:
安裝route命令:
:sudo apt net-tools
:yum net-tools
虛擬機:
這個路由表沒有問題
宿主機:
route -n | grep 網(wǎng)關IP的前三位
這路由表顯然有問題無法往虛擬機復制文件,目的地址為172.16.54的所有網(wǎng)段的IP都通過tun0設備進行轉發(fā),而不是虛擬機NAT網(wǎng)關。
嘗試修改172.16.54.101對應的網(wǎng)段172.16.54.64的路由表匹配項目:
也可以把除了172.16.54.0 0.0.0.0 255.255.255.0 U 0 0 0 的所有轉發(fā)選項都刪除,這樣對于172.16.54.0的所有IP都會通過
sudo route add -net 172.16.54.64 netmask 255.255.255.192 dev vmnet8
問題解決。
三、分析原因
在剛開機,未啟動的軟件的時候,我的宿主機的路由表在172.16.54網(wǎng)段只有一個路由表選項:
啟動后被添加了錯誤的路由,導致宿主機無法訪問虛擬機的網(wǎng)絡。
那么解決辦法只有:
參考shell腳本:
#!/bin/bash
IFS=$'\n'
for routeList in $(route -n); do
mydes=$(echo $routeList | sed -n '/^172\.16\.54\./p')
if [ $mydes ] >"172.16.54"; then
iface=$(echo $mydes | awk '{print $8}')
if [ $iface != 'vmnet8' ]; then
net=$(echo $mydes | awk '{print $1}')
netmask=$(echo $mydes | awk '{print $3}')
sudo route del -net $net netmask $netmask
echo "route del -net $net netmask $netmask"
fi
fi
done
IFS=$IFS.OLD