新石器Wiki

近年はシリコン(石)から進化した便利なもので溢れる時代。そんな気になった事や試した事など記す。

ユーザ用ツール

サイト用ツール


programing:ruby-language:onamae-update-ddns


「お名前.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クライアント」サービスに切り替わった。
更新用サーバ名やプロトコルは従来と同じようである。上記スクリプトは一応動作できた。

関連記事

参考

programing/ruby-language/onamae-update-ddns.txt · 最終更新: 2022/03/04 13:37 by yoko