カメリアの記事

意味があることやないことを綴ります

CentOS 7 2009 のセットアップ(ネームサーバへの道)

これは僕が七転八倒した記録だが、終わりに簡潔なコマンド履歴と編集したファイルを付記しておくので文章は読み飛ばして参考にしてもらって構わない。

今回 CentOS 7 2009 をインストールしたのはノートパソコン ThinkPad T400 だ。 2008 年の発売なので 15 年前の品となる。 CPU は換装したはずだけど元々は Core 2 Duo P8600 が載っていた。 Core の第 2 世代だ。今も似たようなものだろう。最新の CentOS Stream 8 や 9 ではサポートされておらずインストールするとカーネルパニックを起こす。ありがたいことに 7 2009 というバージョンが 2024 年の 6 月末までサポートされているらしい。まぁ今回の用途は自宅内のサーバなのでサポートしてくれなくてもいいんだけど。ただまぁインストールデータをダウンロードできるのがいいところだろうか。

さて、上述のノートパソコンなんだけど、内蔵ストレージにアクセスすることができなくなっていてごみ同然だった。でも USB メモリから起動することができるようなので、持て余していた 64GB の USB メモリをストレージとしてインストールすることにした。で、インストールは問題なく終了した。

それからモニタの 10 分の 9 くらいが壊れて見えづらくなっていて、表示される文字の判読が難しい。このままでは使いづらい。そうでなくてもサーバは部屋の隅のほうに置いておいて SSH で操作するのがいいだろう。いろいろ設定しないといけないかと思って心配だったけど標準状態で SSH ログインできた。 root で。

このままだとふたを閉めたときスリープしてしまうから「 (CentOS7)自動スリープの無効化」を参考にして /etc/systemd/logind.conf に HandleLidSwitch=ignore を追加。その後 systemctl restart systemd-logind として設定終了。眠らなくなった。

タイトルにあるとおりネームサーバにしたいということで yum install bind とする。以前稼働していたネームサーバの設定ファイルが手元のパソコンに保管されているので、こいつを使えるように Samba もインストール。 yum install samba とする。 SELinux の設定をしないといけないかな、というのがまた心配事だ。前にもやったけど覚えてないからまたググって調べないといけない。でもそのまま使えるかもしれないから、そのままでチャレンジしてみる。

/etc/samba/smb.conf には適当にしたみたいなことを追加した。

[var]
        comment = common storage
        path = /var
        valid users = all
        browseable = yes
        read only = no

systemctl enable smb としてサービスに登録。それから systemctl start smb で起動する。 Windowsエクスプローラーに IP アドレスを入力してアクセスしてみるけど反応がない。そうだ、ポートを開けなきゃ。ということで「 CentOS7 のsamba設定メモ」を参考にして firewall-cmd --permanent --zone=public --add-service=samba の後 firewall-cmd --reload として再度アクセスしてみると認証を求められた。ああ、やっぱり Samba ユーザを登録しないといけないのか。 valid users = all だってさ、笑っちゃうよね。

上述と同じページを参考にして pdbedit -a camellia として求められるままパスワードを設定。すると Failed to add entry for user camellia. とのこと。 Linux のユーザとして camellia が存在していないことが原因なのかな。ええい面倒な。 useradd camellia -G wheel としてから passwd camellia でパスワードを設定。そして再び pdbedit -a camellia として Samba ユーザの追加に成功。 /etc/samba/smb.conf で valid users = camellia と書き直し、 systemctl reload smb としていよいよ Windows から再度のアクセス。認証を要求されてユーザ camellia で通った。

さて、 /var/named を書き換えようと思ったら、ない。見当たらない。 named を起動したりしないと生成されないんだろうか。やってみよう。 systemctl enable named としてから systemctl start named 。コマンドは通った。でも /var/named は現れない。ははぁ、 chroot がどうとかそんな話があったな。すると named ディレクトリは /etc にでもあるんだろうか。見てみよう。

  • named
  • named.conf
  • named.iscdlv.key
  • named.rfc1912.zones
  • named.root.key

