CLOUDFLAREAPIでサーバーのIPを自動更新しよう

どうしてIPの更新が必要なのか?なぜCloudflareなのか?

おそらく、AWSやさくらサーバなどクラウドを利用している人たちには、お金を払えば(場合によっては無料で)クラウドサービスプロバイダから固定IPがもらえます。しかしながら普通の家庭用インターネットプロバイダの場合は固定IPはもらえないので、IPが変わるたびに、DNSのAレコードを変更しなければなりません。

これを自動でできないのかと思いまして、いろいろ考えてみました。そこで思いついたのがcloudflareです。

固定IPならばいいのですが、普通の自宅のインターネットのIPは変化してしまうのが普通です。SONETひかりだと大体月に1回から2回グローバルIPが変更してしまいます。このIPの変更は手動で行うことができるのですが、手動で行うまでの間はそのサイトのIPアドレスがわからず、cosicosilife.comにアクセスすることができません。

私は基本的にAWSやさくらサーバーなどのクラウドサーバを利用していません。すべて、ラズパイを自宅において自宅のグローバルIPをDNSのAレコードとして登録しています。このブログのドメイン名であるcosicosilife.comはお名前.comから取得していますが、ネームサーバーの役割はcloudflareに任せています。cloudflare にネームサーバとプロキシ、FWなどの機能を一括して任せれば管理コストが減ります。

これを解決するために、自分でスクリプトを書いて、それをCron で動かして自動的にIPを更新することにしました。

参考にしたサイトはこちらです

まずは、必要なパラメターを集めます

①Global API   これはcloudflarea のAPIを操作するためのキーです、絶対に盗まれないようにしてください。

②Zone ID  cosicosilife.com というドメインネームに一意に割り当てられる。IDです。

③record ID  cosicosilife.com というドメインネームのレコードを操作するためのIDです。

これらのIDの取得の仕方についてはこちらのサイトを参照してください。

なぜだかエラーメッセージがでてくる ”Content-type must be application/json.”  、、、、<は?

おそらく上記のリンクのとおりに、IDを取得してcurl コマンドを打鍵しても下記のようにエラーメッセージがでてくるひとがおおいのではないでしょうか?

1curl -s -X PUT ” https://api.cloudflare.com/client/v4/zones/cosicosilifeのzone_id/dns_records/e58688a6d170fff0f31ea612cf” -H “X-Auth-Email: 私のメールアドレス” -H “X-Auth-Key:global API key” -H “Content-Type: application/json” –data “{“type”:”A”,”name”:”cosicosilife.com”,”content”:”グローバルIP”}”

エラーメッセージは下記のようなもの“Content-type must be application/json.”<<は???json でdata 書いて curl しているのに何故?

1{“result”:null,”success”:false,”errors”:[{“code”:9207,”message”:”Content-type must be application/json.”}],”messages”:[]}

いろいろしらべてみたところ,Windows 10 のlinux subsystemはおかしいようでした。詳しい説明は、こちらのサイトにお譲りします。というわけでJSONの部分のカンマを\”にしてみたらきちんとcurl コマンドが通るようになりました。

1curl -s -X PUT ” https://api.cloudflare.com/client/v4/zones/cosicosilifeのzone_id/dns_records/ゾーンID” -H “X-Auth-Email: 私のメールアドレス” -H “X-Auth-Key:global API key” -H “Content-Type: application/json” –data “{\”type\”:\”A\”,\”name\”:\”cosicosilife.com\”,\”content\”:\”.グローバルアドレス\”}”

とりあえず、上記のコマンドは通るようになりましたが、、、しかし、、、、

curl コマンドを打鍵した際にProxy ステータスが OFF となってしまう

上記のcurl コマンドを打鍵するとなぜだか、DNSのプロキシーステータスが下記のようになってしまのでうのです、これは再現性があり、何回やっても同じした。「このレコードには、Cloudflareによりプロキシされた、www.cosicosilife.comの後のIPが含まれます。これを修正するには、プロキシのステータスを変更してください」となってしまう。私が打鍵したコマンドに何かしらの不具合があるのは明らかであるかとおもわれます

アップデートするとなぜだか、DNSのプロキシーが解除されてしまう

念の為、下記の英語のエラーメッセージも表記しておきます。

一応英語のエラーメッセージも添付しておく

結局何が原因だったのか?PUTではなくPATCHにするべきだったのです。(反省)

こういうときは公式のドキュメントを参照するのが一番良い。

公式ドキュメントによると、どうやらdefault でproxy のステータスはOFFとなっているようです。つまり、デフォルトの状態にするために API をPUT してしまったのが悪いらしく、PATCHにするべきだったのです。

curl PATH スクリプトに登録して、これをcronで10分ごとに実行する

