「お名前.com」のDDNSをRubyスクリプトで更新 ================================= [[myblog>2017/02/11/rtx1200-onamae-com-use/|関連記事]]で「お名前.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レコードを登録しておく。 #!/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 = "" Password = "" Domain = "" 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 ``` 補足 ---- [[https://help.onamae.com/answer/7921|参考.2]]に書かれているように、更新用サーバとIPチェックサーバは下記。 * 更新用サーバー ホスト/ポート:初期設定値から変更しないでください。 (ポート番号は65010となります) * IPチェック用サーバー ホスト/ポート:初期設定値から変更しないでください。 (ポート番号は65000となります) ※プロキシ等のIPチェック用サーバーに直接アクセスできない環境ではご利用いただけません。 追記(2022年3月4日) ------------------ お名前.comから連絡が来ていたが、2022年3月3日に新しい「お名前.com ダイナミックDNSクライアント」サービスに切り替わった。 更新用サーバ名やプロトコルは従来と同じようである。上記スクリプトは一応動作できた。 {{:programing:ruby-language:onamae-ddns-client-new-01.png|}} 関連記事 ------- * [[myblog>2017/02/11/rtx1200-onamae-com-use/|【RTX1200】ヤマハルータで「お名前.com」の独自ドメイン名を使う]] * [[myblog>2019/08/11/ruby-send-ssl-mail/|【Ubuntu】RubyでSMTP over SSLメールを送る]] * [[myblog>2019/03/23/onamae-dns-aaaa-ipv6-ipv4/|【お名前.com】IPv4(Aレコード)とIPv6(AAAAレコード)の両方に対応させる]] 参考 ---- 1. [[https://www.onamae.com/option/dnsrecord/|DNSレコードとは? - お名前.com]] 2. [[https://help.onamae.com/answer/7921|ドメイン】お名前.comダイナミックDNS(DDNS)クライアントの設定方法 - お名前.com]] 3. [[https://www.abten.net/2018/07/1689/|“rubyスクリプト”による”お名前.com”のDDNS更新]] 4. [[https://gist.github.com/snipsnipsnip/89c380baa10b7d8e9753|snipsnipsnip/update-onamae-ddns.rb - GitHub]] 5. [[http://geraniums.hatenablog.com/entry/2018/09/06/171723|お名前.com DDNS]] 6. [[https://qiita.com/ats124/items/59ec0f444d00bbcea27d|LinuxやMacで お名前.com ダイナミックDNS の IPアドレスを更新する]]