Dockerを入れたらKVMのゲストOS(Bridge接続)から外部に出られなくて困った

先日、導入したZOTAC MAGNUS EN1070KにUbuntu 16.04 LTSを入れて、KVMも入れて、Windows10やらCentOS7を入れて・・・ということをしていたのですが、急にゲストOS側から外部に出られなくなって困りました。

KVMやらの導入の顛末も書かずに、いきなりトラブルシューティングな記事を書くというのもどうかと思いますが、この問題で数時間を無駄にしてしまったので、書いておくことにします。

最初に気づいたのはWindows10にRDPできない

ゲストOSから外部に出られないというのは、Windows10からダメだというだけでなく、同じゲストOSとして導入しているCentOS7からもダメだということが分かって、どうやらWindows10の問題ではなさそうだ・・・ということが分かったからです。

で、そのもっと前には、ホストOSや別マシンからWindows10にRDPで接続できないということに気づいて、困ったな・・・ということから、このトラブルシューティングが始まりました。(でも、CentOS7にSSH接続することはできるんだよね・・・)

そんなこんなで、Windows10の再インストールまでもやったのに、それでもダメだったというか、IPv6でだけは通信出来るけど、IPv4ではダメだったとか、いろいろ。

どうやらホストOSにDockerを入れたのが原因らしい

いろいろ調べたり試したりしたところ、つい最近、ホストOSにDockerを入れたことに気づきました。ホストOSとゲストOSはKVMでデフォルトのNAT(virbr0)ではなく、ホストOSの物理NICに接続したブリッジ(br0)にして外部からゲストOSに接続する形にしているのですが、Dockerも独自のブリッジを作るので、その辺が関係しているのではないかとか・・・。

askubuntuにWith Ubuntu 16.04 and KVM, I can’t get vms to network without using NATという記事があって、これで解決しました。

具体的には、下記のような操作を行います。

99-bridge.rulesファイルを新規作成する

cat /etc/udev/rules.d/99-bridge.rules 
ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", RUN+="/lib/systemd/systemd-sysctl --prefix=/net/bridge"

bridge.confファイルを新規作成する

cat /etc/sysctl.d/bridge.conf 
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

あとはホストOSを再起動すれば、ゲストOSから外部に出られるようになりました。

理由は定かではありませんが、askubuntuのやり取りを見ると、Dockerをインストールした際に設定が書き換わったのではないか?ということでした。

もちろん、Windows10へのリモートデスクトップ接続も可能になりました。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。画像認識モデルを活用したアプリや、生成AIを業務に組み込むためのサービス「Gen2Go」の開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。