名前解決の様々な方法と具体例

名前解決とは

PC や携帯が特定の URL にアクセスしようとしたとき PC や携帯に設定されている DNS が、 アクセスしようとしている FQDN(google.co.jp のようなもの) の ip アドレスを知らなければ、
FQDN を ip アドレスに変換することができず、その URL にアクセスすることはできません。

この FQDN を ip アドレスに変換する操作のことを、 名前解決 といいます。

例えば、 LAN 内の PC や RaspberryPi に my-server.jp という名前で勝手に web サーバを建てたとしても、
クライアントに何も設定をしなければ、その名前を解決することはできず、ブラウザに http://my-server.jp のような URL を入力してもアクセスすることはできません。
ただし、 仮に web サーバの ip アドレスが 192.168.1.2 だったとすると、 http://192.168.1.2 のように ip アドレスを直接探しに行くようにすれば、
web サーバにアクセスすることができます。

名前解決の方法

この名前解決をする方法は、主に以下のようなものがあります。

これらはそれぞれ、以下のような特徴があります(以下の図は抽象的な概念図で、実際のパケットの流れとは異なります)。

図からだとDNS サーバと proxy サーバの違いがわかりにくいですが、名前解決の処理において DNS サーバと proxy サーバの違いは以下のようになります。

proxy サーバはパケット自体を処理するため、名前解決以外にもキャッシュの生成や、アクセス制限など多くの機能を備えており、
むしろ名前解決の機能は、本来の proxy サーバの用途においての副次的な機能だと思います。

名前解決のための proxy サーバの設定

では次に、具体的なサーバの設定についてです。
現在、社内で DNS サーバは運用していないため、 proxy サーバの設定について説明します。

サーバ

環境

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.5 LTS
Release:        16.04
Codename:       xenial

設定

squid(docker-squid) を使います。
ですが、 squid は名前解決を行う際、 Linux が備えるシステムの名前解決の機能(/etc/hosts)の設定を利用します。
そのため、squid について解説する前に、まず、 Linux が備えるシステムの名前解決の機能を解説します。

上記で述べた、クライアントの hosts による名前解決の方法に該当するのですが、Linux で名前解決行う場合 /etx/hosts を設定します。

127.0.0.1       localhost
127.0.1.1       ***

# The following lines are desirable for IPv6 capable hosts
...

内容は大分省略しましたが、おおむね上記のようになっているかと思います。
書式は非常に簡単で、 "ip アドレス" "fqdn" というものになります。
例えば、 192.168.1.2my-server.jp という web サーバを建てたので、 Linux 上から http://my-server.jp という URL で 192.168.1.2 にアクセスしたいとき、
以下のような設定になります。

127.0.0.1       localhost
127.0.1.1       ***
192.168.1.2     my-server.jp

# The following lines are desirable for IPv6 capable hosts
...

設定後、再起動を行えば Linux 上から http://my-server.jp192.168.1.2 上の web サーバにアクセスできるようになります。
Linux 上から curl http://my-server.jp 等、試してみてください。

Linux が備えるシステムの名前解決の設定ができたので、それでは、実際に squid の設定を行いたいと思います。
以下の構成を構築します。

192.168.1.2my-server.jp という FQDN が設定してある web サーバが建っています。
192.168.1.3 に squid の proxy サーバがあり、クライアントは proxy サーバの設定をして、クライアントから my-server.jp で web サーバにアクセスできるようにします。

管理を楽にするため docker 上に導入します。

$ docker run -d --restart=always \
    --publish 3128:3128 \
    --name=myproxyserver \
    --volume $(pwd)/squid.conf:/etc/squid/squid.conf \
    --volume $(pwd)/cache:/var/spool/squid \
    --volume $(pwd)/hosts:/etc/myhosts \
    sameersbn/squid:3.5.27

上記のコマンドを実行するのですが、上記のコマンドでは host 側の ./hosts./squis.conf を container に mount しています。
まず、 squid.conf ですが gist に default の設定を貼ってくれている人がいるので、 それを参考に、 squid.conf は以下のようになります。

acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 21
acl Safe_ports port 443
acl Safe_ports port 70
acl Safe_ports port 210
acl Safe_ports port 1025-65535
acl Safe_ports port 280
acl Safe_ports port 488
acl Safe_ports port 591
acl Safe_ports port 777
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid3
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern . 0 20% 4320
hosts_file /etc/myhosts

ここで重要なのは、設定ファイルの一番下にある、 hosts_file /etc/myhosts です。
この設定を行うことで、 squid は /etc/myhosts に従って名前解決を行うことになります。

続いて、 ./hosts です。
host 側の ./hosts が container 上に /etc/myhosts として mount されるため、 host 側の ./hosts を以下のようにします。

my-server.jp 192.168.1.2

これらの設定ファイルが準備できましたら、上記の docker コマンドを実行してください。
proxy サーバが立ち上がります。

クライアント

続いてクライアントの設定を行います。

Windows

Windows のシステムに設定を行う場合、以下を参考に設定します。

Chrome

Chrome は基本的に、システムの設定を利用します。
ですが、 Chrome のみに設定したい、ということもよくあり、その場合はアドオンで行います。

Firefox

Firefox はシステムの proxy は参照せず、 Firefox 独自で proxy の設定を管理しています。

Android + Chrome

Android の場合、 Wifi の設定でシステムの proxy を設定します。

まとめ

名前解決についてと、その具体的な方法について説明しました。