はじめに
過去に“DiCE”による”お名前.com”のDDNS更新という記事を書きましたが、私の環境では2018年7月20日ころより更新を失敗しているようです。
同時期にいろいろ作業をしていたので、GMO側の仕様変更かどうかは分かっていませんが、とりあえず、更新できないと何かと問題がありますので、他の方法を試してみました。
標題のとおり”rubyスクリプト”を使いますので、ruby がインストールされている必要があります。
以下、ruby の実行環境が整っていることを前提に、説明を進めます。
とりあえず更新したい
いろいろ検索してみるとupdate-onamae-ddns.rb: お名前.comのダイナミックDNSの登録を更新というrubyスクリプトを発見しました。
使わない手はありません。ということで。
1 2 |
wget https://gist.githubusercontent.com/snipsnipsnip/89c380baa10b7d8e9753/raw/7b9b8b6729acf6110aee704d0e98ba293b58b3c4/update-onamae-ddns.rb ruby update-onamae-ddns.rb userid password subdomain example.com |
これで、とりあえず更新することができます。
userid は お名前.com の お名前ID(会員ID)
password は お名前.com の パスワード
subdomain は いわゆるホスト名に相当する部分。ドメイン名のままならば ” と入力
example.com は お名前.com で 登録しているドメイン名
この処理をCronなどで実行してやれば良いということです。
長いこと使うには
スクリプトの中身を見てみると
1 |
OnamaePubkey = 'af4447e1ca6e6525561904eb420503d9b353e29c7e9efc3479c03ca79cb71b4e' |
という行があります。続いて、
1 |
raise "public key is not right" if OpenSSL::Digest::SHA256.hexdigest(ssl.peer_cert.public_key.to_der) != OnamaePubkey |
という行があります。
そして GitHub の Revisions を見ると、頻繁に更新されていることが分かります。
ダウンロードしたスクリプトをそのまま使い続けていると、そのうちエラーで処理が中断され、更新されなくなるでしょう。
ということで、長いこと使うには、GitHub からスクリプトを定期的にダウンロードして更新しながら使う必要があります。
めんどうなので自分好みに
ダウンロードしたりして使うのは何かと面倒なので、自分好みにカスタマイズしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
require 'socket' require 'openssl' # 実行時の引数をなしにする場合は、次の行をコメントアウト abort "usage: #$0 userid password {'*'|''|subdomain} example.com" if ARGV.size != 4 # 実行時の引数を無効にする場合は、次の行をコメントアウトすると警告が表示されない #UserID, Password, Subdomain, Domain = ARGV # 引数を有効にする場合は、以下のパラメータをコメントアウト # 引数に指定したパラメータは、以下のパラメータで上書き UserID = "1234567" Password = "hogefugahogera" Subdomain = "www" Domain = "abten.net" # 現在登録されているIPアドレスの取得 if Subdomain == "" then DomainName = Domain else DomainName = Subdomain + "." + Domain end RegisteredIP = IPSocket.getaddress(DomainName) # パブリックキーが変更された場合は、次の行を編集 OnamaePubkey = 'af4447e1ca6e6525561904eb420503d9b353e29c7e9efc3479c03ca79cb71b4e' DDNSServer = 'ddnsclient.onamae.com' # 静的IPを使う場合は、次の行をコメントアウトすると警告が表示されない IP = TCPSocket.open(DDNSServer, 65000) {|socket| socket.gets }[6..-2] # 静的IPを設定する場合は、次の行で設定 # IP = "0.0.0.0" # DNSの正引きIPと登録したいIPが同じ場合は処理を中止 exit if IP == RegisteredIP print( "'" + 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 |