サイトがパブリックネットワーク上にあり、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のコールキューです
      さて、最後に必要なことは、クライアントへの呼び出しを行うプロバイダーコンテキストを取得することです。 これを行うには、プロバイダー設定編集カードを開き、アドレスバーからそのコンテキストをコピーします。
      これで、サイトからのコールバックを構成するために必要なものがすべて揃いました。
- IPアドレスAskozia : 93.188.40.99
 - ユーザーAMIログイン: webcall
 - ユーザーAMIパスワード: 9 [U. [2o {9 $?H $$ su
 - プロバイダーコンテキスト: SIP-PROVIDER-1646711234f40d80266c2f
 - 内線電話番号: 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']); } } ?>
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      結果として何が起こったのか: