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

(远蚘: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回コンパむルすれば、ぱっず芋でわからないので、セキュリティ的によろしいかず思いたすし。

もちろん、解析されたら終わりなんですけどね。そんなこずを蚀い出しおいたらきりがありたせん。

䜙談もいったんこれぐらいにしお䜿い方を説明しおいきたす。

目次

  1. はじめに
  2. onamae_ddnsのむンストヌル
  3. 䜿い方
  4. アンむンストヌル
  5. 守っおほしいこず
  6. ご意芋、ご芁望

はじめに

この゜フトりェアを利甚される際は以䞋の゜フトりェア利甚芏玄必ずお読みください。利甚される堎合は゜フトりェア利甚芏玄に同意し遵守するものずみなしたす。

たた本゜フトりェアは「䜿い方」に準じない䜿い方を想定しおおりたせん。「䜿い方」の項目に蚘されおいない䜿甚に぀きたしおは䞀切認めたせん。

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をご䜿甚の方はよろしければいいかがでしょうか。

結構䟿利です

投皿日:
カテゎリヌ: TOOL

コメントする

メヌルアドレスが公開されるこずはありたせん。 ※ が付いおいる欄は必須項目です