ゾーンファイルのサンプル
BINDでシェルスクリプトを利用してAレコードに新しいサブドメインを追加するシェルスクリプトのサンプルです
下記のようなゾーンファイルがあるとします。このゾーンファイルにサブドメインを追加したシェルスクリプトを作成します
$ sudo vim /etc/bind/zones/db.example.com
$TTL 86400 ; 1日
@ IN SOA ns1.example.com. hostmaster.example.com. (
2025091101 ; シリアル番号
10800 ; リフレッシュ
3600 ; リトライ
604800 ; 有効期限
86400 ) ; 最小TTL
IN NS ns1.example.com.
IN NS ns2.example.com.
ns1 IN A 192.0.2.1
ns2 IN A 192.0.2.2
www IN A 192.0.2.3
ftp IN CNAME www.example.com.
mail IN MX 10 mail.example.com.
mail IN A 192.0.2.4
各行の解説:
$ORIGIN example.com.- このゾーンファイルの基点となるドメインを指定します。
$TTL 86400- このファイル内のレコードに、個別のTTL(有効期限)が指定されていない場合のデフォルト値を設定します。
@ IN SOA ...- ゾーンの開始を宣言する SOA(Start of Authority)レコードです。
@は$ORIGINで指定されたドメイン自身を指します。
IN NS ns1.example.com.- このゾーンを管理するネームサーバー(NSレコード)を指定します。
ns1 IN A 192.0.2.1ns1.example.com.のIPアドレスを定義する Aレコードです。ns1のようにドメイン名が省略されている場合、$ORIGINが補完されます。
ftp IN CNAME www.example.com.ftp.example.com.がwww.example.com.の別名であることを定義する CNAMEレコードです。
mail IN MX 10 mail.example.com.example.com.のメールを処理するサーバーを定義する MXレコードです。10は優先度を示します。
新しいサブドメインを生成するシェルスクリプトのサンプル
以下に、PowerDNSやBIND向けの新しいサブドメイン(Aレコード)をゾーンファイルに追加するためのシェルスクリプトのサンプルを示します。
このスクリプトは、ドメイン名とIPアドレスを引数として受け取り、指定されたゾーンファイルにレコードを追加し、SOAシリアル番号を更新します。
#!/bin/bash
# 使用方法: ./add_subdomain.sh <ドメイン名> <IPアドレス>
# --- 設定変数 ---
ZONE_FILE="/etc/bind/zones/db.example.com" # ゾーンファイルのパス
DNS_SERVER_TYPE="powerdns" # "powerdns" または "bind"
# -----------------
# 引数のチェック
if [ $# -ne 2 ]; then
echo "使用方法: $0 <サブドメイン名> <IPアドレス>"
exit 1
fi
SUBDOMAIN=$1
IP_ADDRESS=$2
# 既存のゾーンファイルが存在するか確認
if [ ! -f "$ZONE_FILE" ]; then
echo "エラー: ゾーンファイルが見つかりません: $ZONE_FILE"
exit 1
fi
# ゾーンファイルのSOAシリアル番号を更新
# シリアル番号の形式をYYYYMMDDSS(SSは2桁の連番)と仮定
# SOAレコードの行を検索し、新しいシリアル番号に置き換える
CURRENT_SERIAL=$(grep '^[[:space:]]*[0-9]*[[:space:]]*;[[:space:]]*シリアル番号' "$ZONE_FILE" | awk '{print $1}')
NEW_DATE=$(date +%Y%m%d)
NEW_SERIAL_NUM=$(printf "%02d" $(($CURRENT_SERIAL % 100 + 1)))
NEW_SERIAL="${NEW_DATE}${NEW_SERIAL_NUM}"
# 同じ日付のシリアル番号がすでに存在する場合、連番を増やす
if [[ "$CURRENT_SERIAL" == "${NEW_DATE}*" ]]; then
NEW_SERIAL_NUM=$(printf "%02d" $(($CURRENT_SERIAL % 100 + 1)))
NEW_SERIAL="${NEW_DATE}${NEW_SERIAL_NUM}"
else
NEW_SERIAL="${NEW_DATE}01"
fi
sed -i "s/$CURRENT_SERIAL/$NEW_SERIAL/" "$ZONE_FILE"
# 新しいAレコードをゾーンファイルに追加
echo "${SUBDOMAIN} IN A ${IP_ADDRESS}" >> "$ZONE_FILE"
echo "新しいレコードを追加しました: ${SUBDOMAIN} IN A ${IP_ADDRESS}"
# DNSサーバーの設定を再読み込み
if [ "$DNS_SERVER_TYPE" == "powerdns" ]; then
pdns_control reload
echo "PowerDNSの設定をリロードしました。"
elif [ "$DNS_SERVER_TYPE" == "bind" ]; then
rndc reload example.com
echo "BINDの設定をリロードしました。"
fi
echo "完了しました。"
スクリプトの解説
- 設定変数:
ZONE_FILEにゾーンファイルのパスを、DNS_SERVER_TYPEにpowerdnsまたはbindを設定します。 - 引数のチェック: サブドメインとIPアドレスの2つの引数が提供されているか確認します。
- SOAシリアルの更新: 最も重要なステップです。DNSサーバーは、SOA(Start of Authority)レコードのシリアル番号を見て、ゾーンファイルが更新されたかどうかを判断します。このスクリプトでは、
YYYYMMDDSS形式(例:2025091101)のシリアル番号を自動でインクリメントします。 - レコードの追加:
echoコマンドを使って、新しいAレコードの行をゾーンファイルの末尾に追記します。 - サーバーのリロード:
pdns_control reload(PowerDNS)またはrndc reload <ドメイン名>(BIND)コマンドを実行し、DNSサーバーに新しい設定を読み込ませます。これにより、追加されたレコードがすぐに反映されます。

