2023年 04月 19日
はじめての Linux で DNS/DHCP, openSUSE Leap 15(簡単入門)
DNS はインターネットに繋がる Google や Apple のネットワークの住所を記憶しておくだけではなく、LAN 内部にある NAS などのファイルサーバー、社内データベースなどの在り処を記述するためにも、LAN 内部にも DNS サーバが必要な場合があります。この機能は、一般的に市販されている WI-FI ルータでは機能できません。高機能なルータを覗いて、ほとんどの市販ルータにはインターネットの情報を記憶する DNS/DHCP の機能はあっても、構内 LAN の情報をカスタマイズして管理する機能がありません。一般的な家庭用、 SOHO 向けのルータには DNS/DHCP の機能は付いていますが、最低限の機能しか実装されていません。ネットワークの全てのデバイスがインターネットに接続することが目的ならばそれでも構いませんが、プライベートネットワークにはプリンタ、NASなどの機器があり、これらを共有するためには、それぞれの機器の IP アドレスを知っていなければなりません。プリンタが増えたり、NAS を更新したり、ファイルサーバの機能が変わったりする都度、全ての設定を変更するのは面倒です。真っ先に、構内ネットワーク (LAN) を構築する場合に必要になるのが DNS/DHCP です。ここでは、初めて Linux で DNS/DHCP を立ち上げる場合、どんな作業が必要なのかを openSUSE Leap 15 を使った場合の流れを説明します。
ディスク: openSUSE Leap 15 は、ファイルシステムに BtrFS を利用するため 30 Gb 以上のディスクスペースが必要ですメモリ:1Gb 程度のメモリ、より少なくても動きますが、諸般の事情でこれくらい用意すれば十分でしょう
ここでは具体的なインストール手順は説明しません。別記事に Leap 15.4 のインストール方法をまとめていますので、そちらを御覧ください。
openSUSE Leap 15.4 インストールとファーストインプレッション
動画
ダウンロード:2023/4 現在 Leap15.5 Beta がリリースされています。
openSUSE Leap のインストールのポイントとしては
・ネットワークの設定方法は Wicked を選んで固定 IP を設定します・/var に設定ファイルが作られるため、必須ではないけれど /var は別なパーティションにすると良い・root と初回登録するユーザはパスワードを共有させない
といった所です。
なお、上の記事や動画は英語でインストールしていますが、日本語でインストールしても構いません。ただしデスクトップでは日本語必須ですが、サーバの場合、日本語のメッセージだと問題解決の事例が見つからない事が多いので英語にしています。好みの問題ですね。
openSUSE Leap をはじめ、SUSE Linux Enterprise など SUSE 系のパッケージのインストールなどのシステム管理は YaST (Yet another Setup Tool) に統合されています。まず SUSE 系のシステム管理の 90 % 以上は、この YaST を通じて行います。YaST は必要な文法やパラメータの記述内容を一応チェックしてくれるため、他のディストリビューションの様に vi で編集して、綴り間違えや文法(コロンなのかセミコロンなのかの様な軽微な間違え)に初心者が悩まされることがないので、基本的に YaST を使え、が openSUSE/SLE の設定の基本です。
openSUSE Leap のバージョンやインストールの手順の違いにも依りますが、Activities に YaST アイコンがインストールされていません。root でログインしたら、初回は Activities > Utilities > Terminal (テキスト端末)を開くか、 su で root ログインして
# yast2 &
を実行します。YaST GUI が起動したら、Activities の中のツールバーに YsST アイコンを Add to Favolites すると、アイコンが登録されます。
YaST2 > System > Network Settings
General Network Settings : Wicked Service である事(トグルボタンで設定します)
Overview : 固定 IP を設定Hostname/DNS : ホスト名、上位 DNS サーバを設定Routing : デフォルトゲートウェイを設定
YaST で設定された DNS サーバの情報は /etc/resolv.conf に記述されます。
Software > Software ManagementView > Pattern より DNS and DHCP Servers をチェックしてインストールします。ここで、YaST2 の DNS と DHCP の拡張機能が追加されます。
一旦 YaST をリフレッシュするため、YaST2 を終了してもう一度立ち上げ直します。DNS と DHCP サーバのアイコンが追加されます。
YaST2 > Network Services > DNS Serverもしインストールされていない場合、 bind パッケージが自動的にインストールされます。
Forword の設定 > ここに自分自身のアドレスをAdd 設定します
> Next
この DNS サーバが管理するゾーンを Add ボタンで追加
※ この内容は /var/lib/named/master/"zone名" ファイルに設定されます
Edit ボタンで、ゾーン情報を編集します
※ ゾーンは、この DNS が責任をもって管理するネットワークの事です。ここでは単にドメインと考えてみてもいいでしょう。local.mycompany.com は、mycompany.com のサブドメインですね。www.mycompany.com などはより上位の DNS サーバが責任を持って管理し、NAS や Printer などは、ローカルネットワークの中だけ有効で、LAN 管理者が責任を持って管理します。一般的には local.mycompany.com の様に、唯一のユニークな名前を使うのが良いでしょう。社内向けに適当に分かりやすい名前を付けても構いませんが、例えば、 private.mycompany.intra の様に、右端のトップレベルドメイン gTLD に、com とか jp などとは違う、架空で、あり得ない名前 gTLD(オレオレドメイン)を付けても良いのですが、もし本当に mycompany.intra などがあると問題が起こります。この辺の話は別な記事でまとめました。
コンピュータ名(ホスト)の命名規則? 15文字の63バイト制限、ホスト名の命名権利はだれの権利?責任?(パソコン名)オレオレドメインがもたらす当たり前な問題新gTLD大量出現で「名前衝突」しそうなドメイン名とは
よく古い DNS や Microsoft AD のマニュアル本にあるような .local というドメイン名は mDNS という機能で使われるため、使ってはいけません。iPhone や mac のみならず、様々なデバイスで問題がでる可能性があります。
ここにこのゾーンを管理するこの DNS サーバの自分自身の FQDN を追加、localhost は削除
MX レコードの指定、メールサーバーは使わないのでここでは空欄
レコードキー Type を追加します。
A レコード: ホスト名と IPv4 アドレスを関係づけるレコードです。Hostname Key に対して ipv4 アドレスのValue を設定します。
CNAME レコード : A レコードの別名です。下の例では samba サーバに NTP サーバの機能を割り当てています。
MX レコード : このゾーンで使うメールサーバの記述です。ここでは使っていません。NS レコード : このゾーン情報の責任を持つDNS サーバを記述します。つまりこのサーバ。
SOA は管理情報。ここに記述されるのは、このゾーンの管理に必要な更新期間であるとか、シリアル番号などです。 openSUSE Leap/SLE では、YaST によりシリアル番号は自動的に"今日の日付+xx" がインクリメントして付け加えられます。この情報は、セカンダリ DNS に対して有効に機能します。
ゾーンファイルはこの様に /var/lib/named/master ディレクトリに作成されます。
localhost:/var/lib/named/master # cat ./local.mycompany.com
$TTL 2d
@IN SOAlocalhost.root.localhost. (
2023041604; serial
3h; refresh
1h; retry
1w; expiry
1d ); minimum
local.mycompany.com.IN NSdns01.local.mycompany.com.
router IN A192.168.1.1
samba IN A192.168.1.240
nas01 IN A192.168.1.237
ntp01I N CNAMEsamba
printer IN A192.168.1.7
dns01 IN A192.168.1.101
localhost:/var/lib/named/master #
このゾーンファイルは、DNS に関して不慣れな人にはかなり厳しいものがあります。 SUSE の YaST では、文法を知らなくても何とかなってしまいます。DNS の教科書を読んで、「大体分かるんだけど....」 いつも挫折するのはこのゾーンファイルの編集です。
ファイアウォールのポートを解放して、設定変更後に restart 、起動時の Start on boot する様に設定を変更します。
openSUSE Leap 15/SLE では、YaST で編集が終わると自動的に named サービスがリスタートされます。システム起動と同時に起動する設定も YaST の中で完結します。コマンドで行うには、テキストターミナルを開いて次のコマンドを実行します。
# systemctl enable named# systemctl start named
稼働状態は YaST > System > Service Manager で確認することが出来ます。Stop/Start した時にエラーがないことを、Show Log ボタンで確認します。
手動でコマンドラインで確認するには systemctl コマンドを使います。
localhost:~ # systemctl restart named
localhost:~ # systemctl status named
\u25cf named.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2023-04-16 16:36:40 JST; 9s ago
Process: 8858 ExecStartPre=/usr/lib/bind/named.prep (code=exited, status=0/SUCCESS)
Process: 8864 ExecStart=/usr/sbin/named -u named $NAMED_ARGS (code=exited, status=0/SUCCESS)
Main PID: 8865 (named)
Tasks: 10 (limit: 4669)
CGroup: /system.slice/named.service
\u2514\u2500 8865 /usr/sbin/named -u named
Apr 16 16:36:40 localhost named[8865]: network unreachable resolving './NS/IN': 2001:500:1::53#53
Apr 16 16:36:40 localhost named[8865]: network unreachable resolving './NS/IN': 2001:503:ba3e::2:30#53
Apr 16 16:36:40 localhost named[8865]: network unreachable resolving './NS/IN': 2001:7fd::1#53
Apr 16 16:36:40 localhost named[8865]: network unreachable resolving './NS/IN': 2001:500:2d::d#53
Apr 16 16:36:40 localhost named[8865]: network unreachable resolving './NS/IN': 2001:dc3::35#53
Apr 16 16:36:40 localhost named[8865]: network unreachable resolving './NS/IN': 2001:503:c27::2:30#53
Apr 16 16:36:40 localhost named[8865]: network unreachable resolving './NS/IN': 2001:500:2f::f#53
Apr 16 16:36:40 localhost named[8865]: network unreachable resolving './NS/IN': 2001:7fe::53#53
Apr 16 16:36:40 localhost named[8865]: managed-keys-zone: Key 20326 for zone . is now trusted (acceptance timer co>
Apr 16 16:36:40 localhost named[8865]: resolver priming query complete
localhost:~ #
外部のインターネットサイトに ping して応答を調べます。内部の local ネットワークのホストに ping して応答を調べます。
localhost:~ # ping dns01.local.mycompany.com
PING dns01.local.mycompany.com (192.168.1.101) 56(84) bytes of data.
64 bytes from 192.168.1.101 (192.168.1.101): icmp_seq=1 ttl=64 time=0.135 mslocalhost:~ # ping google.com
PING google.com (142.250.198.14) 56(84) bytes of data.
64 bytes from nrt12s58-in-f14.1e100.net (142.250.198.14): icmp_seq=1 ttl=111 time=31.6 ms
64 bytes from nrt12s58-in-f14.1e100.net (142.250.198.14): icmp_seq=2 ttl=111 time=25.9 ms
実際にDNS が機能して、ホスト名を保持しているかは dig コマンドで調べます。
# dig @DNS-SERVER hostname.FQDN
例 ) dig @localhost printer.local.mycompany.comAnswer Section の部分のホスト名が ; (セミコロン)でコメントアウトされていないかlocalhost:~ # dig @localhost samba.local.mycompany.com; <<>> DiG 9.16.38 <<>> @localhost samba.local.mycompany.com; (2 servers found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2522;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 1232; COOKIE: 25d1d2efb8ba118401000000643ba548c9fe1e388918c75a (good);; QUESTION SECTION:;samba.local.mycompany.com.INA;; ANSWER SECTION:samba.local.mycompany.com. 172800 INA192.168.1.240;; Query time: 0 msec;; SERVER: ::1#53(::1);; WHEN: Sun Apr 16 16:35:36 JST 2023;; MSG SIZE rcvd: 98localhost:~ #
DNS キャッシュをダンプし、/var/log/named/dump.db に書き出された dns キャッシュの中に、ホスト名や外部のインターネットホストが記録されているかを確認します。
localhost:~ # rndc dumpdb
localhost:~ # ls /var/log/named/dump.db
/var/log/named/dump.db
localhost:~ # grep google /var/log/named/dump.db
google.com.172514NSns2.google.com.
172514NSns1.google.com.
172514NSns3.google.com.
172514NSns4.google.com.
ns1.google.com.172514A216.239.32.10
ns2.google.com.172514A216.239.34.10
ns3.google.com.172514A216.239.36.10
ns4.google.com.172514A216.239.38.10
localhost:~ #
YaST2 > Network Services > DHCP サーバをクリックして、ウィザードに従ってインストールします。
ネットワークインターフェースを選んで、ファイアウォールを開くをチェックして Next
DHCP から配布する、LAN 内で使う DNS サーバ、デフォルトゲートウェイ、NTP サーバなどの値をセットします。
リースする IP アドレス範囲です。DHCP サーバはこの範囲で要求があったデバイスに IP アドレスを配布します。
DHCP サーバがブート時に起動する様、また変更があった時に自動的に再起動するように設定します。
考えてみてください。こんな面倒なフォーマットを誤りなく手書きできますか? YaST はやっぱり便利です。
localhost:/etc # cat dhcpd.conf
option domain-name "local.mycompany.com";
option domain-name-servers 192.168.1.101, 192.168.1.1;
option routers 192.168.1.1;
ddns-update-style none;
default-lease-time 14400;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.110 192.168.1.199;
default-lease-time 14400;
max-lease-time 172800;
}
localhost:/etc #
さて、それでは DHCP サーバが動くかどうかの確認をしましょう。まず、今まで使っていた 無線ルータなどの DHCP の機能を OFF にしてから、 DHCP が機能しているかどうか、確認しましょう。Windows 端末の場合、 ipconfig コマンドで、IP の再取得をして、 DHCP が機能しているかどうか確認します。
C> ipconfig /renewC:> ipconfig /all
デバイスのリースの情報は /var/lib/dhcp//db/dhcp.leases ファイルで確認できます。
dns2:/var/lib/dhcp/db # cat dhcpd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.3.6-P1
# authoring-byte-order entry is generated, DO NOT DELETE
authoring-byte-order little-endian;
lease 192.168.1.39 {
starts 3 2023/04/12 16:16:31;
ends 3 2023/04/12 16:18:31;
cltt 3 2023/04/12 16:16:31;
binding state free;
hardware ethernet f9:af:77:26:66:38;
uid "\001\371\257w&f8";
}
予め、ネットワークカードの mac アドレスが分かっている場合、 mac アドレス(特定のデバイス)に指定した IP アドレスを割り当てる事ができます。これと未知のデバイスには IP を割り当てない設定を併用すれば、簡単なセキュリティ対策になります。
他のディストリビューションでは、直接 /etc/dhcpd.conf を書き換えなければならないので大変です。
localhost:/etc # cat dhcpd.conf
option domain-name "local.mycompany.com";
option domain-name-servers 192.168.1.101, 192.168.1.1;
option routers 192.168.1.1;
ddns-update-style none;
default-lease-time 14400;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.110 192.168.1.199;
default-lease-time 14400;
max-lease-time 172800;
host mackbook001 {
fixed-address 192.168.1.112;
hardware ethernet 28:68:0c:81:f3:89;
}
}
localhost:/etc #
DHCP で未知のデバイスに IP を割り当てたくない場合、/etc/dhcpd/dhcpd.conf に許可/拒否の設定を記述します。未知のデバイスに DHCP が割り当てないだけで、デバイスを使う人が自分でで固定 IP を振れば通信はできるてしまいますが。簡単に、勝手に機器を持ち込んで使わせたくない場合などでは便利です。
# 許可するMACアドレスのリストallow known-clients;# 未知のMACアドレスのリースを拒否するdeny unknown-clients;
YaST2 DHCP Server の Global Options の中に、追加の記述を設定します。
この情報は dhcpd.conf に記述されます。
localhost:/etc # cat dhcpd.conf
option domain-name "local.mycompany.com";
option domain-name-servers 192.168.1.101, 192.168.1.1;
option routers 192.168.1.1;
ddns-update-style none;
default-lease-time 14400;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.110 192.168.1.199;
default-lease-time 14400;
max-lease-time 172800;
deny unknown-clients;;
host mackbook001 {
fixed-address 192.168.1.112;
hardware ethernet 28:68:0c:81:f3:89;
}
}
host {
deny unknown-clients;
}
localhost:/etc #
まとめ
ここでは初めて Linux で社内向け DNS/DHCP サーバを立ち上げる場合、openSUSE Leap15 を使った場合、どんな手順なのかをまとめました。初めて DNS/DHCP をセットアップしようとすると、どうしても「DNSって難しそう」と思ってしまいます。openSUSE Leap/SUSE Linux Enterprise の場合、YaST という GUI ツールがあるので、面倒なゾーンファイルの編集から、 DNS の再起動までほとんどの操作が GUI 上でできてしまうことを理解していただけたでしょうか。私も、DNS についてはあまり詳しくないのがバレそうですが、SUSE Linux なら何とかなります。やっぱりゾーンファイルの編集などを手動でやっていると、文法違いや、簡単な綴りミスなどでハマってしまいます。もしこの記事が役に立って「やってみようか」と思っていただけると幸いです。