Askozia PBXを使用してサイトからコールバックを作成する

コールバックハンターとジンヤヤサービスの人気は、長年にわたって機能してきたIP ATC Askoziaを使用して、当社のWebサイトからのコールバックの可能性を実現するためのアイデアをまき散らしました。 以前、 別の投稿で彼女について書いた。



サイトがパブリックネットワーク上にあり、Askoziaがローカルネットワーク内にあり、パブリックドメインで公開するのが怖かったため、状況は複雑でした。

アスタリスクのサイトからコールバックメカニズムを実装するためのアルゴリズムは、非常に多く書かれています。 最も一般的なのは、クライアントがサイトで電話番号を入力した後に、Originate AMIコマンドを生成することです。 それでは始めましょう。



アスコツィアの側に設定



Askoziaの最新バージョンでは、SIP電話システムへの攻撃に対する積極的な保護のメカニズムが、Linuxサークルで広く知られているiptables_fail2banのペアの形でようやく登場しました。 これは、Askoziaには読み取り専用のLinuxカーネルがあり、FreePBXなどの一般的なディストリビューションに対しても、ハッキングに対する保護が大幅に向上しているためです。 もちろん、あなたは私と議論することができますが:)



したがって、ソースデータ:

ウェブサイトwww.telefon1c.ruのIPアドレスは93.188.40.98です。

93.188.40.99のパブリックアドレスを持つ仮想マシンとしてデプロイされたAskozia



ファイアウォールとfail2banの設定


まず、ファイアウォールを有効にし、ローカルネットワークからシステムへのアクセスを許可して、サブネットを示します。 この場合、172.16.32.0 / 24を設定すると、172.16.32.0〜172.16.32.255の範囲のすべてのアドレスが意味されます。







ファイアウォールを設定するときに、Askoziaをクラウドにインストールするオプションを選択し、そのようなデフォルトのブロックオプションを受け取りました







念のため、ファイアウォール設定が正しくない場合にAskozia WebインターフェイスにアクセスするためのホームIPアドレスを指定しました。そうしないと、管理パネルにアクセスできなくなります:)



次に、fail2banをアクティブにして、パスワードの推測をブロックします。 これは1目盛りで行われ、残りの設定はデフォルトで残されます。





サイトがファイアウォールを介してAMIインターフェイスに到達できるように、iptablesのカスタムルールを追加します。

これを行うには、詳細セクションで次の行を追加します。

iptables -A INPUT -p tcp -s 93.188.40.98 --dport 5038 -j ACCEPT



写真のようになります:





これで、ファイアウォール設定を完了し、変更を保存して、AMIインターフェイスの設定に進むことができます。

最小限の権限で新しいウェブコールユーザーを作成し、1つのIPアドレス、 つまりサイトからのみアクセスできるようにします。





