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へのリモートデスクトップ接続も可能になりました。

コメントを残す