自宅ラボを構築していると、サーバーやネットワーク機器へIPアドレスではなくFQDNでアクセスしたくなります。
例えば、
172.31.255.100
ではなく、
proxmox01.lab.home.arpa
という名前でアクセスできれば、管理がかなり分かりやすくなります。
そこで今回は、Proxmox VE上にDebian 13のLXCコンテナを作成し、BIND9を使った自宅ラボ用DNSサーバーを構築します。
実際に今回構築した環境をもとに、
LXC作成
↓
BIND9インストール
↓
Forwarder設定
↓
正引きゾーン作成
↓
逆引きゾーン作成
↓
Windows PCから確認
↓
dns01自身もBIND9を利用
というところまで紹介します。
今回構築する環境
今回使用する環境は以下です。
| 項目 | 設定 |
|---|---|
| 仮想化基盤 | Proxmox VE 9.2 |
| Proxmoxホスト | proxmox01 |
| Proxmox IP | 172.31.255.100/24 |
| Proxmox FQDN | proxmox01.lab.home.arpa |
| LXC | Debian 13 |
| DNSサーバー名 | dns01 |
| DNSサーバーIP | 172.31.255.101/24 |
| DNSサーバーFQDN | dns01.lab.home.arpa |
| DNSゾーン | lab.home.arpa |
| 逆引きゾーン | 255.31.172.in-addr.arpa |
| デフォルトゲートウェイ | 172.31.255.1 |
今回のDNSサーバーは、Proxmox本体へBIND9を直接インストールするのではなく、専用のLXCコンテナとして構築します。
構成イメージは以下です。
Proxmox VE
172.31.255.100
proxmox01.lab.home.arpa
│
└─ LXC:dns01
172.31.255.101
dns01.lab.home.arpa
│
└─ BIND9
Debian 13のLXCテンプレートをダウンロードする
まず、Proxmoxへログインします。
https://172.31.255.100:8006

Proxmoxの左メニューから、
local
↓
CTテンプレート
↓
テンプレート
と進みます。

今回は、
debian-13-standard_13.6-1_amd64.tar.zst
を使用しました。


BIND9用LXCコンテナを作成する
画面右上の、
CTを作成
をクリックします。
今回は以下のように設定しました。
CT ID:100
ホスト名:dns01
非特権コンテナ:有効

非特権コンテナにしておくことで、LXC内部のrootとProxmoxホスト側のrootを分離できます。
テンプレートを選択する
先ほどダウンロードした、
debian-13-standard_13.6-1_amd64.tar.zst
を指定します。

ディスクを設定する
今回は以下の設定にしました。
ストレージ:local-lvm
ディスク:8 GiB
BIND9だけを動かすのであれば、8GiBでも十分な容量です。

CPUを設定する
CPUは、
1 Core
としました。
BIND9は非常に軽量なので、自宅ラボ用途であれば1コアから始めても問題ありません。

メモリを設定する
今回は、
メモリ:512 MiB
Swap:512 MiB
としました。

こちらも必要になれば、後からProxmox側で増やせます。
dns01のネットワークを設定する
DNSサーバーは常に同じIPアドレスで利用するため、DHCPではなく固定IPアドレスを設定します。
今回は、
Interface:eth0
Bridge:vmbr0
IPv4:静的
IPv4/CIDR:172.31.255.101/24
Gateway:172.31.255.1
としました。

今回、VLANタグは使用していません。
LXC作成時点のDNS設定
LXCを作成している段階では、まだBIND9は存在していません。
そのため、最初から、
127.0.0.1
をDNSサーバーに指定してしまうと、BIND9をインストールするための名前解決すらできなくなります。
LXC作成時は、
DNSドメイン:ホスト設定を使用
DNSサーバー:ホスト設定を使用
の状態で進めました。

BIND9完成後に、dns01自身のDNSを127.0.0.1へ変更します。
LXCコンテナを作成する
最後に設定内容を確認します。
今回の設定は、
CPU:1 Core
Memory:512 MiB
Swap:512 MiB
Disk:8 GiB
IP:172.31.255.101/24
Gateway:172.31.255.1
です。
「作成後に起動」にチェックを入れて作成しました。

Debian 13でSystemd 257の警告が表示された
今回、LXC作成時に次の警告が表示されました。
WARN: Systemd 257 detected. You may need to enable nesting.


