Skip to content

cosicosilife.com

ライフハックについていろいろ書きます

Primary Menu
  • サイトマップ
  • クラウド技術
  • 安全資産投資
  • 旅行
  • ライフハック
  • プライバシーポリシー
  • 運営者情報とご連絡先
  • Home
  • 未分類
  • CLOUDFLAREAPIでサーバーのIPを自動更新しよう
  • 未分類

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

david 2025年2月10日

この記事の目次(クリックしたらジャンプ)

Toggle
  • どうしてIPの更新が必要なのか?なぜCloudflareなのか?
  • まずは、必要なパラメターを集めます
  • なぜだかエラーメッセージがでてくる ”Content-type must be application/json.” 
  • curl コマンドを打鍵した際にProxy ステータスが OFF となってしまう
  • 結局何が原因だったのか?PUTではなくPATCHにするべきだったのです。(反省)
  • curl PATH スクリプトに登録して、これをcronで10分ごとに実行する

どうして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/e58688a6d170fff0f31ea612878878cf” -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.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 ” 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分ごとにジョブが動いているか確認してみます。

1 2 3 4 5 6 7 8 9 10 11 12 13Jul 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 2sudo apt install –fix-broken を実行してから sudo apt-get install postfix コマンドを実行するといいかも

参考URL https://askubuntu.com/questions/222512/cron-info-no-mta-installed-discarding-output-error-in-the-syslog

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

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

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 のキーだけは盗まれないようにしましょう?

参考にした記事

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

Continue Reading

Previous: ubuntuサーバに外部SSDを接続して、NFSでアクセスできるようにする
Next: 免責条項

Related Stories

image
  • 未分類

Twilio Elastic SIP Trunking を試す

david 2025年2月22日
aws
  • 未分類

AWS SSM を使ってみよう 

david 2025年2月16日
DNS
  • 未分類

【初心者向け】AWS Route 53 で cosicosilife.org に DNSSEC を設定する方法

david 2025年2月10日
  • argocdの導入
  • (タイトルなし)
  • オンプレUbuntuでHelm中心にKubernetes運用・CI/CD構築
  • Ubuntu上にArgo CDをインストールし、ブラウザアクセスできるようにする手順(k8s.cosicosilife.com対応)
  • 【初心者向け】Argo CD に初めてのアプリケーションをデプロイしてみよう!
  • サイトマップ
  • クラウド技術
  • 安全資産投資
  • 旅行
  • ライフハック
  • プライバシーポリシー
  • 運営者情報とご連絡先
  • サイトマップ
  • クラウド技術
  • 安全資産投資
  • 旅行
  • ライフハック
  • プライバシーポリシー
  • 運営者情報とご連絡先
Copyright © Cosicosilife | MoreNews by AF themes.