サイト上の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 } } 

Source: https://habr.com/ru/post/J267293/


All Articles