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