ただし、今回の環境ではLXCコンテナ自体は正常に作成・起動できました。
実際にProxmoxのサマリー画面でも、
状態:running
IP:172.31.255.101
となっています。

環境によってsystemd関連のサービスに問題が発生する場合は、LXCのNesting設定を確認するとよいでしょう。
dns01へログインする
Proxmoxから、
100 (dns01)
↓
コンソール
を開きます。
rootユーザーでログインします。
dns01 login: root
ログイン後、
root@dns01:~#
と表示されればOKです。

IPアドレスとルーティングを確認する
まずホスト名を確認します。
hostname
結果:
dns01
IPアドレスを確認します。
ip addr
eth0に、
172.31.255.101/24
が設定されていることを確認します。
続いて、
ip route
を確認します。
今回の環境では、
default via 172.31.255.1 dev eth0
172.31.255.0/24 dev eth0
となっています。
さらに、
cat /etc/resolv.conf
を確認しました。
構築前は、
search lab.home.arpa
nameserver 172.31.255.1
となっていました。

ネットワーク疎通を確認する
BIND9をインストールする前に、ネットワークが正常に使えることを確認します。
まずデフォルトゲートウェイへPingします。
ping -c 4 172.31.255.1
続いてインターネットへの疎通です。
ping -c 4 8.8.8.8
最後に、DNS名前解決も含めて確認します。
ping -c 4 deb.debian.org
今回すべて、
0% packet loss
となりました。

これで、
LAN疎通
↓
Internet疎通
↓
DNS名前解決
まで正常であることを確認できました。
Debianをアップデートする
パッケージ情報を更新します。
apt update
続いて、
apt upgrade -y
を実行します。
必要なツールもインストールしておきます。
apt install curl wget ca-certificates -y
BIND9をインストールする
BIND9をインストールします。
apt install bind9 bind9-utils bind9-dnsutils -y
インストール後、サービス状態を確認します。
systemctl status named
正常であれば、
Active: active (running)
と表示されます。

BIND9起動時にIPv6のnetwork unreachableが表示された
今回、BIND9起動直後のログに、
network unreachable resolving ...
2001:...
というログが表示されました。
BIND9がIPv6のDNSサーバーへ問い合わせようとしたものの、今回の環境ではIPv6ルーティングを使用していないためです。
そこで今回は、BIND9自体の通信をIPv4のみに制限しました。
BIND9をIPv4のみで起動する
次のファイルを編集します。
nano /etc/default/named
初期状態では、
OPTIONS="-u bind"
となっていました。
今回はこれをコメントアウトして、
#OPTIONS="-u bind"
OPTIONS="-u bind -4"
としました。

保存後、
systemctl restart named
を実行します。
状態を確認します。
systemctl status named
今回の環境では、
/usr/sbin/named -f -u bind -4
となり、-4付きで起動していることを確認できました。

TCP/UDP 53番ポートを確認する
DNSではTCP/UDPの53番ポートを使用します。
以下で確認します。
ss -lntup | grep ':53'
今回、
UDP 172.31.255.101:53
UDP 127.0.0.1:53
TCP 172.31.255.101:53
TCP 127.0.0.1:53
で待ち受けていることを確認できました。

BIND9の基本設定を行う
まず設定ファイルをバックアップします。
cp /etc/bind/named.conf.options /etc/bind/named.conf.options.bak
続いて、
nano /etc/bind/named.conf.options
を開きます。
今回は以下のように設定しました。
acl "trusted" {
127.0.0.1;
172.31.255.0/24;
192.168.255.0/24;
};
options {
directory "/var/cache/bind";
recursion yes;
allow-query {
trusted;
};
allow-recursion {
trusted;
};
allow-transfer {
none;
};
listen-on {
127.0.0.1;
172.31.255.101;
};
forwarders {
172.31.255.1;
};
forward first;
};

