web-dev-qa-db-ja.com

KVM仮想マシンがインターネットにアクセスできません

専用サーバー(CentOS 6.3)で仮想マシン(ビルドエージェントとして機能するWindows Home Server 2011)を実行するようにKVMをセットアップしました)。最近、ホストで更新を実行しました。仮想マシンがインターネットに接続できなくなりました。

仮想ネットワークは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 
2
ssube

FORWARDチェーンのこれらの行:

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

before拒否ルールでなければなりません。そのような:

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ルールは冗長です。

3
davychiu

Libvirtdを再起動すると役立つ場合があります。同じ問題に一度直面し、libvirtdを再起動しただけです。 libvirtdに対応するiptablesルールが再度設定され、外部にpingを実行できます。

Sudoサービスlibvirtdの再起動

0
kumar