お名前.comで取得した独自ドメインをさくらvpsに当てている時にサブドメインを自宅に当てたい

前書き

ついに固定回線引いたのはいいが可変IPなので外からでも自宅に繋げられるように自宅にサブドメイン割り当てようと思った
環境はVPSがarchlinux
自宅がRaspberry pi上でRaspbianだけどssh打てたらなんでもいい
これからやるのはVPSddns鯖立てる

本文

1.vps上にdns鯖立てるためにbindを入れる
    # pacman -S bind

設定ファイル/etc/named.confにこれを追加する、noter.jpの箇所は各自の独自ドメイン

    zone "noter.jp" IN {                                                        
        type master;                                                            
        file "noter.jp.zone";                                                   
        allow-transfer { 210.172.129.81; };                                     
        allow-update { 127.0.0.1; };                                            
    };               

次にさっきのファイルのdirectoryで指定しているディレクトリにさっき書いたfileの場所に以下の内容のファイルを作る
コメント書きたかったら「;」
/var/named/noter.jp.zone

    $TTL 3600
    *       IN      SOA     noter.jp. root.noter.jp. (
                            2016040301
                            3600
                            900
                            604800
                            86400
                            )
            NS      *
            NS      ns1.noter.jp.
            NS      2nd.dnsv.jp.
            A       自分のIP
    ns1     A       自分のIP
    自宅    A       家のIP

設定は終わったのでbind使うようにする

    # systemctl enable named.service
    # systemctl start named.service

まだ公開してない状態で正引きが設定した家のIPであることを確認

    # nslookup 自宅.noter.jp localhost
2.お名前.comでプライマリネームサーバ IPアドレスの設定

お名前.comにログインしたら
Navi TOP -> ネームサーバーの変更する -> DNS関連機能の設定 -> 設定するドメイン選んで次へ
セカンダリDNS(Slave)を利用する -> プライマリネームサーバ IPアドレスに自分のVPSのIPを入力

3.お名前.comでホスト設定

Navi TOP -> ネームサーバーの変更する -> DNS関連機能の設定 -> 設定するドメイン選んで次へ
ネームサーバー名としてのホストを設定する -> 作成を選択 -> DNS鯖として使うドメインとIPを入力する。例ではns1.noter.jp 自分のIP

4.お名前.comでネームサーバーの変更

Navi TOP -> ネームサーバーの変更する -> ネームサーバーの変更 -> 他のネームサーバーを利用
プライマリネームサーバーに先ほどホスト設定したドメイン 例: ns1.noter.jp
セカンダリネームサーバーに2nd.dnsv.jpで登録する

とりあえずこれで時間経てばnslookupで普通に正引きできます

5.IPを書き換える

色んな方法があるだろうけど今回はsshddns鯖にあるスクリプト実行するのをcronで走らせることにした
まず、こんなスクリプトを用意
https://gist.githubusercontent.com/silenvx/15d58473c201f1b7a2563cb2a09a3059/raw/ee826c7b0f1eb0a5caa02a219b6f08633d7835b1/hoge.sh

#!/bin/sh
GLOBAL_IP=` echo $SSH_CONNECTION|cut -f1 -d " "`
HOST_NAME="sub.noter.jp"
TTL="3600"

echo $GLOBAL_IP|grep -E '^((([0-1]?[0-9]|2[0-4])?[0-9]|25[0-5])\.){3}(([0-1]?[0-9]|2[0-4])?[0-9]|25[0-5])$' > /dev/null
if [ $? -eq 0 ];then
    echo "
    server 127.0.0.1
    update delete $HOST_NAME
    update add $HOST_NAME $TTL A $GLOBAL_IP
    send
    "|nsupdate
fi

これでやってるのはsshで接続してきた奴のglobal ipを取得してnsupdateで情報書き換えてる
自分用にいじるのはHOST_NAMEとTTLの値で、HOST_NAMEは自分の割り当てたいサブドメイン
TTLはzonefileに書いてるアレ
後はssh経由でこのスクリプトを実行するだけ

    # ssh ユーザー名@鯖名 hoge.sh

これでできたら後はcron書いたり更にセキュアにするためにchrootにしたりとかするだけ