trusted ACLについて
trustedでは、DNS問い合わせを許可するネットワークを指定しています。
今回、
172.31.255.0/24
はサーバー側ネットワークです。
さらに、
192.168.255.0/24
を追加しています。
これは、実際にDNSをテストしたWindows PCが、
192.168.255.110
だったためです。
この設定が今回かなり重要なポイントになりました。
Forwarderを設定する
今回、
forwarders {
172.31.255.1;
};
を設定しました。
これにより、
lab.home.arpa
はdns01自身が回答し、
google.com
など、自分が管理していないドメインについては、
172.31.255.1
へ問い合わせを転送します。
イメージは以下です。
Client
│
▼
dns01
172.31.255.101
│
├─ lab.home.arpa
│ └─ 自分で回答
│
└─ google.com
↓
172.31.255.1
↓
Internet
設定ファイルをチェックする
BIND9を再起動する前に、
named-checkconf
を実行します。
何も表示されなければ、構文上の問題はありません。
その後、
systemctl restart named
を実行します。
確認:
systemctl status named
Active: active (running)
であればOKです。

Forwarder経由の名前解決を確認する
まずループバックアドレスへ問い合わせます。
dig @127.0.0.1 google.com
続いて、LAN側IPへ問い合わせます。
dig @172.31.255.101 google.com
今回どちらも、
status: NOERROR
となり、GoogleのIPアドレスが返りました。


これで、
dns01
↓
BIND9
↓
Forwarder
↓
外部DNS
まで正常に動作していることが確認できました。
lab.home.arpaゾーンを作成する
続いて、自宅ラボ用のDNSゾーンを作成します。
nano /etc/bind/named.conf.local
以下を設定します。
zone "lab.home.arpa" {
type master;
file "/etc/bind/db.lab.home.arpa";
};
zone "255.31.172.in-addr.arpa" {
type master;
file "/etc/bind/db.172.31.255";
};

正引きゾーンファイルを作成する
nano /etc/bind/db.lab.home.arpa
今回の内容は以下です。
$TTL 86400
@ IN SOA dns01.lab.home.arpa. admin.lab.home.arpa. (
2026092801
3600
1800
604800
86400
)
@ IN NS dns01.lab.home.arpa.
proxmox01 IN A 172.31.255.100
dns01 IN A 172.31.255.101
dhcp01 IN A 172.31.255.102
db01 IN A 172.31.255.103
ldap01 IN A 172.31.255.104
radius01 IN A 172.31.255.105
log01 IN A 172.31.255.106
zabbix01 IN A 172.31.255.107
今後構築する予定のサーバーも、あらかじめ登録しています。

正引きゾーンをチェックする
named-checkzone lab.home.arpa /etc/bind/db.lab.home.arpa
正常であれば、
zone lab.home.arpa/IN: loaded serial 2026092801
OK
と表示されます。
逆引きゾーンを作成する
nano /etc/bind/db.172.31.255
以下を設定します。
$TTL 86400
@ IN SOA dns01.lab.home.arpa. admin.lab.home.arpa. (
2026092801
3600
1800
604800
86400
)
@ IN NS dns01.lab.home.arpa.
100 IN PTR proxmox01.lab.home.arpa.
101 IN PTR dns01.lab.home.arpa.
102 IN PTR dhcp01.lab.home.arpa.
103 IN PTR db01.lab.home.arpa.
104 IN PTR ldap01.lab.home.arpa.
105 IN PTR radius01.lab.home.arpa.
106 IN PTR log01.lab.home.arpa.
107 IN PTR zabbix01.lab.home.arpa.
チェックします。

named-checkzone 255.31.172.in-addr.arpa /etc/bind/db.172.31.255
正常ならOKとなります。

BIND9へゾーンを読み込ませる
最後に、
named-checkconf
を実行します。
問題がなければ、
systemctl restart named
を実行します。
systemctl status named
今回、
zone lab.home.arpa/IN: loaded serial 2026092801
zone 255.31.172.in-addr.arpa/IN: loaded serial 2026092801
all zones loaded
となり、正引き・逆引きとも正常にロードされました。

正引きを確認する
Proxmoxを問い合わせます。
dig @172.31.255.101 proxmox01.lab.home.arpa
結果:
proxmox01.lab.home.arpa. IN A 172.31.255.100

dns01自身も確認します。
dig @172.31.255.101 dns01.lab.home.arpa
結果:
dns01.lab.home.arpa. IN A 172.31.255.101

逆引きを確認する
dig @172.31.255.101 -x 172.31.255.100
結果:
100.255.31.172.in-addr.arpa.
IN PTR proxmox01.lab.home.arpa.

正引き・逆引きとも正常です。
Windows PCからDNSを確認する
最後に、別のWindows PCから確認しました。
Windows PCのIPアドレスは、
192.168.255.110/24
です。
以下を実行します。
nslookup proxmox01.lab.home.arpa 172.31.255.101
ところが最初は、
*** UnKnown が proxmox01.lab.home.arpa を見つけられません:
Query refused
となりました。

