普段プライベートIP指定で、接続している仮想環境のLinuxマシンに、hostsファイルを活用して名前解決を行い、会社内LAN環境に近づけて、ホスト名(マシン名)指定で接続できるようにしました。
仮想環境と普段の接続について
自宅では、メイン機がWindows10Proマシンなので、付属のHyper-Vの機能を有効化して、仮想環境を作っています。仮想マシンは、CentOS6.5を入れて外部との通信用に、固定のプライベートIPを振り、SSHポートを開いています。ホストマシンからは、このプライベートIPを指定して、Teratermでやり取りしています(図1)。
仮想マシンへ接続後、上記事項について確認したTeratermの通信例
$ cat /etc/redhat-release
CentOS release 6.5 (Final)
$ hostname
serv01
$ ifconfig eth0 | grep "inet addr:"
inet addr:192.168.1.32 Bcast:192.168.1.255 Mask:255.255.255.0
$ grep "# The Secure Shell (SSH)" /etc/services
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol
$
今回は、現状プライベートIPを直接指定して、接続している自宅の仮想マシンについても、名前解決を行い、会社内LAN環境のようにホスト名指定で、接続できるよう調整しました。因みに現状のまま、仮想マシンのホスト名を指定すると、pingも通りません(図2)。当たり前ですが。。。
Linux仮想マシンの名前解決関連について下調べ
仮想マシンのホスト名設定と名前解決に関連する設定ファイルから、以下情報を収集しました。
ホスト名確認コマンド(hostname)
「hostname」コマンドにて、Linux仮想マシンの現在のホスト名(serv01)を取得しました。
$ hostname
serv01
ホスト名の設定確認(/etc/sysconfig/network)
Linuxでは「ネットワーク設定ファイル」で、ホスト名設定を確認・変更するようです。RedHat系は、設定ファイルに「/etc/sysconfig/network」を使用し、Debian系は「/etc/network/interfaces」を使用するとの事。以下、実際に見てみると、RedHat系のCentOSでは「/etc/sysconfig/network」のみ読み取れて、ホスト名設定(HOSTNAME=serv01)が確認できました。
HOSTNAME=serv01
$ cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=serv01
$ cat etc/network/interfaces
cat: etc/network/interfaces: そのようなファイルやディレクトリはありません
$
ホスト名とIPアドレス対応表の確認(/etc/hosts)
「/etc/hosts」ファイルは、ホスト名とIPアドレス対応表の設定を行います。仮想マシンのホスト名設定は、以下の通り、Webサーバへの接続テスト等に使う「localhost」と同様に、ループバックアドレスが割り振られていました。
$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 serv01
$
DNSサーバ、ドメイン名の設定確認(/etc/resolv.conf)
DNSサーバやドメイン名の設定の設定は「/etc/hosts」ファイルが担当の様です。設定内容を見てみると以下の通りでした。「nameserver」は、DNSサーバのIPアドレスを指定するらしく、光モデムのプライベートIPが指定されてました。個人環境なので、光モデム経由のプロバイダ任せです、プライベートIPに紐付くホスト名解決には使えません。。
$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.1
$
名前解決の問合わせ順設定(/etc/nsswitch.conf)
ホスト名の名前解決の問い合わせ順序については「/etc/nsswitch.conf 」ファイルで定義するそうです。以下に仮想マシンの設定を見てみました(内容が長かったので「hosts:」で絞ってます)。
$ grep hosts: /etc/nsswitch.conf
#hosts: db files nisplus nis dns
hosts: files dns
$
以上仮想マシンでは、ホスト名の名前解決の問い合わせ順序は、まずfiles(「/etc/hosts」ファイル)を使用して、その次にdns(DNSサーバ問い合わせ)を使うように定義されていました。
Windowsマシン(ホスト機)の名前解決関連について下調べ
Windowsマシン(ホスト機)のホスト名設定と名前解決に関連する設定ファイルから、以下情報を収集しました。
ホスト名確認コマンド(hostname)
ホスト名は、Dosでも「hostname」コマンドで取れるようです。ついでにWindowsマシンのホスト名(F575SN2-SH2)を取得してみました(図3)。まあ、使う機会はなさそうですが。。
PCのプライベートIPは、光モデムのDHCP機能に頼って振ってもらっていますが、一応見ました(図4)
Microsoft TCP/IP のホスト名解決順序
Microsoftの公式ページによると、Windowsマシンのホスト名の名前解決の問い合わせ順序は、以下がデフォルトの様です。Windowsマシンは、名前解決を試みる際、以下順序に従い、正常に名前解決した時点で、検索を停止します。
- ローカルのhostsファイル(Windows NT系:%Systemroot%\System32\Drivers\etc\hosts)を検索
- ドメインネームシステム(DNS)サーバーへの問い合わせ
- NetBIOS名解決の順序をバックアップとして使用し、名前解決を試行
ホスト名とIPアドレス対応表の確認(%Systemroot%\System32\Drivers\etc\hosts)
Windowsマシンのhostsファイルを以下の通り確認しました(図5)。
- タスクバー検索欄に「%Systemroot%\System32\Drivers\etc\hosts」と入力(図5左)
- タスクバーメニューが表示されたら「開く」を選択(図5左)
- 「このファイルを開く方法を~」画面が出たら、サクラエディタを選択してOK押下(図5右)
Windowsマシンの「hosts」ファイルは「localhost」の設定例が、コメントアウトされていた他は、ファイルについての説明文で、有効な設定は在りませんでした(図6)。
hostsファイルを活用した仮想マシンの名前解決
下調べより、取り合えず「hosts」ファイルに、ホスト名とIPアドレス対応表を設定して、名前解決を行い、ホスト名(マシン名)指定での接続を実現するのが、手っ取り早いようです。
Windowsマシンの「hosts」ファイルにユーザ変更権限を付与する
「hosts」ファイルには、一般ユーザに変更権限が付与されていない為、一時的に変更を許可しました。
「%Systemroot%\System32\Drivers\etc」を開き「hosts」ファイルを右クリックし、プロパティを開きます(図6)。
hostsのプロパティ画面が開いてからの操作を以降にまとめました(図7)。
- hostsのプロパティ画面のセキュリティタブを開き「編集」を押下(図7左)
- hostsのアクセス許可画面が開いたら、Usersを選択する(図7中央)
- アクセス許可の「変更」項目の「許可」にチェックを入れ「適用」を押下(図7中央)
- 連動して書込み許可もチェックされるのを確認(図7中央)
- hostsのプロパティ画面に戻り、Usersの編集内容が、反映された事を確認(図7右)
hostsのプロパティ編集中に、図8のアラートが表示されるが「はい」を押下し操作を続行する。
Windowsマシンの「hosts」ファイルに仮想マシンのホスト名を登録
ここまでの操作より「hosts」ファイルの編集が、可能になっているので、仮想マシンのホスト名とIPアドレス対応表を、追記しました(図9赤枠)
動作確認
まずはコマンドプロンプトから、仮想マシンのホスト名を指定してpingを打ち、今度は通ることを確認しました(図10赤枠)。
次にTeratermを起動し、固定IPの代わりにホスト名を指定して、仮想マシンに問題なく接続できることを確認しました(図11)。
仮想マシンの「/etc/hosts」ファイルにWindowsマシンのホスト名を登録
サーバから1クライアントをターゲットに接続する機会はほぼないと思われます。が、一応「/etc/hosts」ファイルにも、Windowsマシンのホスト名設定をしてみました。以下の通り、現状では、ホスト名でWindowsマシンを、認識できません。
$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.32 serv01
$ ping -c 4 F575SN2-SH2
ping: unknown host F575SN2-SH2
$
Linuxでも「/etc/hosts」ファイルに編集制限がありますが、普通にrootで入りなおせば、viで編集できました。以下のように、元々あった設定は触らずに、Windowsマシン(ホスト機)向けの、ホスト名(F575SN2-SH2)設定を追記しました。
$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 serv01
192.168.1.10 F575SN2-SH2
$
動作確認
「/etc/hosts」ファイル編集後、続けて「ping」を打ってみたら、普通に通りました。
$ ping -c 4 F575SN2-SH2
PING F575SN2-SH2 (192.168.1.10) 56(84) bytes of data.
64 bytes from F575SN2-SH2 (192.168.1.10): icmp_seq=1 ttl=128 time=0.401 ms
64 bytes from F575SN2-SH2 (192.168.1.10): icmp_seq=2 ttl=128 time=0.520 ms
64 bytes from F575SN2-SH2 (192.168.1.10): icmp_seq=3 ttl=128 time=1.11 ms
64 bytes from F575SN2-SH2 (192.168.1.10): icmp_seq=4 ttl=128 time=1.07 ms
--- F575SN2-SH2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 0.401/0.777/1.116/0.322 ms
$
まとめ
以上の通り設定は、Windows/Linux問わず、自端末のホスト名とIPアドレス対応表設定のみに従って、名前解決を行い、他端末の「hosts」設定を考慮しません。なので、1、2台の端末構成で名前解決したい状況では、「hosts」ファイルの活用が手っ取り早くて簡便な手段だと思われます。
但し、名前解決に「hosts」ファイルを使う場合、傘下に入る全端末の「hosts」ファイル設定が、揃ってなければ、ホスト名とIPアドレスの紐付けの一部に、矛盾がでると思われます。
各端末で勝手な「ホスト名とIPアドレス対応表」を設定しても、ネットワーク上の各自の接続作業は、特に問題ないと思われます。しかし、実務で他者と連携する時に、ホスト名と紐づく実機の認識に食い違いが出たり、実機に二重三重のホスト名が充てられて、混乱する事態が予想されます。
参考文献
- 「WEB ARCH LABO」”CentOS 6 でホスト名を確認・変更する手順” 2021年5月28日閲覧
- 「LinuC イージス」”Linux – DNS for Client” 2021年5月28日閲覧
- 「LinuC LPI-Japan」”Linux豆知識 206 ネットワーク設定ファイル” 2021年5月28日閲覧
- 「日常スコープ」”hostsファイルは上書きできない?上書き禁止のhostsファイルの更新方法と書き方【サンプル有】” 2021年5月28日閲覧
- Microsoft.com「Windows サポート」”Microsoft TCP/IP のホスト名解決の順序” 2021年5月28日閲覧
コメント