Networking

KVM 虛擬機無法上網

  • August 8, 2018

我已將 KVM 設置為在專用伺服器(CentOS 6.3)上執行虛擬機(Windows Home Server 2011 作為建構代理)。最近在主機上執行更新,虛擬機現在無法連接到網際網路。

虛擬網路通過 NAT 執行,主機有一個使用靜態 IP 設置的介面 (eth0:0)(virt-manager 正確顯示網路及其 IP),所有到該 IP 的連接都應該發送給來賓。

主機和客人可以互相ping通,但是客人不能ping主機上面的任何東西,我也不能從其他任何地方ping客人(我可以ping主機)。從來賓到我控制下的另一台伺服器的結果以及從外部系統到來賓的結果都返回“無法訪問目標埠”。在主機和目標上執行 tcpdump 顯示主機正在回复 ping,但目標永遠不會看到它(它甚至看起來主機根本不費心發送它,這導致我懷疑 iptables)。ping 輸出與之匹配,列出來自 192.168.100.1 的回复。

但是,來賓可以解析 DNS,我覺得這很奇怪。訪客的網路設置(連接 TCP/IPv4 屬性)使用靜態本地 IP (192.168.100.128)、遮罩 255.255.255.0、網關和 DNS 設置為 192.168.100.1。

最初設置 vm/net 時,我設置了一些 iptables 規則來啟用橋接,但在我的託管公司抱怨橋接後,我使用 NAT 設置了一個新的虛擬網路,並相信我刪除了所有規則。

在過去的幾個月裡,直到昨天,VM 的網路都執行良好。我沒有收到託管公司的任何消息,沒有改變客人的任何東西,據我所知,沒有其他任何改變(不幸的是,更新的包列表已經從回滾中掉了下來,我沒有註意到它向下)。

更新:

iptables -L:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:bootps 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:bootps 
ACCEPT     tcp  --  main-domain          anywhere            tcp dpt:mysql 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.100.0/24    state RELATED,ESTABLISHED 
ACCEPT     all  --  192.168.100.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 
ACCEPT     all  --  anywhere             192.168.100.128     
ACCEPT     all  --  anywhere             guest-subdomain

iptables -t nat -L:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       all  --  anywhere             guest-subdomain to:192.168.100.128 

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  tcp  --  192.168.100.0/24    !192.168.100.0/24    masq ports: 1024-65535 
MASQUERADE  udp  --  192.168.100.0/24    !192.168.100.0/24    masq ports: 1024-65535 
MASQUERADE  all  --  192.168.100.0/24    !192.168.100.0/24    
SNAT       all  --  192.168.100.128      anywhere            to:guest-ip 

FORWARD 鏈中的這些行:

ACCEPT     all  --  anywhere             192.168.100.128     
ACCEPT     all  --  anywhere             guest-subdomain

應該拒絕規則之前。這樣:

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.100.128     
ACCEPT     all  --  anywhere             guest-subdomain
ACCEPT     all  --  anywhere             192.168.100.0/24    state RELATED,ESTABLISHED 
ACCEPT     all  --  192.168.100.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 

您可以刪除它們並使用以下內容在頂部插入規則。

iptables -I FORWARD -d guest-subdomain -j ACCEPT
iptables -I FORWARD -d 192.168.100.128 -j ACCEPT

SNAT 規則也是多餘的,因為您已經有了 MASQUERADE 規則。

引用自:https://serverfault.com/questions/443147