Query refusedになった原因
原因はnamed.conf.optionsのACLでした。
当初は、
acl "trusted" {
127.0.0.1;
172.31.255.0/24;
};
としていました。
しかし、Windows PCは、
192.168.255.110
です。
そのためBIND9から見ると、許可されていないネットワークからの問い合わせとなり、
Query refused
が返っていました。
そこで、
acl "trusted" {
127.0.0.1;
172.31.255.0/24;
192.168.255.0/24;
};
へ変更しました。
再起動後、Windows PCからもう一度実行します。
nslookup proxmox01.lab.home.arpa 172.31.255.101
今度は、
サーバー: dns01.lab.home.arpa
Address: 172.31.255.101
名前: proxmox01.lab.home.arpa
Address: 172.31.255.100
と正常に応答しました。

このトラブルは、BIND9を構築する際にACLを設定している場合に確認したいポイントです。
Windows PCから外部ドメインも確認する
続いて、
nslookup google.com 172.31.255.101
を実行しました。
GoogleのIPv4/IPv6アドレスが正常に返りました。

ここで表示される、
権限のない回答
はエラーではありません。
dns01はlab.home.arpaについては権威DNSですが、google.comの権威DNSではないためです。
Forwarderなどを通して取得した情報を返しているため、非権威応答となります。
dns01自身のDNSを127.0.0.1へ変更する
ここまででBIND9が正常に動作することを十分確認できました。
そこで最後に、dns01自身も自分のBIND9を利用するようにします。
Proxmoxから、
100 (dns01)
↓
DNS
↓
編集
を開き、
DNSドメイン:lab.home.arpa
DNSサーバ:127.0.0.1
に変更しました。


DNS設定変更後はLXCを再起動する
今回、この設定を変更しただけでは、
cat /etc/resolv.conf
の内容がすぐには変わりませんでした。

そこでLXCコンテナを再起動しました。


再起動後、
cat /etc/resolv.conf
を確認すると、
# --- BEGIN PVE ---
search lab.home.arpa
nameserver 127.0.0.1
# --- END PVE ---
へ変更されました。

# --- BEGIN PVE ---とあることから、このresolv.confはProxmoxによって管理されています。
そのため、この環境では/etc/resolv.confを直接書き換えるのではなく、Proxmox側のDNS設定から変更する方が分かりやすいでしょう。
dns01自身が自分のBIND9を使っていることを確認する
最後に、
dig proxmox01.lab.home.arpa
を実行します。
結果の下部が、
SERVER: 127.0.0.1#53
となりました。
そして、
proxmox01.lab.home.arpa
→ 172.31.255.100
も正常に返っています。

さらに、
dig google.com
も実行します。
こちらも、
SERVER: 127.0.0.1#53
から正常に応答しました。

