(追記:2022/04/06)お名前ドットコムから通達があった通り、新クライアントへの移行後動作するかを確認しましたが、通信内容に変化は無いみたいなので、そのまま使用することができます。WEBの方からも更新できるのを確認済みです。
pi@test$ date && ./onamae_ddns
2022年 4月 6日 水曜日 19:30:17 JST
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 12 100 12 0 0 54 0 --:--:-- --:--:-- --:--:-- 54
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign GCC R3 DV TLS CA 2020
verify return:1
depth=0 CN = *.onamae.com
verify return:1
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
000 COMMAND SUCCESSFUL
.
14.10.60.34
(追記ここまで)
webサーバやメールサーバといったサーバの運用には欠かせないDDNSの設定についてです。私が普段使っているドメインはお名前ドットコムで管理しているものです。
Linuxでの非公式な更新は以下のような方法で行われています。
- 通信はテキストベースである
- opensslを用いて接続
- 接続後は速やかにコマンドを入力しないと接続が切られるので高速に(自動化すべし)
というわけで自動化を考えます。もっと調べると、RubyやPythonを使ってプログラムやスクリプトを書かれている方が多いですね。opensslはLinuxにデフォルトで入っているので、追加で必要なパッケージがないのもサーバ的にGoodです。なので、今回はC言語で書いて最速、かつ少しでもセキュリティを考えて平文のパスワードやIDなどを残さないようにしてしまいます。
またお名前ドットコムを選んだ理由、事前に行うべき設定はこちらの記事にあります。
私の場合はRaspberry Piで動作させることを目的として作製しましたが、普通のAMD64アーキテクチャでも問題なく動作します。基本的にはLinuxなら何でも大丈夫だと思います。
少しだけ思うところ。
すごく個人的なことですが、pythonやrubyはあまり好みではない、というかC++とかのネイティブで動かせるのが大好きなのでそちらで実装してみました。あとはARM系SBCはまだまだ非力なので本当に少しでも早く動かしたいというのがあります。
あと、スクリプトそのまま置いておくと怖い気がします。何かの拍子にそのファイルが読み取られたりすると、そこを見るだけでIDとパスワードがわかってしまいますから、簡単に乗っ取れてしまいます。C++で1回コンパイルすれば、ぱっと見でわからないので、セキュリティ的によろしいかと思いますし。
もちろん、解析されたら終わりなんですけどね。そんなことを言い出していたらきりがありません。
余談もいったんこれぐらいにして使い方を説明していきます。
目次
はじめに
このソフトウェアを利用される際は以下のソフトウェア利用規約必ずお読みください。利用される場合はソフトウェア利用規約に同意し遵守するものとみなします。
また本ソフトウェアは「使い方」に準じない使い方を想定しておりません。「使い方」の項目に記されていない使用につきましては一切認めません。
onamae_ddnsのインストール
まず初めにレポジトリからcloneします。今回のレポジトリはここです。
https://github.com/T-H-Un/onamae_ddns
追記:(2020/10/3) gitコマンドを導入していない場合はwgetを用いて導入することも可能です。こちらの部分に方法を記述しておきます。別途解凍のためにunzipのパッケージが必要です。
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ファイルを展開できるソフトを利用してください。
ソースコードに変更を加える
(2023/01/11:追記)新バージョンをリリースしたため変更箇所が変わりました。5-8行目の部分を変更します。
const char* USER_ID= "xxxxxxxx";
const char* PASS= "Pass1234";
const char* HOSTNAME="hostname";
const char* DOMNAME="example.com";
変更するのは「"」で囲まれた部分です。以下の様に変更します。
項目 | 内容 |
USER_ID | お名前ドットコムのログインID |
PASS | お名前ドットコムのログインパスワード |
HOSTNAME | 更新するドメインのホスト名 |
DOMNAME | 更新するドメイン |
何が何を示しているかの細かいことは下の方に書いています。
以下の作業はv0.03以前の物です。確実に最小編のメモリを使いたい方は以前のバージョンを使ってください。詳細はこちらの更新履歴をどうぞ。
(追記ここまで:以下はv0.03以前のコードを利用する場合)
設定ファイルなどで読み込む形式でもよかったのですが、セキュリティを少しでも考えるということで、直接編集してコンパイルしてしまいます。
なのでいったん好きなエディタで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
これを変更したら保存してください。
(v0.03以前の設定はここまで)
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 2023.01.11 ver 1.00
更新履歴
ver. 0.01 最初のリリース
ver. 0.02 IPv6環境下における、ifconfig.ioからの返り値がIPv4になるように修正(GitHubでプルリクをいただきました)。
ver. 0.03 "system"を使用している部分を"popen"に変更。不要なコードを削除。I/O負荷のわずかな軽減と高速化。パッチノート
ver. 0.04 一部ページ内の文言を修正。新クライアントへの対応状況を記述。コードに変更なし。便宜上の変更となる。
ver. 1.00 メジャーアップデート。利便性の向上のためconst char*型で新しい変数を追加。従来より使いやすくなりました。ただし、コンパイル環境によっては数バイト程度メモリ使用量が増える可能性あり。パッチノート
他にもこんなツールも作成しました。Raspberry Piをご使用の方はよろしければいいかがでしょうか。