今回の設定をスクリプトに書いて、10分ごとに起動して自動的にIPを自動更新することにしました。このファイルは/etc/cron.dset-ip.shという名前で作りました。

1 2 3 4 5 6 7#!/bin/bash   IP=$(curl  http://c0d3man52.starfree.jp/get_ip.php)   echo $IP update=$(curl -s -X PATCH ” https://api.cloudflare.com/client/v4/zones/ゾーンID/dns_records/レコードIDEA” -H “X-Auth-Email: わたしのメールアドレス” -H “X-Auth-Key:APIグローバルキー” -H “Content-Type: application/json” –dat a “{\”type\”:\”A\”,\”name\”:\”cosicosilife.com\”,\”content\”:\”$IP\”}”)

上記スクリプトを書いたら、crontab -e  を打鍵して、crontab のファイルを下記のように編集します。下記のファイルは10分ごとに set-ip.sh コマンドを実行するという意味です

*/10 * * * * sh set-ip.sh

下記のコマンドで50-default.conf を変更します。

vi /etc/rsyslog.d/50-default.conf

上記のコマンドで、cron の部分のコメントアウトを取り除きます。

cron.* /var/log/cron.log<<この行のコメントアウトを取り除く

そして念の為、rsyslogをリスタートして動いているか確認します

systemctl restart rsyslog << このコマンドで rsyslog をリスタート

systemctl status rsyslog <<このコマンドで rsyslogのステータスを確認

そうすると、下記のようにActive: active (running)となっています。

# systemctl status rsyslog

● rsyslog.service – System Logging Service

     Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)

     Active: active (running) since Sun 2021-07-11 11:10:54 JST; 4h 45min ago

よっしゃ、それで、less /var/log/cron.log コマンドできちんと10分ごとにジョブが動いているか確認してみます。

CRON[77455]: (root) CMD (sh set-ip.sh) Jul 11 15:00:01 machine-name-ubuntu 
CRON[77454]: (root) CMD (/usr/local/bin/myjob > /var/log/myjob.log 2>&1) Jul 11 15:00:01 machine-name-ubuntu 
CRON[77453]: (CRON) info (No MTA installed, discarding output) Jul 11 15:09:01 machine-name-ubuntu 
CRON[77475]: (root)CMD (  [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi) Jul 11 15:10:01 machine-name-ubuntu
CRON[77532]: (root) CMD (sh set-ip.sh) Jul 11 15:10:01 machine-name-ubuntu CRON[77531]: (CRON) info (No MTA installed, discarding output) Jul 11 15:17:01 machine-name-ubuntu CRON[77548]: (root) CMD (   cd / && run-parts –report /etc/cron.hourly) Jul 11 15:20:01 machine-name-ubuntu
CRON[77554]: (root) CMD (sh set-ip.sh) Jul 11 15:20:01 machine-name-ubuntu CRON[77553]: (CRON) info (No MTA installed, discarding output)

(CRON) info (No MTA installed, discarding output)

(CRON) info (No MTA installed, discarding output) <<<は???なんだこれ ??

ググってみたらどうやら postfix 入れていなければならないらしい。 というかなぜpostfix がなくてはならないのかはよくわからんが、一応下記のコマンドで入れておこう

sudo apt-get install postfix

上記でエラーが出る際には main.cf の hostname の箇所で hostname についている ..を削除してsudo apt install –fix-broken を実行してから sudo apt-get install postfix コマンドを実行するといいかもしれません

https://askubuntu.com/questions/1012737/error-while-installing-postfix

CRONTAB が動いているかもチェック

crontab も動いているか念のためチェックしましょう

root@xxxxxxx-ubuntu:~# systemctl enable cron
Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable cron
root@xxxxxxx-ubuntu:~# systemctl status cron
● cron.service – Regular background program processing daemon

Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-09-24 08:42:25 JST; 3 weeks 6 days ago
Docs: man:cron(8)
Main PID: 711 (cron)
Tasks: 1 (limit: 8969)
Memory: 816.0K
CGroup: /system.slice/cron.service

└─711 /usr/sbin/cron -f -P

うまくいけば、 ログで下記のように見えるはず

CRON[157185]: (root) CMD (sh set-ip.sh)
CRON[158254]: (root) CMD ([ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi)
CRON[158255]: (root) CMD (sh set-ip.sh)

最後に

いかがでしたでしょうか?cloudflareはかなり便利かと思います。無料でここまでできるというもいい時代になったものです。APIは結構なんでもできてしまうのでAPI のキーだけは盗まれないようにしましょう?

https://qiita.com/tocoteron/items/291b463e45f422abd425
https://510052.xyz/posts/x8xqi13fna0ppwpqc6x8

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です