があった。なんか思い出してきたぞ。 named.conf で zone ファイルだかなんだかを include するんだ。手持ちの設定ファイルと比べてみようか。それで options ディレクティブの中に下の 2 行を追加した。問い合わせ内容を知らない場合は Google Public DNS を参照してね、っていう意味のつもり。

forwarders { 2001:4860:4860::8888; 2001:4860:4860::8844; 8.8.8.8; 8.8.4.4; };
forward only;

後、ファイルの最後に include "/var/named/named.c.zone"; というのを追加した。

それで /var に手持ちの設定ファイルとかを /var/named として追加、しようとしたら作成する権限が不足しているらしい。そこで chown :wheel /var としてから chmod g+w /var として再挑戦、でやっぱりダメ。 Samba の設定だろうか。 /etc/samba/smb.conf に writable = yes を追加して systemctl reload smb とする。でもダメ。 SELinux かな? setenforce 0 でチャレンジ。今回はフォルダ作成ができるみたいだ。後で SELinux のコンテキストを編集しないと。でも named っていうフォルダが存在していると言われた。見えないのに。 CentOS 側から見にいってみるか。あった。アクセス権を見たら drwxrwx--T となっている。謎の大文字 T 。こんなの知らない。まぁいいや、所有者は root:named となっているから usermod -aG named camellia として named グループになったら見えるようになった。やったね。

じゃぁ named の中に入って、と思ったら入れない。管理者に相談するように言われてしまった。馬鹿め、管理者は僕だ。 usermod -aG root camellia だ。でもアクセスできない。じゃぁ chmod 775 /var/named 。これで Windows からも入れるようになった。逆に named がアクセスできなくなったりしそうで怖いけどもう遅い。

さて、 named に入れたけどファイルを Windows 側から送れない。まだ抵抗するのか。何が不足なんだ。なりふり構わず chmode 777 /var/named で解決。もうなんだっていいんだよ。

ということでファイルを 3 つコピーした。内容を記事の途中で書くと邪魔っぽいので記事の最後に書いておく。

