No-IP用のDDNS自動更新スクリプト

Mikrotik noip.comサービスを操作するためのスクリプトを作成する多くのガイドと例を読んだ後、既製のソリューションを見つけることができませんでした。

他のマニュアルに適合しなかったもの、例えばここに

書き込み時に、スクリプトのテキストで直接外部IPアドレスを受信するインターフェイスの名前を指定する必要がありますが、2、3、または10個のインターフェイスがある場合はどうでしょうか。

私の場合、2つのチャネルがあります。pppoe-clientとパスワードなしのイーサネットですが、動的に受信されたアドレスがあります...



また、ルートには「dst。」のエントリが2つあります。 アドレスは「0.0.0.0/0」に等しく、距離はそれぞれ「1」および「2」です。



画像



まず、すべてのルートをソートし、「dst。」のエントリを見つけます。 アドレス「等しい」0.0.0.0/0」、その後、インターフェースのアクティビティをチェックします(:if([get $ counter active] = true))。

したがって、アクティブなインターフェイスの名前を取得し、ローカル変数「activeInterface」に保存します。



:local activeInterface; /ip route { :local gwintarray; :local counter; :local intfinder; :foreach counter in=[find dst-address=0.0.0.0/0] do={ :if ([get $counter active] = true) do={ :set $activeInterface [get $counter gateway]; } } }
      
      







その後、/ ipアドレステーブルのすべてのエントリを反復処理し、目的のインターフェイスの名前を持つエントリを見つける必要があります。

受信したアドレスにはサブネットマスクが含まれており、すぐに切り取ります。



 :local activeAddress; /ip address { :set $activeAddress [get [find interface=$activeInterface] address]; :set $activeAddress [:pick $activeAddress 0 [:find $activeAddress "/"]]; }
      
      







画像



その後、NO-IPサービスに接続するためのデータを書き込みます。



 :local ddnsuser "your_no-ip_user"; :local ddnspass "your_no-ip_pass"; :local ddnshost "hostname.no-ip.org"; :local str "/nic/update?hostname=$ddnshost&myip=$activeAddress"; /tool fetch url="http://dynupdate.no-ip.com/$str" mode=http user=$ddnsuser password=$ddnspass \ dst-path=("/ServiceDNS.".$ddnshost);
      
      







ここで:

ddnsuser-NO-IPシステムへのログイン

ddnspass-NO-IPシステムのパスワード

ddnshostは、IPアドレスを更新するドメイン名です



そして、答えを含むファイルをダウンロードして、サービスに情報を転送します。



 :local str "/nic/update?hostname=$ddnshost&myip=$activeAddress"; /tool fetch url="http://dynupdate.no-ip.com/$str" mode=http user=$ddnsuser password=$ddnspass \ dst-path=("/ServiceDNS.".$ddnshost);
      
      







その後、2秒待ってファイルの内容を表示し(IPアドレスのステータスを更新)、削除します。



 :delay 2; :local str [/file find name="ServiceDNS.$ddnshost"]; :log info [/file get $str contents]; /file remove $str
      
      







注意!!! このマニュアルでは、 以前のIPアドレスを記憶するグローバル変数「 previousIP 」を使用しています

グローバル変数のアドレスが新しく受信したものと一致する場合、スクリプトはサービス上の何も更新しません。



この方法のマイナス:noip.comにアクセスし、IPアドレスを手動で変更します。 また、Mikrotikスクリプトはこれをまったく追跡しません。 したがって、この例では、この変数は単に除外されています。



完全なスクリプトコードはここにあります。
 #    # Get interface name :local activeInterface; /ip route { :local gwintarray; :local counter; :local intfinder; :foreach counter in=[find dst-address=0.0.0.0/0] do={ :if ([get $counter active] = true) do={ :set $activeInterface [get $counter gateway]; } } } #  IP    # Get IP-address of actived interface :local activeAddress; /ip address { :set $activeAddress [get [find interface=$activeInterface] address]; :set $activeAddress [:pick $activeAddress 0 [:find $activeAddress "/"]]; } #    NO-IP # No-IP User account info :local ddnsuser "your_no-ip_user"; :local ddnspass "your_no-ip_pass"; :local ddnshost "hostname.no-ip.org"; #   # Updating data on NO-IP :local str "/nic/update?hostname=$ddnshost&myip=$activeAddress"; /tool fetch url="http://dynupdate.no-ip.com/$str" mode=http user=$ddnsuser password=$ddnspass \ dst-path=("/ServiceDNS.".$ddnshost); #  2  # Wait 2 seconds :delay 2 #          # Displays information about the status of the update and delete the downloaded file :local str [/file find name="ServiceDNS.$ddnshost"]; :log info [/file get $str contents]; /file remove $str
      
      









以下は初心者向けの情報です

Mikrotikにスクリプトを追加するには、[システム]> [スクリプト]メニューを開き、プラス記号をクリックして新しいスクリプトを追加し、スクリプトに名前を付けます(例: " update-ddns ")



画像



スケジューラでスクリプトを実行するルールを追加することは残ります。 これを行うには、[システム]> [スケジューラ]に移動し、使い慣れたプラス記号をクリックします。

名前に、スケジューラーのルールの名前を指定します。

イベント時 」フィールドで、スクリプトの名前「 update-ddns 」を指定し、起動ルールを設定して「 OK 」をクリックします。



私の場合、スクリプトは61秒ごとに実行されます。



画像



PS:スクリプトは、ファームウェアバージョン6.33.5のMikrotik RB850Gx2 (コアpowerpc)でテストされました。

また、ファームウェアバージョン6.33.5のMikrotik RB450GおよびRB951G-2HnDでも問題なく動作します。



それだけです!



All Articles