これで、
dns01
│
│ DNS Query
▼
127.0.0.1
│
▼
BIND9
│
├─ lab.home.arpa
│ └─ dns01自身で回答
│
└─ 外部ドメイン
↓
172.31.255.1
↓
Internet
という構成が完成しました。
今回構築したBIND9 DNSサーバー
最終的な構成は以下です。
Internet
▲
│
172.31.255.1
Forwarder
▲
│
Windows PC ───────────→ dns01
192.168.255.110 172.31.255.101
│
BIND9
│
lab.home.arpa
│
┌───────────────┬───┴──────────────┐
│ │ │
proxmox01 dns01 dhcp01
172.31.255.100 172.31.255.101 172.31.255.102
自宅ラボ内では、
proxmox01.lab.home.arpa
dns01.lab.home.arpa
dhcp01.lab.home.arpa
db01.lab.home.arpa
ldap01.lab.home.arpa
radius01.lab.home.arpa
log01.lab.home.arpa
zabbix01.lab.home.arpa
というFQDNを利用できるようになりました。
今回ハマったポイント
今回の構築では、単純にBIND9をインストールするだけではなく、いくつか実際のトラブルにも遭遇しました。
特に重要だったのは次の内容です。
| 事象 | 原因・対応 |
|---|---|
| Debian 13 LXC作成時にSystemd 257警告 | LXC自体は起動。必要に応じてNestingを確認 |
BIND9ログにIPv6 network unreachable | /etc/default/namedへ-4を追加 |
Windows PCからQuery refused | Windows側NWがACLに入っていなかった |
UnKnownと表示 | 逆引きを含むDNS問い合わせがACLで拒否されていた |
| ProxmoxのDNS変更がすぐ反映されない | LXC再起動後に/etc/resolv.confへ反映 |
google.comが「権限のない回答」 | 正常。dns01はgoogle.comの権威DNSではない |
単純な構築手順だけではなく、このあたりまで確認しておくと、BIND9の動作がかなり理解しやすくなります。
まとめ
今回はProxmox VE上へDebian 13のLXCコンテナを作成し、BIND9を使った自宅ラボ用DNSサーバーを構築しました。
DNSサーバーは、
dns01.lab.home.arpa
172.31.255.101
です。
内部DNSとして、
proxmox01.lab.home.arpa
↓
172.31.255.100
という正引きと、
172.31.255.100
↓
proxmox01.lab.home.arpa
という逆引きの両方を実装しました。
また、Forwarderを設定したことで、
Client
↓
dns01
↓
172.31.255.1
↓
Internet
という形で外部ドメインの名前解決もできます。
最後にdns01自身のDNSサーバーを127.0.0.1へ変更し、DNSサーバー自身も自分のBIND9を使用する構成にしました。
これで、今後構築するDHCP、LDAP、RADIUS、Zabbixなども、IPアドレスではなくlab.home.arpa配下のFQDNを使って構築できるようになります。
自宅ラボ・Proxmox環境の構築におすすめの機材と書籍
今回のようにProxmox上へBIND9などのインフラサービスを構築していくと、仮想化やProxmoxそのものについて、もう少し詳しく知りたくなる場面も出てきます。
ここでは、今回の自宅ラボ構築で参考になるProxmox関連書籍と、ミニPCを紹介します。
仮想化環境の構築から運用まで Proxmox VE 実践ガイド
Proxmox VEをこれから本格的に触ってみたい方におすすめの一冊です。
Proxmoxのインストールだけでなく、仮想マシンやコンテナ、ストレージ、ネットワークなど、Proxmoxを使った仮想化環境の構築から運用まで体系的に学びたい場合に役立ちます。
今回の記事ではLXCコンテナ上へBIND9を構築しましたが、Proxmoxにはほかにもさまざまな機能があります。
「自宅ラボをもう少し本格的に作り込みたい」という方は、手元に1冊あると便利です。
Proxmox VEサーバー仮想化 導入実践ガイド エンタープライズシステムをOSSベースで構築
こちらもProxmox VEについて詳しく解説されている書籍です。
Proxmoxを単なる自宅サーバー用途だけでなく、OSSを利用したサーバー仮想化基盤として理解したい方に向いています。
今回のような、
Proxmox
├─ DNS
├─ DHCP
├─ DB
├─ LDAP
├─ RADIUS
└─ Zabbix
といった複数のインフラサービスを構築していく場合、仮想化基盤そのものの理解も重要になります。
Proxmoxを使った環境を長く運用していきたい方は、参考書としてチェックしてみてください。
GMKtec ミニPC G3S
自宅でProxmox環境を構築する場合、通常のデスクトップPCやサーバーを用意する方法もありますが、省スペース・低消費電力なミニPCも非常に使いやすいです。
今回のような、
BIND9
Kea DHCP
OpenLDAP
FreeRADIUS
Zabbix
などの自宅ラボ用途であれば、LXCを中心に構築することで比較的少ないリソースでも複数サービスを動かせます。
GMKtecのミニPCは、Proxmoxを使った自宅サーバーや検証環境をこれから作ってみたい方にとって、候補のひとつになるでしょう。
自宅ラボは少しずつ拡張していくのがおすすめ
最初から大規模な環境を作る必要はありません。
今回のように、
Proxmox
↓
BIND9
から始めて、その後、
DNS
↓
DHCP
↓
Database
↓
LDAP
↓
RADIUS
↓
Syslog
↓
Zabbix
と少しずつサービスを追加していくだけでも、ネットワークやサーバーの理解がかなり深まります。
ミニPC1台でもさまざまな検証ができるため、ネットワークエンジニアの自宅ラボ環境としてProxmoxはかなり遊べる基盤です。
次回は、今回構築したBIND9をWebminからGUIで管理できるようにする手順を紹介します。

コメント