それからポートを開けるために firewall-cmd --permanent --add-service=dns として firewall-cmd --reload する。さて、上手く設定できているだろうか。 systemctl restart named とするとエラーを吐いて起動しない。 named.conf の内容が気に入らないらしい。エラーログを読んで named.conf の zone "." IN { で始まる 4 行と include "/etc/named.rfc1912.zones"; の 1 行を // でコメントアウト。それで named は起動した。

WindowsDNS の設定を変更して自宅内の機器に ping してみる。名前解決ができない。どうなってる。よく分からないけど /etc/named.conf を編集だ。 listen-on port 53 { 192.168.100.0/24; }; にして、 listen-on-v6 port 53 { fe80::/64; }; にして、 allow-query { 192.168.100.0/24; fe80::/64; }; と allow-transfer { 192.168.100.0/24; fe80::/64; }; を追加。このファイルも記事の終わりに掲載しておく。

これでも名前解決できずに困り果てていたけど、 WindowsDNS サーバアドレスを間違えていたことが判明。そこを修正することで ping が通った。大成功! やったね!

ちなみに SELinux には寛容( permissive )の設定をしてごまかした。ということでここまでのコマンドの履歴も記載しておく。

コマンド履歴

systemctl restart systemd-logind
yum install bind
yum install samba
vi /etc/samba/smb.conf
[var]
        comment = common storage
        path = /var
        valid users = camellia
        browseable = yes
        read only = no
:wq
systemctl enable smb
systemctl start smb
firewall-cmd --permanent --zone=public --add-service=samba
firewall-cmd --reload
useradd camellia -G wheel
passwd camellia
pdbedit -a camellia
systemctl reload smb
systemctl enable named
systemctl start named
vi /etc/named.conf
forwarders { 2001:4860:4860::8888; 2001:4860:4860::8844; 8.8.8.8; 8.8.4.4; };
forward only;
include "/var/named/named.c.zone";
:wq
chmode 777 /var/named
mv /var/named.c.zone /var/named/
mv /var/c.zone /var/named/
mv /var/c.rev.zone /var/named/
firewall-cmd --permanent --add-service=dns
firewall-cmd --reload
systemctl restart named
vi /etc/selinux/config
SELINUX=permissive
:wq
reboot

/etc/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.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html

options {
        listen-on port 53 { 192.168.100.0/24; }; <= 変更
        listen-on-v6 port 53 { fe80::/64; }; <= 変更
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/namedmemstats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { 192.168.100.0/24; fe80::/64; }; <= 変更
        allow-transfer  { 192.168.100.0/24; fe80::/64; }; <= 変更

        /*
         - 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 yes;
        dnssec-validation yes;

        / Path to ISC DLV key /
        bindkeys-file "/etc/named.root.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
        forwarders { 2001:4860:4860::8888; 2001:4860:4860::8844; 8.8.8.8; 8.8.4.4; }; <= 追加
        forward only; <= 追加
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

//zone "." IN { <= コメントアウト
//      type hint; <= コメントアウト
//      file "named.ca"; <= コメントアウト
//}; <= コメントアウト

//include "/etc/named.rfc1912.zones"; <= コメントアウト
include "/etc/named.root.key";
include "/var/named/named.c.zone"; <= 追加

/var/named/named.c.zone ( named.conf で include したファイル)

acl "c" {
  fe80::/10;
  192.168.100.0/24;
};
view "internal" {
  match-clients { c; };
  allow-query { c; };
  empty-zones-enable no;

  zone "c" IN {
    type master;
    file "c.zone";
    allow-update { none; };
  };
  zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa" IN {
    type master;
    file "c.rev.zone";
    allow-update { none; };
  };
  zone "100.168.192.in-addr.arpa" IN {
    type master;
    file "c.rev.zone";
    allow-update { none; };
  };
  zone "localhost" IN {
    type master;
    file "named.localhost";
  };
  zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.loopback";
  };
};
view "external" {
  match-clients { c; };
  allow-query { c; };
  empty-zones-enable no;

  zone "." IN {
    type hint;
    file "named.ca";
  };
};

/var/named/c.zone (正引き)

$TTL 3600
@ IN SOA asuna.c. *****.gmail.com. (
2023021308 ; serial
3600       ; refresh (a hour)
900        ; retry (15 minutes)
604800     ; expire (1 week)
86400      ; negative (1 day)
)
                          IN  AAAA   ::ffff:192.168.100.121
                          IN  A      192.168.100.121
                          IN  NS     asuna.c.
;
satsuki                   IN  A      127.0.0.1
                          IN  AAAA   ::1
studio                    IN  A      127.0.0.1
                          IN  AAAA   ::1
biblio                    IN  A      127.0.0.1
                          IN  AAAA   ::1
hitagi                    IN  A      192.168.100.1
akiha                     IN  A      192.168.100.3
kohaku                    IN  A      192.168.100.4
hisui                     IN  A      192.168.100.5
saffron                   IN  A      192.168.100.111
                          IN  AAAA   fe80::111
asuna                     IN  A      192.168.100.121
                          IN  AAAA   fe80::121
varda                     IN  A      192.168.100.142
isuca                     IN  A      192.168.100.253

/var/named/c.rev.zone (逆引き)

$TTL 3600
@ IN SOA asuna.c. *****.gmail.com. (
2023021301 ; serial
3600       ; refresh (1 hour)
900        ; retry (15 minutes)
604800     ; expire (1 week)
86400      ; negative (1 day)
)
        IN NS   asuna.c.
1       IN PTR  hitagi.c.
3       IN PTR  akiha.c.
4       IN PTR  kohaku.c.
5       IN PTR  hisui.c.
142     IN PTR  varda.c.
111     IN PTR  saffron.c.
121     IN PTR  asuna.c.
253     IN PTR  isuca.c.

/etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=permissive <= 変更
# SELINUXTYPE= can take one of these two values:
#       targeted - Targeted processes are protected,
#       mls - Multi Level Security protection.
SELINUXTYPE=targeted