Raspberry Pi+Dot TKで無料ドメイン&自宅DDNS

無料ドメインサービスのDot TKでドメインを取得し、固定IPでない自宅に常にドメイン名でアクセスするためにRaspberry Piを利用する方法を解説します。メインのPCなどを常時起動させなくて済みます。

Dot TKで取得したドメインをCloudFlareで管理し、自宅のRaspberry PiからCloudFlareのAPIを叩いて、自宅のIPアドレスが変わっても.tkのアドレスでアクセスできるようにします。

まずはDot TKでドメインを取得します。

Dot TK - 新しい無料ドメインを探します


.tkドメインの管理のため、Freenomにも登録します。

https://my.freenom.com/clientarea.phphttps://my.freenom.com/clientarea.php


CloudFlareにも登録します。

Cloudflare - The Web Performance & Security Company | Cloudflare



CloudFlareの Add Site からサイトを作成し、Cloudflare Nameserversにある2つのネームサーバーを確認します。

Freenomの Services > My Domains > Management Tools > Nameservers の5つの欄の内容を消し、1と2にCloudFlareのネームサーバ2つを入れ、確定します。

これで.tkドメインはCloudFlareのネームサーバーで名前解決が行われるようになります。

CloudFlareの DNS ページで、取得した.tkドメインのAレコードを登録します。既にある場合はそのままで大丈夫です。IPアドレスは適当なものを入れておきます。

CloudFlareの Overview ページにある Zone ID と、Get your API key をクリックした先にある Global API Key (View API Key ボタンをクリック)を記録しておきます。


Raspberry Piでの操作です。試しに次のようなコマンドを実行してみます。記録したZone IDとAPI Key、CloudFlare登録時のメールアドレスを該当箇所に入れてください。

※以下、[ ]で示した箇所には適切な文字列を入れて作業してください。

$ curl -s -X GET "https://api.cloudflare.com/client/v4/zones/[Zone ID]/dns_records" -H "X-Auth-Email: [メールアドレス]" -H "X-Auth-Key: [API Key]" -H "Content-Type: application/json"

成功すれば、DNSレコードの一覧が返ってきます。

{
  "result": [
    {
      "id": "[レコードID]",
      "type": "A",
      "name": "[.tkドメイン名]",
      "content": "[登録したIPアドレス]",
      "proxiable": true,
      "proxied": false,
      "ttl": 1,
      "locked": false,
      "zone_id": "[Zone ID]",
      "zone_name": "[ゾーン名]",
      "modified_on": "[最終変更日時]",
      "created_on": "[作成日時]",
      "meta": {
        "auto_added": false
      }
    }
  ],
(レコードが複数ある場合は更に続く...)
  "result_info": {
    "page": 1,
    "per_page": 20,
    "total_pages": 1,
    "count": 1,
    "total_count": 1
  },
  "success": true,
  "errors": [],
  "messages": []
}

こんな感じでCloudFlareのAPIを使うと必要な情報がパッと取れます。かなり便利です。

更新したいレコードのレコードIDを記録しておきます。

この中のIPアドレスを現在の自宅グローバルIPアドレスと比較し、違っていたら更新します。次のようなシェルスクリプトを作ります。

update-cf-ddns.sh

#!/bin/bash

GETret=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/[Zone ID]/dns_records/[レコードID]" -H "X-Auth-Email: [メールアドレス]" -H "X-Auth-Key: [API Key]]" -H "Content-Type: application/json")
GETret=${GETret##*\"content\":\"}
GETret=${GETret%%\"*}
echo "Current content: "$GETret

GlobalIP=$(curl -s inet-ip.info)
echo "My global IP   : "$GlobalIP

if test $GETret = $GlobalIP; then
	echo "OK."
	exit
else
	echo "Going to update."
fi

PUTop="curl -s -X PUT \"https://api.cloudflare.com/client/v4/zones/[Zone ID]/dns_records/[レコードID]\" -H \"X-Auth-Email: [メールアドレス]\" -H \"X-Auth-Key: [API Key]]\" -H \"Content-Type: application/json\" --data '{\"type\":\"A\", \"name\":\"[.tkドメイン]\", \"content\":\"${GlobalIP}\"}'"
PUTret=$(eval $PUTop)

success=${PUTret##*\"success\":}
success=${success%%,*}
if test $success = "true"; then
	echo "successfully updated."
else
	echo "error"
	echo $PUTret
fi

あまりシェルスクリプトを書き慣れていないので、かっこ悪いのはご容赦下さい。一応動きますので。



あとはこれをcrontabに登録しておけば、自動で更新をしてくれます。作った.shを /usr/local/bin に移したという想定です。

$ crontab -e

で出てきた設定ファイルに、

*/15 * * * * /usr/local/bin/update-cf-ddns.sh

などと追記すれば、一定時間ごとに更新できます。(この場合は15分毎)

設定後、一旦CloudFlare上でレコードのIPアドレスを適当なものに変え、およそ設定した時間後にIPアドレスが自宅のものになるかを確認しましょう。



以上でドメインの取得からDDNSの設定まで終了です。いつでも外から自宅にアクセスできるというのはなかなか安心できるものですね。