
サイトがパブリックネットワーク上にあり、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']); } } ?>
結果として何が起こったのか: