hostsファイルについて解説する

Kazuki Koide

February 20, 2020

hostsファイルとは

ホスト名をIPアドレスに変換する際に参照する設定ファイルのこと。 拡張子は無し。

hostsファイルの場所

hostsファイルが存在する場所は以下の通り。

OS 場所
Linux, Mac /etc/hosts
Windows(XP以降) C:\WINDOWS\system32\drivers\etc\hosts
Windows(2000以前) C:\WINNT\system32\drivers\etc\hosts

hostsファイルの働き

コンピュータが他のコンピュータにアクセスする際にはIPアドレスが必要になる。 しかしIPアドレスというのは「216.239.33.100」のように記憶しづらい。 じゃあIPアドレスに覚えやすい別名を付けて、その別名でアクセスできれば便利だよねということになった。 実際コンピュータにはその仕組みが実装されていて、hostsファイルにホスト名とIPアドレスを書いておけば、自動的にホスト名をIPアドレスに変換してくれるようになっている。

例えば自社のサーバの名前を「foo」とした場合、hostsファイルには以下のように記述する。

210.148.160.10 foo

こうしておくことで、fooという名前でサーバにアクセスできるので、fooというサーバ名だけを覚えておけば良いことになる。 また、サーバのIPアドレスが変更になった場合も、hostsファイルだけを書き換えれば済むというメリットもある。 ちなみに、ホスト名をIPアドレスに変換することを「名前を解決する」と言う。

例として、MacOSのデフォルトのhostsファイルは以下のようになっている。

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost

localhostというホスト名は、実はhostsファイルでIPアドレスに変換されていたのであった。

hostsとDNSの違い

DNSもhostsファイルと同じくホスト名とIPアドレスを変換するための仕組みである。 hostsファイルだと設定を他のコンピュータと共有したい場合にファイルの配布が面倒くさいのでそれを簡単にするために生まれた。 hostsファイルはコンピュータが自分でホスト名をIPアドレスに変換するのに対し、DNSでは専用のサーバを立てて、コンピュータがDNSに問い合わせてIPアドレスを取得する仕組みになっている。 コンピュータの台数が10台程度の小さなLANであればhostsで十分運用できるが、大規模のWANやインターネットでは一般的にDNSが使われている(といいつつも自分は昔3000台近い数のPCにhostsファイルを配信していたことがある。かなり大変だが無理ではない模様)。

DNSはhostsファイルと比較して配布が簡単である一方で、みんながDNSを参照しているため自分の都合で気軽に変更しづらいというデメリットもある。 なので例えば「ちょっとテストのために自分だけ一時的にアクセス先を変えたい」みたいなケースであれば、自分だけhostsファイルに記載して向き先を変えるのが良い。 コンピュータはhosts→DNSの順番で名前解決を試みるため、hostsファイルとDNSに同じホスト名の設定があった場合はhostsファイルの設定が優先される。 ただ、hostsファイルに設定したことを忘れてしまって、後日「あれ?何故か繋がらないんだけど!?」という事態になるのはあるあるなので気をつけよう。

hostsファイルを編集してみる

hostsファイルを変更するためのコマンドは特にないので、普通にテキストエディタを使って変更する。 hostsファイルは通常一般ユーザーの権限では書き込みができないので、管理者権限が必要。

192.168.3.1 foo
192.168.1.1 bar
192.168.3.2 baz

このように1つのホストに対して1行ずつ記載する。 変更できたら反映されているかpingコマンドで確認しよう。 (nslookupコマンドやdigコマンドはDNSの設定を確認するためのコマンドでありhostsファイルは使用されないので、ここではpingを使う)

$ ping foo

PING foo (192.168.3.1): 56 data bytes
Request timeout for icmp_seq 0

適当なIPアドレスなので応答は無いが、192.163.3.1に変換できていることが分かる。

余談

ちなみに、hostsファイルを改変して不正なサイトへ誘導するのはマルウェアの常套手段である。もしhostsファイルに覚えのない記述があればウィルスチェックをしたほうがいいかも?