BINDでAレコードを追加するシェルスクリプト

centos_logo Linux
centos_logo

ゾーンファイルのサンプル

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.1
    • ns1.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 "完了しました。"

スクリプトの解説

  1. 設定変数: ZONE_FILEにゾーンファイルのパスを、DNS_SERVER_TYPEpowerdnsまたはbindを設定します。
  2. 引数のチェック: サブドメインとIPアドレスの2つの引数が提供されているか確認します。
  3. SOAシリアルの更新: 最も重要なステップです。DNSサーバーは、SOA(Start of Authority)レコードのシリアル番号を見て、ゾーンファイルが更新されたかどうかを判断します。このスクリプトでは、YYYYMMDDSS形式(例: 2025091101)のシリアル番号を自動でインクリメントします。
  4. レコードの追加: echoコマンドを使って、新しいAレコードの行をゾーンファイルの末尾に追記します。
  5. サーバーのリロード: pdns_control reload(PowerDNS)またはrndc reload <ドメイン名>(BIND)コマンドを実行し、DNSサーバーに新しい設定を読み込ませます。これにより、追加されたレコードがすぐに反映されます。
スポンサーリンク
スポンサーリンク
スポンサーリンク
スポンサーリンク
Linux
スポンサーリンク
adminをフォローする
タイトルとURLをコピーしました