ドメインはDNS(ドメインネームサーバ)という仕組みでIPアドレスと紐づけられています。DNSはドメイン(ホスト名)とIPアドレスを相互に変換します。
しかし、hostsファイルがローカル環境にあった場合、DNSへの問い合わせの前に参照されるため、こちらの設定が優先されます。
仕組みとしては単純ですが、意外にうまく認識しないケースも多いようなので、hostsの書き方の手順と注意点についてまとめました。
hostsファイルとは
ブラウザなどでyahoo.co.jpというURLにアクセスするとDNSサーバに問い合わせて、118.151.235.191というようなIPアドレスを取得してそれに対して通信を行います。
hostsファイルが存在し、かつ、該当ドメインに対する記述があった場合、指定通りに名前解決を行うことができるわけです。
つまり、yahoo.co.jpという要求に対して任意のサーバへアクセスさせることできます。
hostsの役割りと意味はWindows PCであれMacであれ同じです。
どんな使い道があるの?
クライアントとしての立場ならサイトや広告のブロックですが、もっとも有効に活用できる例はウェブサイト制作の現場でしょう。
hostsファイルを書き換えることでドメインとIPアドレスを仮想的に割り当てて、公開前のウェブサイトをインターネット上で確認したり、移転作業などで本来のIPアドレスとは違うサーバを参照できます。
DNSよりhostsが優先されるので、悪用すればマルウェアなどウィルスで改竄することにより、特定のスパムサイトに誘導したりできるわけです。
Windows hostsの書き方
書式はWindows系やUNIX系も基本的に同様でシンプルなものです。
118.151.235.191 example.com
- IPアドレス+半角スペース+ドメイン名
- 文字コードはANSI
※記述する場所はどこでも構いませんが、最後の行が分かりやすいでしょう。
hostsファイルの場所
現役のWindowsでは11も含めて共通で下記の場所にあります。
C:\Windows\System32\drivers\etc
「プログラムとファイルの検索」やエクスプローラーのアドレスバーに以下をコピペしても表示できます。
%WinDir%\System32\Drivers\Etc
Windows10のhostsファイル
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a ‘#’ symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
118.151.235.191 example.com
上記では例としてyahooのIPアドレスにexample.comというドメインを紐づけています。
変更する場合の注意点は該当ファイルをそのままテキストエディタなどで開くと権限の問題で保存することができません。
アプリケーションを管理者権限で実行するか、デスクトップなどにコピーしてから編集後、書き換えてください。
コピーの際も権限を要求される場合がありますので、適時、実行ください。
※保存したファイルに.txtなどの拡張子が付いている場合はhostsファイルとして認識しませんので、削除ください。
hostsの文字コード
先に述べたように日本語環境の場合、Windowsのhostsファイルのデフォルト文字コードはShift_JISにマイクロソフトが独自に拡張を加えたANSI(CP932)です。
実際には、Shift_JIS(改行コード:CR+LF)、もしくはUFT-8(改行コード:CR+LF)であれば、ほとんどの場合は問題ないはずです。
もし、純正ではないテキストエディタで編集して動作しない場合はメモ帳(Notepad)で開き、文字コードをANSIで保存し直します。
これでほぼ間違いなく動作するでしょう。
Macintoshでのhosts変更
hostsファイルの場所
MacではHosterという定番アプリがよく使われるようですが、結局はオリジナルにオーバーライドする形になるので、ここでは通常のテキストエディタで直接編集してみます。
hostsファイルは/private/etc/に存在しますが、privateは不過視フォルダのため、デスクトッププルダウンメニュー「移動」→「フォルダに移動」にて/etc/とすることで、フォルダを開くことができます。
Machintoshの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
118.151.235.191 example.com
※最終行はWindowsの例と同じく、example.comというドメインを紐づけています。
テキストエディタでの編集
デフォルトのアプリは純正のテキストエディットとなっているはずですが、権限の問題で上書き保存ができません。
このため、あらかじめデスクトップなどにコピーしてから編集するか、別名保存します。
書き換えはWindowsと同じく、最終行に「IPアドレス+半角スペース+ドメイン名」で追記します。
※hostsファイルをetcフォルダに移動する際にはアカウントのパスワード入力が必要です。
ターミナルでの編集
ターミナルのvimで書き換えましょう。
root権限が必要なため、sudoで実行します。
sudo vim /etc/hosts
パスワードを入力して、iキーまたは、aキーでインサートします。
escで編集モードを抜けて「:wq」で保存します。
pingで確認してみよう
まずは設定したドメインに対してPINGを実行してみましょう。
ping example.com
hostsが正常に認識できていれば、example.comへPINGを打つと118.151.235.191から応答が返ってきます。
hostsファイルは本来ブラウザでも即時適用されますが、PINGが正常に返ってきているが、ブラウザで反映されない場合はスーパーリロードを試してください。
変更したhostsが効かない
Proxy hostsが優先
前提条件として、ネットワークがプロキシーを経由していないか?
どのOSにおいてもproxy(プロキシー)を使用している環境では実際にアクセスするhostsファイルはクライアントのローカル環境ではなく、プロキシーサーバになります。
DNSキャッシュのクリア
もっとも考えられる原因が古いDNSキャッシュの影響です。
hostsファイルの編集しても、反映されない場合は各OSでキャッシュをクリアするためのコマンドを実行します。
Windows
DNSキャッシュが古い情報を保持しているため、hostsファイルの変更がすぐに反映されないことがある。
ipconfig /flushdns
Linux
systemd-resolvedやdnsmasqなどのサービスがDNSキャッシュを保持しているため、hostsファイルがすぐに反映されないことがある。
sudo systemd-resolve --flush-caches
sudo service dnsmasq restart
systemd-resolveやdnsmasqのサービスを再起動する。
MacOS
MacOSもDNSキャッシュを持っており、hostsファイルの変更が反映されないことがある。
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
補足
客先のWindows11でどうしてもhostsファイルが認識しないというケースに出くわしました。
どれも該当しないのに、指定のサーバに向きません。
- 記述書式
- ファイル形式
- 拡張子
- 保存場所
- DNSキャッシュ
ほとほと困り果て、hostsファイルに違うドメインのエントリをもう1行加えてみたところ、すべて適切に反映されるようになりました。
これは、DNSキャッシュのクリアやクライアントサービスのリスタートを試しても適用されないhostsファイルが新しい行を追加したことがトリガーとなり、ファイルが再読み込みされ、正しく反映されたと解釈できるでしょう。
このような対処が効果的なケースもあることを覚えておくとよいです。