サイト上のMikrotik RouterOS + PHPスクリプト。 エンパワーメント

ROS 5.xの時代には、白い動的アドレスを持つルーターへのトンネルを上げる必要がありました。 ROS 5では、名前ではなくIPアドレスを指定しました。 オプション2:DDNSサービス。この実装を簡単に検討し、2番目はその話です。



ルーターが自分のアドレスを報告し、他のアドレスを読み取るセンターを作るというアイデアがありました。 最も抵抗の少ない道、つまりPHPのサイトに進むことが決定されました。



現時点では、いくつかの簡単なものが実装されています。



住所のお知らせ



(ルーター)名とパスワードを指定するスクリプトリクエストによって実装されます。



:local number "ROUTER_NUMBER"; :local pass "PASSWORD"; /tool fetch url="http://whoami.ho.ua/adr.php\?i=$number&p=$pass" mode=http
      
      





誰もあなたを偽装して自分のルーターへの接続を開始したり、ルーターのアドレスを読み取ったりできないように、名前とパスワードが必要です。 フェッチユーティリティを使用して、サーバーで目的のスクリプトを開き、GETを介して名前とパスワードを渡します。 $ _SERVER ['REMOTE_ADDR']を介したスクリプトは、ルーターの外部アドレスを受信し、データベースに書き込みます。



他人の住所を読む



繰り返しますが、同じユーティリティを使用して、Webスクリプトを呼び出します。



 :local number "ROUTER_NUMBER"; :local pass "PASSWORD"; /tool fetch url="http://whoami.ho.ua/getadr.php\?i=$number&p=$pass" mode=http dst-path="adr.txt" :global routeradr [/file get adr.txt contents]
      
      





dst-path =“ adr.txt”-受信したデータがファイルに保存されることを示します。 Webページ自体には、要求されたルーターのアドレスを含む純粋なテキストがあります。



$ query = "select address FROM table_routers WHERE((id = '$ _ GET [i]')AND(password = '$ _ GET [p]'))";

$ adr = mysql_query($ query)またはdie(mysql_error());

$ router = mysql_fetch_assoc($ adr);

echo $ router [アドレス];



:global routeradr [/ file get adr.txt contents]-ファイルコンテンツの値をグローバル変数に割り当てます。 次に、この変数は必要性と要望に応じて適用できます。



データベースからスクリプトを読み取る



 :local number "ROUTER_NUMBER"; :local pass "PASSWORD"; /tool fetch url="http://whoami.ho.ua/getscript.php\?i=$number&p=$pass" mode=http dst-path="script.rsc" import file-name=script.rsc /file remove script.rsc
      
      







すべては前のスクリプトと同じですが、ファイルをルーター構成にインポートし、このファイルを削除します。



なぜこれが必要なのですか? たとえば、ファイアウォール内のルーターへのアクセスを不注意に遮断します。 次に、修正されたファイアウォールルールを指定するサイトにこのルーターのスクリプトを追加できます。 スケジュールに従って、ルーターはサイトに接続し、PHPはこのルーターのデータベースに未送信のスクリプトがあるかどうかを確認します。



 SELECT id FROM table_routers WHERE ((id='$_GET[i]') AND (password='$_GET[p]')) $adr=mysql_query($query) or die (mysql_error()); $router=mysql_fetch_assoc($adr); $query="SELECT script, id FROM table_scripts WHERE ((router='$router[id]') AND (executed='N')) ORDER BY id ASC LIMIT 1";
      
      





最初に、パスワードとルーター番号が正しく設定されているかどうかを確認します(他のユーザーがスクリプトを読み取れないように、おそらくそこで構成内のパスワードを変更できるようにします)。次に、このルーターに転送されなかったルーターのキューにあるスクリプトを調べます。



この方法は、新たな問題を解決するものではなく、防止するのに役立ちます。 つまり、最初に「ストローを置く」必要があり、X分/時間ごとにルーターがハンマーで新しいスクリプトをチェックする必要があります。



この方法は、ルーターにグレーのIPアドレスがあり、外部からアクセスする必要がある場合にも適しています。 VPNトンネルをホワイトIPアドレスに上げるスクリプトを打ち込み、指定された時間が経過すると、10個のNATでもデバイスにアクセスできるようになります。



ここにそのような短い物語があります。 このようなサービスに他にどのようなものをねじ込むことができるかについて、一度コメントしたり考えたりします。 計画にはまだいくつかの統計情報があります。そのため、ルーターは、温度、プロセッサ負荷など、いくつかのパラメータをデータベースにマージします。



おまけとして、最初に書いた既製のスクリプトで、ホスト名でipを取得し、IPsecポリシーに追加します。



プラスは、ddnsとipsec(たとえばDlink 804)をサポートするMikrotik +ソープディッシュの束で動作することです。 リモートピアのリモートピア名からIPアドレスを抽出し、目的のポリシーに挿入するスクリプト:



 :local nname RHost1; :log info "start $nname"; :local newip [:resolve "rmotehost1.zapto.org"]; :local curip [/ip ipsec policy get [/ip ipsec policy find comment=$nname] sa-dst-address]; :log info "newip = $newip"; :log info "currentip = $curip"; :if ($newip != $curip) do={ :log info "ip $nname is $curip not $newip"; /ip ipsec policy set [/ip ipsec policy find comment=$nname] sa-dst-address=$newip; :log info "end $nname"; }
      
      





そして、ipsecポリシーでリモート側の現在のIPを置き換えるスクリプト:



 :global lastip :local wanip :local wanif "pppoe-out1" :if ([ :typeof $lastip ] = nil ) do={ :global lastip "0" } :local wanip [ /ip address get [/ip address find interface=$wanif ] address ] :if ([ :typeof $wanip ] = nil ) do={ :log info ("WANIP: no ip address on $wanif .") } else= { :for i from=( [:len $wanip] - 1) to=0 do={ :if ( [:pick $wanip $i] = "/") do={ :set wanip [:pick $wanip 0 $i]; :log info ("wan ip now is $wanip") } } :if ($wanip != $lastip) do={ :log info ("Renew ipsec Policy: $wanif -> $wanip") #   ipsec /ip ipsec policy set 0 sa-src-address=$wanip :global lastip $wanip } }
      
      






All Articles