Kvm ゲスト ネットワークに到達できません

Kvm ゲスト ネットワークに到達できません

Ubuntu を実行している複数のゲスト VM を備えた KVM セットアップがあります。

何らかの理由で、ゲストから外部へのトラフィックをポート 80 経由で取得できなくなりました。逆の場合は問題なく動作し、Apache はホストされた Web ページを正常に配信します。ssh などの他のポートも問題なく動作します。

次に例を示します。

me@guest:~$ curl heise.de
curl: (7) Failed to connect to 2a02:2e0:3fe:100::8: Network is unreachable

Curl は、長めのタイムアウト後にネットワークに到達できずに失敗し、本来は使用すべきではない IPv6 アドレスを使用しようとしているようです。ローカルにホストされているドメインに対して Curl は機能します。

Ping の動作:

me@guest:~$ ping heise.de
PING heise.de (193.99.144.80) 56(84) bytes of data.
64 bytes from redirector.heise.de (193.99.144.80): icmp_req=1 ttl=245 time=6.92 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_req=2 ttl=245 time=7.05 ms

すべてのゲストで同時に発生したため、ホスト側で何か操作を行ったのではないかと考えています。しかし、自作の iptables ルールをすべて無効にしても、まだ機能しません。

つまり、kvm/libvirtネットワーク内のどこかで、httpリクエストが本来あるべきではない場所へ送られてしまいます。これがKVMのネットワーク構成です。

<network>
  <name>network_nat</name>
  <uuid>....</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <mac address='52:54:00:30:9B:D6'/>
  <ip address='192.168.100.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.100.128' end='192.168.100.254' />
      <host mac='52:54:00:e4:71:f5' name='web' ip='192.168.100.210' />
    </dhcp>
  </ip>  
</network>

ゲストはそのネットワークを使用するように設定されています。DHCP は動作しているようです。少なくともゲストには私が設定した IP アドレスがあります。

では、なぜゲストからどの Web サイトにもアクセスできないのでしょうか?

答え1

問題の一部は再起動後に解決しました。次のアドバイスに従っている可能性があります:http://wiki.libvirt.org/page/ネットワークネットワークインターフェースの修復に役立ちました。

私はこれらの行を追加しました/etc/sysctl.conf

net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

また、インターフェース定義を/etc/network/interfaces次のように変更しました。

auto  br0
iface br0 inet static
  address   176.9.xxx.xxx
  broadcast 176.9.xxx.xxx
  netmask   255.255.255.224
  gateway   176.9.xxx.xxx
  bridge_ports eth0
  bridge_fd 0 
  bridge_maxage 0
  bridge_stp off

これら 2 つの変更 (効果があるかどうかはわかりません) と再起動後、curl はタイムアウトと「ネットワークにアクセスできません」エラーに遭遇しなくなり、代わりにローカル Apache からの結果が生成されました。iptables での自分のポート転送が原因であることが明らかになりました。ポート 80 と 443 のポート転送に着信インターフェイスを指定していませんでした。br0 を追加したら、すべて正常に動作しました。

ポート転送のためのiptablesルールは次のとおりです。私はこれをufwと組み合わせてファイアウォールとして使用しているため、/etc/ufw/before.rules

これはフィルター テーブルに追加されます:

-I FORWARD -m state -d 192.168.100.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

これが私の NAT テーブルです。エラーは--in-interfaceパラメータの省略でした:

*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 12345 -j DNAT --to 192.168.100.210:22
-A PREROUTING -p tcp --in-interface br0 --dport 80 -j DNAT --to 192.168.100.210:80
-A PREROUTING -p tcp --in-interface br0 --dport 443 -j DNAT --to 192.168.100.210:443
-A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
COMMIT

(注: 何らかの理由で、ufw が無効になっているときに同じルールを手動で入力しても、機能するポート転送構成は生成されません。)

関連情報