お名前.comのドメインをRaspberryPiに割り当ててDDNSを実装するまで

お名前.comには独自のDDNSサービスがあるみたいです。
https://help.onamae.com/answer/7920

しかし、動作環境はWindowsだけなので、
Linuxに導入することが出来ません。

もう少し調べてみると、、
非公式の方法で実装している方がちらほら。

私も真似てみました。
**自己責任でお願いします。**

## 前提

1. ラズパイにApacheなどのミドルウェアを導入済み
1. ルーターのポート転送が完了している
1. ラズパイのプライベートIPを固定している
1. お名前ドットコムでドメイン取得済み

↓今回の環境↓

|モデル  |OS| クライアント端末|
|---|---|---|
| RaspberryPi 4 Model B |Ubuntu Server 20.04.2 LTS (64bit)  |MacBook |

## 要約

1. お名前.comで「グローバルIP」と「ドメイン」を紐づける
1. DNSの自動更新シェルを作る
1. cronを設定し、定期実行させる

DDNSを使うと何が良いのか。
・固定IPを契約しなくてもWebサービスなどを提供できる
・固定IPを契約しなくても自宅のラズパイにドメインでSSH接続できる
要するに低コストで運用できます。

ソースコード：https://github.com/hgssnk/ddns

## グローバルIPとドメインを紐づける

お名前.comでDNSの設定を行いたいのですが、
グローバルIPを事前に把握しておく必要があります。

ラズパイにて以下のコマンドを入力し、結果をメモしてください。

```Bash:
$ curl ifconfig.io

# あるいは
$ curl inet-ip.info
```
グローバルIPの確認ができたら、
以下の手順に沿って設定していきます。

1. 「お名前.com Navi」にログイン：https://www.onamae.com/navi/login/
1. 「ドメイン」>「利用ドメイン一覧」を押下
1. 対象のドメイン名を押下
1. 「ドメイン機能一覧」を押下
1. 「DNS関連機能の設定」を押下
1. 「ネームサーバーの設定」>「DNS設定/転送設定」を押下
1. 対象ドメインにチェックし、「次へ」を押下
1. 「DNSレコード設定を利用する」の「設定する」を押下
1. 「ホスト名」を入力(wwwとか、なんでもOK)
1. 「TYPE」に「A」を選択
1. 「TTL」に「3600」を入力
1. 「VALUE」にグローバルIPを入力
1. 「状態」に「有効」を選択
1. 「追加」を押下
1. 「確認画面へ進む」を押下
1. 「設定する」を押下

以上でドメインとグローバルIPの紐付けが完了しました。
※DNSの反映には時間がかかります。私の場合は1時間ぐらいかかりました。

Apacheなど導入済みであれば、以下をブラウザに入力することで接続確認ができます。
「今設定したホスト名.ドメイン名」

しかし、一般的にグローバルIPは固定ではありません。
このままではグローバルIPが変更されるたびに、DNSレコードも変更しなければいけません。

そこで、DDNSという仕組みを用いることにします。
DDNSとはダイナミック(動的)DNSのことで、
その名の通り**動的なIPに対して名前解決する仕組み**です。

無料で使えるDDNSとして、「No-IP」などがあります。
https://viral-community.com/other-it/ddns-praise-service-2065/

今回はこれらのサービスは用いず、
お名前.comの機能だけを使って実装していきます。


## お名前.comのDNSを更新する方法

まず初めに、お名前.comのDNSレコードを更新する方法を紹介します。

以下のOpenSSLコマンドを叩くことで、
お名前.comのDNSレコードを更新することができます。

**公式の方法ではないみたいなので、自己責任でお願いします。**

```Bash:
$ openssl s_client -connect ddnsclient.onamae.com:65010 -quiet

000 COMMAND SUCCESSFUL
.

# ここから入力していく
LOGIN
USERID:お名前ドットコムのID
PASSWORD:お名前ドットコムののパスワード
.
MODIP
HOSTNAME:ホスト名
DOMNAME:ドメイン名
IPV4:現在のグローバルIPアドレス
.
LOGOUT
.

# 以下のメッセージが出れば成功
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
```

これだと手動でコマンドを叩かなくてはいけないので、
一連の流れをシェルスクリプトで作っていきます。

## DNS更新自動化シェルスクリプト

以下、実装するDDNSの仕組みです。

