どうして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 コマンドを打鍵しても下記のようにエラーメッセージがでてくるひとがおおいのではないでしょうか?
1 | curl -s -X PUT ” |
エラーメッセージは下記のようなもの“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 コマンドが通るようになりました。
1 | curl -s -X PUT ” |
とりあえず、上記のコマンドは通るようになりましたが、、、しかし、、、、
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.dにset-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 ” |
上記スクリプトを書いたら、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分ごとにジョブが動いているか確認してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | Jul 11 14:40:02 machine-name-ubuntu CRON[77325]: (root) CMD (sh set-ip.sh) Jul 11 14:40:02 machine-name-ubuntu CRON[77324]: (CRON) info (No MTA installed, discarding output) Jul 11 14:50:01 machine-name-ubuntu CRON[77412]: (root) CMD (sh set-ip.sh) Jul 11 14:50:01 machine-name-ubuntu CRON[77411]: (CRON) info (No MTA installed, discarding output) Jul 11 15:00:01 machine-name-ubuntu 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 についている ..を削除して
1 2 | sudo apt install –fix-broken を実行してから sudo apt-get install 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
うまくいけば、 ログで下記のように見えるはず
Oct 21 16:20:01 dkawanam-ubuntu CRON[157185]: (root) CMD (sh set-ip.sh)
Oct 21 16:30:01 dkawanam-ubuntu 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)
Oct 21 16:30:01 dkawanam-ubuntu CRON[158255]: (root) CMD (sh set-ip.sh)
最後に
いかがでしたでしょうか?cloudflareはかなり便利かと思います。無料でここまでできるというもいい時代になったものです。APIは結構なんでもできてしまうのでAPI のキーだけは盗まれないようにしましょう?
参考にした記事