MikrotikでVPNの自動パスワード受信を構成する

背景



いくつかのリソースをブロックするという私たちの国での導入に関連して(指を指すことはありません)、VPNを介したリソースへのアクセスを実装する必要がありました。 ところで、私はこれらのリソースをそれほど頻繁に使用しませんが、私はそれらを使用します。 そして、それは簡単に思えます。 現在、VPNアクセスを提供するさまざまなサービスが多数あります。



しかし、サービスに数十ドルを支払い、それを月に数回使用するのは実用的ではないと思いました。 その後、私の選択は無料のVPNに落ちました。 これらの1つはvpnbookサービスです。 私の要件にはたくさんありますが、問題はPPTP経由でVPNにアクセスするためのパスワードが定期的に変更されることです。 そして、変更のたびに、サイトにアクセスしてそれをコピーし、ルーターの接続を構成します-正直な怠です。 そして彼らは「怠lazは進歩の原動力だ」と言います。 私の場合、そうです。 何かする必要があります...



ページからパスワードを解析し、Mikrotikの接続設定を自動的に更新してみませんか。 なぜパスワードだけですか? さて、vpnbookでは、サーバーのアドレスは非常に一定であり、同じアドレスを使用し、ログインは常に同じです-vpnbook。 それでは始めましょう。



PHPに関するパート-シンプルなパーサー



まず、PHPで簡単なページパーサーを作成することにしました。 正直なところ、私は自分の仕事で特にプログラミングをしていません。したがって、ここで提供するすべてのコードを確実に改善することができます。



解析時には、PHP Simple HTML DOM Parserライブラリを使用しました。 リンクからダウンロードできます。 そして、まず第一に、それを接続する必要があります。



include "simple_html_dom.php";
      
      





次に、 vpnbook.com / freevpnページのコンテンツを取得するために、cURLを使用します。 php.net Webサイトから使用方法の例を取り上げ、関数でラップしました。



 function url_get_html($url){ //  cURL $ch = curl_init(); //  url      curl_setopt($ch, CURLOPT_URL, $url); //        string curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //   $output = curl_exec($ch); //  cURL curl_close($ch); //   return $output; }
      
      





さらに、PHP Simple HTML DOM Parserライブラリの機能を使用して、ページのコンテンツからパスワードを抽出する必要があります。 ページのソースコードを見ると、パスワードがstrongタグのリストの最後の要素にあることがわかります。



ページのソースコード
 ... </div> <p>PPTP (point to point tunneling) is widely used since it is supported across all Microsoft Windows, Linux, Apple, Mobile and PS3 platforms. It is however easier to block and might not work if your ISP or government blocks the protocol. In that case you need to use OpenVPN, which is impossible to detect or block.</p> <ul class="disc"> <li><strong>euro217.vpnbook.com</strong></li> <li><strong>euro214.vpnbook.com</strong></li> <li><strong>us1.vpnbook.com</strong> <span class="red">...</span></li> <li><strong>us2.vpnbook.com</strong> <span class="red">...</span></li> <li><strong>ca1.vpnbook.com</strong> <span class="red">...</span></li> <li><strong>de233.vpnbook.com</strong> <span class="red">...</span></li> <li>Username: <strong>vpnbook</strong></li> <li>Password: <strong>qedE3ha</strong></li> </ul> <div><strong><span class="green"> More servers coming. Please Donate.</span></strong></div> ...
      
      







最初のリストからページにすべての強力なタグを取得し、最後のリストからパスワードを取得しないのはなぜですか? 私たちはやる:



 // URL      $url = "http://www.vpnbook.com/freevpn"; //  DOM $html = str_get_html(url_get_html($url)); //         "disc" $items = $html->find(".disc", 0)->find("strong"); //     $pswd = end($items); //   echo $pswd->innertext;
      
      





これでパーサーの準備ができました。 サーバーに置くために残ります。



コメントなしで完全にコーディング
 include "simple_html_dom.php"; function url_get_html($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); return $output; } $url = "http://www.vpnbook.com/freevpn"; $html = str_get_html(url_get_html($url)); $items = $html->find(".disc", 0)->find("strong"); $pswd = end($items); echo $pswd->innertext;
      
      







Mikrotikに関するパート-VPN接続を作成するためのスクリプト



パーサーは準備ができており、 vpn.pswd.tkで利用できると想像してください。 次に、パーサーにアクセスし、パーサーからパスワードを受け取り、VPN接続を再作成するスクリプトをMikrotik(私にはhap liteがあります)に記述する必要があります。 Mikrotikのドキュメントをざっと調べると、必要な機能が見つかりました。つまり、/ツールフェッチを使用して、URLで要求を作成し、その内容をテキストファイルに入れてから、その内容を変数に読み込みます。 完全なスクリプトコードを次に示します。



 /tool fetch url="http://vpn.pswd.tk/" mode=http dst-path="vpn_pswd.txt"; :delay 2s :local password [/file get vpn_pswd.txt contents] /file remove vpn_pswd.txt; /interface pptp-client remove [/interface pptp-client find name=pptp-out1] /interface pptp-client add name=pptp-out1 user=vpnbook password=$password connect-to=us1.vpnbook.com disabled=no
      
      





何が何なのか見てみましょう。 最初の行では、パーサーに要求を作成し、vpn_pswd.txtファイルにパスワードの形式で応答を書き込みます。 さらに、ご想像のとおり、2秒の遅延があります。 何のために? 実際には、ルーターは要求を完了してファイルを作成するのに時間がかかります。遅延しない場合、次のコマンドは単にファイルの値を変数と見なさない場合があります(その時点では存在しないため)。 さらに、変数に値を書き込んだ後、作成されたファイルを削除します-不要になりました。 次に、作成したVPN接続を削除し、新しい接続を作成します。



(任意の)時間間隔の後、このスクリプトの起動をスケジューラに追加するだけです。 これは、システム/スケジューラセクションで行われます。 スクリプトが「through_vpn_list」と呼ばれると仮定すると、このコマンドを使用して、6時間ごとにスクリプトを実行するタスクを作成します。



 /system scheduler add name=schedule1 interval=6h on-event="/system script run through_vpn_list"
      
      





まとめ



無料サービスのパスワードを使用して、VPN接続を自動的に作成する機会を得ました。 この接続の使用方法はあなたの決定です。 たとえば、VPN接続がサイトとリソースの特定のリストに対してのみ使用されるように、ポリシーベースのルーティングを構成できます。 たとえば、私はそれを実装しました。 これを行うことができるドキュメントへのリンクを同封しています。



もちろん、このソリューションはおそらく最適ではありません。 そして、ここで多くを改善できます。 たとえば、レイアウトが変更された場合はどうなりますか? パーサーは動作しなくなります。 したがって、パスワードを取得するためのより普遍的なアプローチを検討する必要があります。 しかし、目標は達成されており、そのような束はうまく機能しています。



PSコメント、何が間違っているか、何が改善できるかを書いてください。 それが書かれているように:「秘密の会話がなければ、計画は動揺し、多くのアドバイザーが成功するでしょう。」



All Articles