お名前ドットコムのDDNSのIPをLinuxから更新する、onamae_ddns

webサーバやメールサーバといったサーバの運用には欠かせないDDNSの設定についてです。私が普段使っているドメインはお名前ドットコムで管理しているものです。

Linuxでの非公式な更新は以下のような方法で行われています。

  • 通信はテキストベースである
  • opensslを用いて接続
  • 接続後は速やかにコマンドを入力しないと接続が切られるので高速に(自動化すべし)

というわけで自動化を考えます。もっと調べると、RubyやPythonを使ってプログラムやスクリプトを書かれている方が多いですね。opensslはLinuxにデフォルトで入っているので追加で必要なパッケージがないのもサーバ的にGoodです。なので、今回はC言語で書いて最速、かつ少しでもセキュリティを考えて平文のパスワードやIDなどを残さないようにしてしまいます。

またお名前ドットコムを選んだ理由、事前に行うべき設定はこちらの記事にあります。

少しだけ思うところ。

すごく個人的なことですが、pythonやrubyはあまり好みではない、というかC++とかのネイティブで動かせるのが大好きなのでそちらで実装してみました。あとはARM系SBCはまだまだ非力なので本当に少しでも早く動かしたいというのがあります。

あとスクリプトそのまま置いておくと怖い気がします。何かの拍子にそのファイルが読み取られたりするとそこを見るだけでIDとパスワードがわかってしまいますから、簡単に乗っ取れてしまいます。C++で1回コンパイルするだけでもぱっと見でわからなくなるだけでもそちらのほうがセキュリティ的によろしいかと思いますし。

もちろんリバースエンジニアリングをされたら終わりなんですけどね。そんなことを言い出していたらきりがありません。

余談もいったんこれぐらいにして使い方を説明していきます。

目次

  1. はじめに
  2. onamae_ddnsのインストール
  3. 使い方
  4. アンインストール
  5. 守ってほしいこと
  6. ご意見、ご要望

はじめに

このソフトウェアを利用される際は以下のソフトウェア利用規約必ずお読みください。利用される場合はソフトウェア利用規約に同意し遵守するものとみなします。

また本ソフトウェアは「使い方」に準じない使い方を想定しておりません。「使い方」の項目に記されていない使用につきましては一切認めません。

onamae_ddnsのインストール

まず初めにレポジトリからcloneします。今回のレポジトリはここです。

https://github.com/T-H-Un/onamae_ddns

追記:(2020/10/3) gitコマンドを導入していない場合はwgetを用いて導入することも可能です。こちらの部分に方法を記述しておきます。

gitを用いる場合

始めに以下のコマンドを実行します。

git clone https://github.com/T-H-Un/onamae_ddns.git

このあとソースコードに変更を加える必要があるのでgitを用いた場合は以下のwgetを用いたインストールの項を飛ばしてください。

wgetを用いたインストール

wgetを用いる場合は以下のコマンドを実行します。

wget https://github.com/T-H-Un/onamae_ddns/archive/master.zip
unzip master.zip
cd onamae_ddns-master

unzipがもしもない場合はインストールするか、別のzipファイルを展開できるソフトを利用してください。

ソースコードに変更を加える

設定ファイルなどで読み込む形式でもよかったのですが、セキュリティを少しでも考えるということで、直接編集してコンパイルしてしまいます。

なのでいったん好きなエディタでddns.cppを開いてください。サンプルではnanoを用いります。

nano onamae_ddns/ddns.cpp

開いてもらうと以下のようになっているので、今から示す部分を変更してください。

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(){
 FILE *file;
 char buffer[128];
 char *pcmd;
 file=popen("curl ifconfig.io -4","r");
 if (file==NULL){
	 printf("ERROR!! Can't reach \"ifconfig.io\"\n");
	 return -1;
	 }
 fgets(buffer, 128, file);
 pclose(file);
 buffer[strlen(buffer)-1]='\0';
 file=popen("openssl s_client -connect ddnsclient.onamae.com:65010 -quiet","w");
 sleep(1);
 fprintf(file,"LOGIN\nUSERID:12345678\nPASSWORD:Pass1234\n.\n");
 sleep(1);
 fprintf(file,"MODIP\nHOSTNAME:hostname\nDOMNAME:example.com\nIPV4:%s\n.\n",buffer);
 sleep(1);
 fprintf(file,"LOGOUT\n.\n");
 pclose(file);
 printf("\n%s\n",buffer);
 return 0;
}

19行目のUSERID:12345678の12345678の部分をご自身の変更を通知したいドメインの「お名前ID」に変更してください。同じ行のPASSWORD:pass1234のpass1234の部分を先ほど変更したお名前IDの「パスワード」に変更してください。C言語なので、もしもパスワードに「"」などの特殊記号を用いている方はエスケープシーケンスをしてください。

次に21行目を編集します。HOSTNAME:hostnameのhostnameの部分をホスト名(wwwみたいなやつ)に、DOMNAME:example.comのexample.comの部分を変更を通知したいドメイン名にしてください。

以上の4か所を変更します。まとめると以下の4か所を変更してるか確認してください

  • 19行目 USERID:12345678
  • 19行目 PASSWORD:pass1234
  • 21行目 HOSTNAME:hostname
  • 21行目 DOMNAME:example.com

これを変更したら保存してください。

makeを行っていくのでディレクトリに入り、インストールをしていきます。私はRaspbianの環境でmakeをしています。なので、同じようなDebian系の環境であればそのままmakeが通るかと思います。

cd onamae_ddns
make
sudo make install

インストール先などを気にしない人は先は読み飛ばして大丈夫です。

さて、私の勉強不足な面もあってこのMakefileはあくまで私の環境なら動いたというだけなので、別の場所や環境でご利用されたい場合はお手数ですが、Makefileを書き換えてください。Makefileは以下のようになっています。

CC = gcc
CFLAGS = -O4 -Wall -I/usr/local/include
DEST = /usr/local/bin
LDFLAGS = -L/usr/local/lib
PROGRAM = onamae_ddns

$(PROGRAM) : ddns.o
	gcc -o $(PROGRAM) ddns.o
ddns.o : ddns.cpp
	gcc -c ddns.cpp
install : $(PROGRAM)
	install -s $(PROGRAM) $(DEST)
clean : 
	rm -f *.o *~ $(PROGRAM)

まあ私は「oname_ddns」と打つだけでコマンドが実行できるようにしたかっただけなのでこうしていますが、シンプルなソフトでどこにおいても基本的には動くと思うので、gccを使ってコンパイルだけしても大丈夫です。

これでもうコマンド自体は使えるのですが、上記にも書いたようにセキュリティを少しでも高めるべく、不要なソースファイルは消してしまいましょう。

cd ../
rm -r oname_ddns

これでバイナリファイルのみがインストールされている状態です。

使い方

非常にシンプルでこのコマンド一つで更新通知ができちゃいます。

onamae_ddns

これで以下のような表示が最後のほうに出ていれば大丈夫です。

000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
123.456.789.110 //サーバーのグローバルIP

これ4回同じ表示が出ているのがポイントで、3回だったり、001 ERRORみたいなのが出て入ればおそらくddns.cppの変更するところを間違っている可能性が高いのでもう一度戻って確認してみてください。あとドメインを取得したばかりでもうまくいかないかもしれません。

あとはこれをcronに登録すれば定期実行できるのでおすすめです。ちなみにこのコードはIPを通知する機能しかないので、グローバルIPが変化したかどうかは確認してません。というのも同じIPを送信しても問題ないですし、実際にIPの変更にどれくらい時間がかかるのかを調べてみたところ15~20分ぐらいかかっているようなので、そこまで厳密にしないでいいと思った次第です。

とりあえずcrontabに登録しましょう。わからない、面倒であればそのまま同じ設定にすれば大丈夫です。バイナリ本体のインストール場所は「/usr/local/bin/onamae_ddns」になっています。

crontab -e
*/15 * * * * /usr/local/bin/onamae_ddns

今回は1日1回実行とか意味がないので15分に1回実行するようにしました。記述方法がわからないって方は「cron 記述」 あたりで調べるといいですよ。

アンインストール

アンインストールする場合はインストール場所に指定している、/usr/local/bin/onamae_ddnsを削除する必要があるので、以下のコマンドを実行します。(当然デフォルトのインストール先の場合のみ)

sudo rm /usr/local/bin/onamae_ddns

あとはcrontabの編集をして定期実行を消してしまえば終わりです。以下のコマンドでcrontabを編集します。

crontab -e

ご自身の環境に合わせて消してもらえればいいですが、例で挙げた私の環境の場合はこの一文を削除します。

*/15 * * * * /usr/local/bin/onamae_ddns

以上でアンインストールは完了です。

守ってほしいこと

過剰な回数を実行するなどしないでください。サーバに負荷をかけるだけで何も得はしません。15分に1回ぐらいならいいかと思って私はこうしてますが、個人的なことを言うのであれば、1分に1回は実行しすぎだと思います。DNSサーバー側の更新に15~20分かかるので気長に待ちましょう。

ご意見、ご感想など

コメントは逐一見させていただいています。バグや、機能追加などはgithubにしていただければ対応できる範囲で考えます。助かった、便利などの感想もコメントでいただけるだけでも、活力になりますのでお待ちしております。

Linux、プログラムともに勉強中で至らぬところもあるかと思いますが、ご指摘いただければ修正したりより便利になるのでよろしくお願いいたします。

このツールをご紹介いただく機会がございましたらリンクはここに飛ばしてもらうのは歓迎いたします。許可も不要です。

THUN 2021.7.15 ver 0.02

更新履歴

ver. 0.01 最初のリリース

ver. 0.02 IPv6環境下における、ifconfig.ioからの返り値がIPv4になるように修正(GitHubでプルリクをいただきました。)

ver. 0.03 "system"を使用している部分を"popen"に変更。不要なコードを削除。ローカルに中間ファイルが生成されなくなるので、I/O負荷のわずかな軽減と高速化。

他にもこんなツールも作成しました。Raspberry Piをご使用の方はよろしければいいかがでしょうか。

結構便利です

投稿日:
カテゴリー: TOOL

コメントする

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