概要
このページは「vpnとddnsを使用してリモートアクセス環境を構築」の一部です。
DNSサーバーの立ち上げを行います。
BINDのインストールと設定ファイル編集
参考ページ
RedHat Customer Portal 第18章 BIND (BERKELEY INTERNET NAME DOMAIN)
後述しますが、RedHat Customer Portalはサービス起動時にSElinuxが邪魔していたため、原因と対処法を確認する際に参考にしました。
[1]BINDのインストール
yumでインストール出来ます。
[root@host ~]# yum install bind [root@host ~]# yum install bind-utils
[2]Config編集
まずはnamed.confのコピーしてから編集
[root@host ~]# cp /etc/named.conf /etc/named.conf.old [root@host ~]# vim /etc/named.conf
↓named.confの内容(一部投稿用に変更しています。コピペ利用の場合は自分の環境に合わせてください)
// // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // acl "home" { 192.168.xyz.0/24; 10.8.0.0/24; /* ※1 */ }; options { listen-on port 53 { 127.0.0.1; 192.168.xyz.1; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; //Only LocalNet DNS allow-query { any; }; //allow-recursion { localhost; localnets; }; //allow-query-cache { localhost; localnets; }; //allow-transfer { none;}; forwarders{ 8.8.8.8; 8.8.4.4; }; /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. - If your recursive DNS server has a public IP address, you MUST enable access control to limit queries to your legitimate users. Failing to do so will cause your server to become part of large scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ recursion yes; dnssec-enable no; dnssec-validation no; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ include "/etc/crypto-policies/back-ends/bind.config"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; view "internal" { match-clients { localhost; home; }; zone "." IN { type hint; file "named.ca"; }; zone "home.local" { type master; file "home.local.zone"; }; zone "100.168.192.in-addr.arpa" { type master; file "xyz.168.192.in-addr.arpa.rev"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; };
-
- ※1 2022/7/3修正
VPN接続時に使用するIPアドレスを追加しました。
- ※1 2022/7/3修正
[2]ゾーンファイルの作成
新規にゾーンファイルを作成します。
[root@host ~]# vi /var/named/home.local.zone
ゾーンファイルはローカルネットワークの環境に合わせてIPアドレスとホスト名を紐づけます。
$TTL 86400 @ IN SOA host.home.local. root.home.local. ( 2020122500 ;Serial // serial 3600 ;Refresh // refresh 1hr 300 ;Retry // retry 5min 360000 ;Expire // expire 100hr 86400 ) ;Negative // min 24hr IN NS host.home.local. host IN A 192.168.100.1 host10 IN A 192.168.100.10 host20 IN A 192.168.100.20 host30 IN A 192.168.100.30
次に逆引き用ゾーンファイルを作成します。
[root@host ~]# vi /var/named/xyz.168.192.in-addr.arpa.rev
正引きに合わせて設定。
$TTL 3600 @ IN SOA host.home.local. root.home.local. ( 2020122501 ; serial 3600 ; refresh 1hr 900 ; retry 15min 604800 ; expire 1w 86400 ; min 24hr ) IN NS host.home.local. 1 IN PTR host.home.local. 10 IN PTR host10.home.local. 20 IN PTR host20.home.local. 30 IN PTR host30.home.local.
[3]設定ファイルのチェック
[root@host ~]# named-checkconf -z
設定ファイルに間違いが無ければエラーは出力されずログのみ出力されます。エラーが出た場合は内容を確認して修正します。
firewallの設定とSElinuxの確認
[1]firewallの設定
まずサービスを許可します。基本的にはローカルネットワーク内だけで良い気もしますが、一応パブリックも通せるようにしておきます。
[root@host ~]# firewall-cmd --add-service=dns zone=home --permanent [root@host ~]# firewall-cmd --add-service=dns zone=public --permanent [root@host ~]# firewall-cmd --reload
次にポートの許可を追加します。使用するポートは53/udpです。
[root@host ~]# firewall-cmd --add-port=53/udp --zone=home --permanent [root@host ~]# firewall-cmd --add-port=53/udp --zone=public --permanent [root@host ~]# firewall-cmd --reload
firewall設定は以上です。最後にまとめて設定結果を見たい場合は、次のコマンドで確認出来ます。
[root@host ~]# firewall-cmd --list-all-zones
[2]サービス起動でエラーが出ないか確認
[root@host ~]# systemctl start named.service
私の場合はここでエラーが出ました。エラーの指示に従いログを確認するとSElinuxが原因のようで。一旦、selinuxを停止して再度起動を試みると無事に起動しました。
[3]SElinuxの設定
SElinuxが原因で立ち上がらない場合の対処は、冒頭のRedHatのリンクにありました。原因はゾーンファイルにnamedのラベルがついていないから読み込めないようなものらしいです。ラベルはls -Zコマンドで確認出来ます。
[root@host ~]# ls -Z /var/named unconfined_u:object_r:named_zone_t:s0 xyz.168.192.in-addr.arpa.rev unconfined_u:object_r:named_zone_t:s0 home.local.zone
こんな感じでラベルが"named_zone_t"となっていれば問題ありません。違う場合は下記コマンドでラベルの再割り当てを行います。(推測ですがはじめにネームファイル作成の場所を間違えたために"mv"コマンドで移動しました。これが原因だったかな?)
[root@host ~]#restorecon -R /var/
以上で設定完了です。
名前解決が問題無く行われているか確認
[1]端末のDNSサーバ設定変更
ここからはDNSクライアント側の作業となります。サーバーのnamed.serviceが無事に起動したら、別端末のDNSサーバ設定を変更します。centOS7~8の場合は下記のような流れでデバイス名確認からDNSサーバの変更、ネットワークの再起動ができます。(rootログインせずに実行しています)
[user@host10 ~]$ nmcli d デバイス タイプ 状態 接続 enp*** ethernet 接続済み enp*** wlp*** wifi 切断済み -- lo loopback 管理無し -- [user@host10 ~]$ sudo nmcli connection modify enp*** ipv4.dns 192.168.xyz.1 [user@host10 ~]$ sudo nmcli connection down enp***; nmcli connection up enp***
ちなみにcentOS7で最後のネットワークの再起動を行うと通信が落ちてpingすら通らなくなりました。仕方ないので外部スイッチで強制終了、再起動すると無事に起動しssh通信も出来るようになりました。centOS8は大丈夫でしたが、下記コマンドによるネットワーク設定変更の方が良いかもしれません。
[user@host10 ~]$ sudo systemctl restart NetworkManager
[2]名前解決の確認
host10端末でhost20端末の名前解決を行った例です。無事にサーバーで設定した通りにIPが取得出来れば確認完了です。
[user@host10 ~]$ nslookup host20 Server: 192.168.xyz.1 Address: 192.168.xyz.1#53 Name: host20.home.local Address: 192.168.xyz.20
[3]Windows10で名前解決の確認
Windows10ですが、なぜかDNSサーバーを設定しても変更が反映されず。トラブルシューティングで一旦ネットワーク設定を全てリセットしてから再設定すると出来るようになりました。Windows10の場合はコマンドプロンプトで行いましたがローカルネットワーク内でもドメインが必要なようです。
C:\Users\user>nslookup host10 サーバー: host.home.local Address: 192.168.xyz.1 *** host.home.local が host10 を見つけられません: Non-existent domain C:\Users\user>nslookup host10.home.local サーバー: host.home.local Address: 192.168.xyz.1 名前: host10.home.local Address: 192.168.xyz.10
openVPNの設定ファイルにDNSサーバー設定を追加
再度、openVPNの設定ファイルを開いて、DNS設定を追加します。
[root@host ~]# vim /etc/named.conf
コメントアウトを消して、サーバーIPに書き換えます。
# tunモードを指定 52 ;dev tap 53 dev tun # 認証局、証明書、キーファイルを指定 78 ca ca.crt 79 cert issued/server1.crt 80 key private/server1.key # This file should be kept secret # dhファイルを指定 85 dh dh.pem # VPN内で使用するサブネットを指定 101 server 10.8.0.0 255.255.255.0 # サーバー側のロカールネットワークを指定 142 push "route 192.168.xyz.0 255.255.255.0" # DNS設定を追加 201 push "dhcp-option DNS 192.168.xyz.1" # tls鍵を指定 245 tls-auth ta.key 0 # This file is secret # 圧縮を有効 264 comp-lzo # presistオプション有効 282 persist-key 283 persist-tun # logの保管場所を変更 288 status /var/log/openvpn-status.log # logの保管場所を指定 297 log /var/log/openvpn.log 298 log-append /var/log/openvpn.log # ログレベル0~9、数字が大きい方が細かく残す 307 verb 3
サービスの再起動を行います。
[root@host ~]# systemctl restart openvpn-server@server
これでVPNに接続された状態でローカルネットワークの名前解決が行われるはず・・・と思いましたが、リモートデスクトップをホスト名で繋ごうとしても何故か上手く動いてくれません。でもIPアドレス直打ちでもそれほど不便ではないので、原因が分かったら追記します。
2022/7/3追記
VPN接続状態で名前解決が出来なかった原因は、前述のDNS設定時に"home"ネットワークにVPNで使用するIPアドレスを定義していないことが原因でした。