破棄されたブログ

このブログは破棄されました。

mDNS を使いローカルマシン内の仮想環境に接続する

この記事は、 2015 tech-yuruyuru アドベントカレンダー 2 日目の記事です。

ローカルマシン内の仮想環境へアクセスするには、いくつかの方法があります。 この記事では、 mDNS を用いて名前解決行い、 仮想環境へのアクセスする方法について説明します。

mDNS とは何か

mDNS は、ローカルネットワーク内の機器を、 DNS サーバなどを介さずに自動的に 発見するための(サービスディスカバリ)仕組みです。

mDNS は、 Apple が策定したオープンな仕様で、 Apple 製の OS X はもちろん、 ソフトウェアをインストールすることで LinuxWindows でも利用可能です。

特定の DNS サーバを介すことはありませんが、 RFC 6752 に記載されている通り、 mDNS 自体は DNS に基づいた技術です。

ユニキャストである通常の DNSDNS サーバにクエリを投げるように、 マルチキャストアドレス 224.0.0.251 の UDP 5353 ポートに DNS クエリを投げると、対応する機器が応答します。

また、 mDNS では、 .local. という TLD を冠します。

dig

DNS にもとづいているため、 dig を使うことができます。

例えば my-machine というホスト名のマシンの IP アドレスを 見つけるには以下のようにします。

$ dig +short my-machine.local. @224.0.0.251 -p 5353
192.168.1.42

デモ

Vagrant を用いて、 Cent OS 6 と Debian 8 に avahi をインストールし、 getaddrinfo() で各仮想マシンに割り振られた IP アドレスを確認します

以下のの通り Avahi をインストールするだけの Vagrantfile を作成し、 vagrant up します

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|

  # DHCP で自動的に IP アドレスを割り当てる
  config.vm.network "private_network", type: "dhcp"

  config.vm.define :centos do |server|
    server.vm.box = "chef/centos-6.5"
    server.vm.hostname = :centos
    server.vm.provision "shell", inline: <<-SHELL
      sudo yum update -y
      sudo yum install -y http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/nss-mdns-0.10-8.el6.x86_64.rpm
      sudo service messagebus start
      sudo service avahi-daemon start
    SHELL
  end

  config.vm.define :debian do |server|
    server.vm.box = "debian-8.2"
    server.vm.hostname = :debian
    server.vm.provision "shell", inline: <<-SHELL
      sudo apt-get update && apt-get upgrade -y
      sudo apt-get install -y avahi-daemon
    SHELL
  end
end

無事、 vagrant up に成功し、プロビジョニングまで終わったら、 各仮想マシンに割り当てたホスト名から、それぞれの IP アドレスを引いてみます。

今回は、 IP アドレスを引くために getaddrinfo() を用いてみます

$ python
>>> from socket import getaddrinfo
>>> { h: getaddrinfo(h + '.local', 0)[0][4][0] for h in ['debian', 'centos']}
{'debian': '172.28.128.4', 'centos': '172.28.128.3'}

仮想マシンに割り振られた、 IP アドレスを無事に引くことができました。

mDNS を使うことで、例えば /etc/hosts を毎回更新するといった手間から解放されます。

問題

ただし、 mDNS を使う場合、ローカルネットワーク内のマシンが信用できることが前提で、 偽名を名乗るマシンがネットワーク内に存在する場合には、問題が発生します。

マルチキャストパケットが、仮想環境のローカルネットワークだけに流れるように ルーティングすれば、もしかしたら、この問題は回避できるかもしれませんが、未確認です。

参考

広告を非表示にする