1. ラズパイ側でグローバルIPを取得する
2. 「取得したIP」と「お名前.comに設定されているIP」が異なる場合、設定を変更する
2. この一連の流れを定期的に実行する

既に自動化シェルを作成している方がいたので、
そちらのソースコードを軸にして実装していきます(末尾にリンク)。

**入力箇所が6箇所**あるので、入力し、保存してください。

```Bash:DNS_UPDATE.sh
#!/bin/bash

# 入力箇所
USERID="ここにお名前.comのID"
PASSWORD="ここにお名前.comのパスワード"
HOSTNAME="ここにホスト名"
DOMNAME="ここにドメイン名"
LOG_FILE="ログを吐き出すディレクトリを絶対パスで指定"
HOST="ここに「ホスト名.ドメイン名」を入力"

# 入力不要
UPDATE_FLG=0
DATE=$(date '+%Y-%m-%d %H:%M:%S')
MESSAGE="IPは更新の必要がありませんでした。"

# Global IPアドレス取得
gip=$(curl inet-ip.info)
domip=$(dig $HOST +short)

# IPアドレス更新
if [ "$gip" != "$domip" ]; then
  {
    echo "LOGIN"
    echo "USERID:$USERID"
    echo "PASSWORD:$PASSWORD"
    echo "."
    echo "MODIP"
    echo "HOSTNAME:$HOSTNAME"
    echo "DOMNAME:$DOMNAME"
    echo "IPV4:$gip"
    echo "."
    echo "LOGOUT"
    echo "."
  } > DDNS_INPUT_FILE.txt
  openssl s_client -connect ddnsclient.onamae.com:65010 -quiet < DDNS_INPUT_FILE.txt
  $UPDATE_FLG=1
else
  echo "$MESSAGE"
fi

# ログ出力
if [ $UPDATE_FLG = 1 ]; then
  {
    echo "DATE    $DATE"
    echo "BEFORE  $domip"
    echo "AFTER   $gip"
    echo ""
  } >> ${LOG_FILE}/DNS_UPDATE.log
fi

exit 0
```

実行権限を与えておきます。

```Bash:
$ chmod 755 DNS_UPDATE.sh
```


## cron設定

作ったシェルをcronに登録することで、定期的にDNSの更新をかけてくれます。
なお、より細かく実行スケジュールを設定したい場合は、
末尾の「参考資料」のサイトが参考になると思います。

```Bash:
$ crontab -e

# 最終行に以下を追加(毎時30分に実行させる)
# 分、時、日、月、曜日
0,30 * * * * /hoge/piyo/DNS_UPDATE.sh
```

以上でDDNSの仕組みが完成しました。

## 最後に

今回はDDNSを導入しました。
冒頭でも記載したようにDDNSには以下のようなメリットがあります。

・固定IPを契約しなくてもWebサービスなどを提供できる
・固定IPを契約しなくても自宅のラズパイにドメインでSSH接続できる

特に、ドメインでSSH接続できるというのが個人的には嬉しいです。
これにより、外出先からでも自宅のラズパイにドメイン指定でアクセスできます。
(グローバルIPの変更を気にしなくても良い！)

以下、SSH接続例です。

```Bash:
$ ssh -i 秘密鍵のパス -p ポート番号 ユーザー名@ホスト名.ドメイン名
```


## 参考資料
・DNS更新自動化シェルスクリプト
こちらの記事では、cronではなくサービスを作って細かく設定しています。
https://www.harada-its.com/2019/06/01-421/
こちらの記事もご参考になると思います。
https://qiita.com/narikei/items/ca4823c7f6790f0cbe0b

・cron設定
https://qiita.com/hikouki/items/e744b3a4d356d2af12cf

## 追記
2021-08-12
・DNSの設定を変更している場合
お名前.comのDNSではなく、その他のDNSに指定している場合は、今回の内容は適用出来ないと思います。

2021-08-13
・前提2を追加
ルーターのポート転送が完了していないと、インターネット経由でラズパイにアクセスすることが出来ません。
「お使いのルーターの型番 + ポート転送」などで検索すると良いかもです。

2021-08-21
・前提3を追加
プライベートIPが固定されていないと、プライベートIPが変更されるたびにルーター側でのルーティング設定を変更しないといけません。
参考：https://qiita.com/zen3/items/757f96cbe522a9ad397d