「お名前.com」のDDNSをRubyスクリプトで更新
関連記事で「お名前.com」の独自ドメイン名を取得した。「お名前.com」にはダイナミックDNS機能があり、お名前.comで無料配布されているクライアントソフトを使ってIP更新もできるがWindows版のみである。そこで、RubyスクリプトでDDNS更新するスクリプトを、Webサーバを動かしている「Ubuntu 18.04 LTS Server」上でcronで定期実行して自動更新できるようにしたので備忘録を残す。
準備
Rubyが入っていなければ、下記コマンドでインストール。
$ sudo apt install ruby
Rubyスクリプト
下記のスクリプトを任意の場所に作成。(例:/opt/script/onamae-update-ddns.rb
)
UserID
,Password
,Domain
は自分の情報に書き換える。このスクリプトは、サーバパソコンの「ホスト名」でDNSレコード登録するので、「お名前.com」の方にはそのホスト名のDNSレコードを登録しておく。
- onamae-update-ddns.rb
#!/usr/bin/ruby # coding: utf-8 require 'socket' require 'openssl' require 'date' #require 'resolv' # 実行時の引数をなしにする場合は、次の行をコメントアウト # abort "usage: #$0 userid password {'*'|''|subdomain} example.com" if ARGV.size != 4 # 実行時の引数を無効にする場合は、次の行をコメントアウトすると警告が表示されない #UserID, Password, Subdomain, Domain = ARGV # 引数を有効にする場合は、以下のパラメータをコメントアウト # 引数に指定したパラメータは、以下のパラメータで上書き UserID = "<user_id>" Password = "<user_password>" Domain = "<hogehoge.com>" CacheFile = "/tmp/_onamae_cache.txt" #Subdomain = "server-1" Subdomain = Socket.gethostname # このパソコンのhostnameを取得 # 現在登録されているIPアドレスの取得 if Subdomain == "" then DomainName = Domain else DomainName = Subdomain + "." + Domain end if File.exist?(CacheFile) == true then file = File.open(CacheFile, "r") file.each do |text| RegisteredIP = text.chomp end file.close else RegisteredIP = "." end # パブリックキーが変更された場合は、次の行を編集 OnamaePubkey = 'af4447e1ca6e6525561904eb420503d9b353e29c7e9efc3479c03ca79cb71b4e' DDNSServer = 'ddnsclient.onamae.com' # 静的IPを使う場合は、次の行をコメントアウトすると警告が表示されない IP = TCPSocket.open(DDNSServer, 65000) {|socket| socket.gets }[6..-2] # 静的IPを設定する場合は、次の行で設定 # IP = "0.0.0.0" time = DateTime.now # print(time, ": IP=[" + IP + "], RegisterdIP=[" + RegisteredIP + "]\n") # DNSの正引きIPと登録したいIPが同じ場合は処理を中止 exit if IP == RegisteredIP print(time, ": '" + DomainName + "'のIPアドレスを'" + IP + "'に更新登録の処理を実行します。\n" ) TCPSocket.open(DDNSServer, 65010) do |socket| context = OpenSSL::SSL::SSLContext.new context.set_params context.verify_mode = OpenSSL::SSL::VERIFY_NONE ssl = OpenSSL::SSL::SSLSocket.new(socket, context) ssl.connect raise "#{ssl.verify_result}" if ssl.verify_result != OpenSSL::X509::V_OK ssl.post_connection_check(DDNSServer) # パブリックキーの確認を無効化するには、次の行をコメントアウト # 逆に、チェックを有効にする場合は、アンコメント #raise "public key is not right" if OpenSSL::Digest::SHA256.hexdigest(ssl.peer_cert.public_key.to_der) != OnamaePubkey begin ssl.puts *%W[LOGIN USERID:#{UserID} PASSWORD:#{Password} .] response = ssl.gets("\n.\n") raise response if response.to_i != 0 ssl.puts *%W[MODIP HOSTNAME:#{Subdomain} DOMNAME:#{Domain} IPV4:#{IP} .] response = ssl.gets("\n.\n") raise response if response.to_i != 0 ensure ssl.puts *%W[LOGOUT .] end end # print( "'" + DomainName + "'のIPアドレスを'" + IP + "'に更新登録の処理を実行しました。\n" ) file = File.open(CacheFile, "w") do |text| text.puts(IP) end
このスクリプトでは、登録した現在のIPアドレスを「/tmp/_onamae_cache.txt
」に記録して、実行時に一致する時にはDNS更新実行をしない。
cronで自動実行
cronで定期的に、上記Rubyスクリプトを自動実行する。この例では5分間隔。(お名前.com配布のクライアントソフトのデフォルトが5分となってたので、これ以上は早くしない方がよいと思う)
$ sudo corntab -e
下記行を追加。
5 * * * * /opt/scripts/onamae-update-ddns.rb >> /var/log/onamae-uamae-update.log
補足
参考.2に書かれているように、更新用サーバとIPチェックサーバは下記。
- 更新用サーバー
ホスト/ポート:初期設定値から変更しないでください。 (ポート番号は65010となります) - IPチェック用サーバー
ホスト/ポート:初期設定値から変更しないでください。 (ポート番号は65000となります)
※プロキシ等のIPチェック用サーバーに直接アクセスできない環境ではご利用いただけません。
追記(2022年3月4日)
お名前.comから連絡が来ていたが、2022年3月3日に新しい「お名前.com ダイナミックDNSクライアント」サービスに切り替わった。
更新用サーバ名やプロトコルは従来と同じようである。上記スクリプトは一応動作できた。