ハードパスワードを設定してみましょう: 9 [U. [2o {9 $?H $$ su



ここで、Webサイトからどこに電話をかけるかを理解する必要があります。 トリッキーなものを発明せず、顧客がHOTLINEで私たちに電話するのと同じルートに沿って送信することにしました。 これは内線番号93のコールキューです







さて、最後に必要なことは、クライアントへの呼び出しを行うプロバイダーコンテキストを取得することです。 これを行うには、プロバイダー設定編集カードを開き、アドレスバーからそのコンテキストをコピーします。







これで、サイトからのコールバックを構成するために必要なものがすべて揃いました。





サイト側のスクリプティング


まず、サイトで電話番号を入力するための簡単なフォームを描く必要があります。







Bitrix Webサイトcall.phpからのフォームのコード
<? //    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $APPLICATION->SetTitle("   "); ?> <div class="ui page grid"> <div class="column"> <div class="ui segment"> //    Askozia <? //  $APPLICATION->IncludeFile("/ajax/ajax_call_handler_inc.php", Array(), Array( "MODE" => "html", "NAME" => "   " )); ?> //         <h1 class="ui header block"> </h1> <div class="ui segment"> <h3 class="ui header"> callback</h3>     ,        . <div class="ui form" id="CallOverAsterisk"> <form class="vertical" action="/call.php" method="post"> <div class="ui action large left icon input"> <input type="text" size="20" maxlength="10" name="txtphonenumber" placeholder="  , : +7 (495) 123-45-67" id="phone"> <div class="ui button orange" id="calloverasterbtn"></div> </div> <button type="submit" style="display:none" id="calloverasterbtnsbmnt" name="call_send"/></button> </form> </div> </div> </div> </div> </div> //    ,    <script type="text/javascript"> $("#phone").mask("+7 (999) 999-99-99"); $("#phone").on("blur", function() { var last = $(this).val().substr( $(this).val().indexOf("-") + 1 ); if( last.length == 3 ) { var move = $(this).val().substr( $(this).val().indexOf("-") - 1, 1 ); var lastfour = move + last; var first = $(this).val().substr( 0, 9 ); $(this).val( first + '-' + lastfour ); } }); //   POST       "" $("#calloverasterbtn").click(function() { $("#calloverasterbtnsbmnt").click(); }); </script> //    <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
      
      







AMIコマンド/ajax/ajax_call_handler_inc.phpを生成するためのハンドラーのphpコード
 <?php if (isset($_REQUEST["call_send"])){ #-------------------------------------------------------------------------------------------- #      Askozia #-------------------------------------------------------------------------------------------- $strHost = "93.188.40.99"; //IP  Askozia $strUser = "webcall"; //  AMI Manager    $strSecret = "9[U.[2o{9$?H$$su"; //  $strContext = "internal"; //  .  Askozia  internal $strExten = "93"; // ,       $strwebnum = preg_replace('~\D+~','',$_REQUEST['txtphonenumber']); //         $strChannel = "Local/".$strwebnum."@SIP-PROVIDER-1646711234f40d80266c2f"; //             IP .      : SIP-PROVIDER-1646711234f40d80266c2f $strWaitTime = "30"; //             $strPriority = "1"; //  #-------------------------------------------------------------------------------------------- #        #-------------------------------------------------------------------------------------------- #specify the caller id for the call $strCallerId = "Web Call <$strwebnum>"; $length = strlen($strwebnum); if ($length == 11 && is_numeric($strwebnum)) { $oSocket = fsockopen($strHost, 5038, $errnum, $errdesc,30) or die("Connection to host failed"); stream_set_timeout($oSocket, 0, 500000); fputs($oSocket, "Action: login\r\n"); fputs($oSocket, "Events: off\r\n"); fputs($oSocket, "Username: $strUser\r\n"); fputs($oSocket, "Secret: $strSecret\r\n\r\n"); while ($line = fgets($oSocket)) $result .= $line; fputs($oSocket, "Action: originate\r\n"); fputs($oSocket, "Channel: $strChannel\r\n"); fputs($oSocket, "WaitTime: $strWaitTime\r\n"); fputs($oSocket, "CallerId: $strCallerId\r\n"); fputs($oSocket, "Exten: $strExten\r\n"); fputs($oSocket, "Context: $strContext\r\n"); fputs($oSocket, "Priority: $strPriority\r\n\r\n"); while ($line = fgets($oSocket)) $result .= $line; fputs($oSocket, "Action: Logoff\r\n\r\n"); while ($line = fgets($oSocket)) $result .= $line; fclose($oSocket); echo '<div class="ui success message">    '.htmlentities($_REQUEST["txtphonenumber"], ENT_QUOTES, "UTF-8").'.     !       ,   . </div>'; } else { echo '<div class="ui negative message">    .     11 ,  +7 (495) 229-30-42</div>'; unset($_SESSION['call_send']); } } ?>
      
      









結果として何が起こったのか:




All Articles