訪問済みのHTTPSリソースを正しく表示するためのSquidログパーサーの改良

みなさんこんにちは! 私は、私の記事に基づいて機能するSquidについて質問する人々から多くの電子メールを受信し、受信しています。 ほとんどの場合、任意のパーサーによるSquidログの表示に関する質問が発生します。 問題は、透過プロキシHTTPSが設定されたバージョンSquid 3.5.8が、訪問したHTTPSリソースをドメイン名の形式ではなく、ポート(約164.16.43.56:443)を持つIPアドレスの形式で記録することです。 したがって、訪問の統計を表示すると、人間の情報ではなく、これらの同じIPアドレスがスリップします。 このようなデータを使用して統計を収集することは非常に困難です。 これについてSquid開発者に連絡しましたが、明確な答えが得られませんでした。 私が見つけた唯一のことは、通常のロギングが新しいバージョンのSquidで機能することですが、私にとって透過的なプロキシは個人的には適切に機能しませんでした。 そのため、ログパーサー自体でIPアドレスを解決する方法に関する疑問が生じました。



個人的に、私はScreen Squidパーサーを使用します。そのため、必要な変更を加えることにしました。 Bashを使用する端末で作業するときだけにこのような解像度が必要になることがあるため、解決プロセス全体をBashのスクリプトの形式で作成することにし、Screen Squidでは必要に応じてPHPを使用しています。



したがって、必要なものすべてに対して、次のものが必要です。



  1. 実際、 Screen Squidパーサー自体(インストール手順は印刷しません。すべてが公式サイトにあります)。
  2. グレップ
  3. セド
  4. Nslookup
  5. Whois
  6. ストレートアーム


Bashスクリプト自体は次のとおりです。



#!/bin/bash #   - ip ,     IP="$1"; #  IP    NSLOOKUP,  GREP  SED #       hostname=$(nslookup $IP | grep -m 1 "name" | sed 's|.*= ||'|sed -r 's/ Auth.+//' | sed 's/^[ \t]*//;s/[ \t]*$//' ); #     NSLOOKUP  , #    IP    whois,   # GREP  SED        if [[ "$hostname" == '' ]]; then hostname=$(whois $IP | grep -m 1 "owner\|OrgName\|orgname\|NetName\|netname\|origin" | sed 's|.*: ||'|sed -r 's/. Auth.+//' | sed 's/^[ \t]*//;s/[ \t]*$//') fi #     echo "$hostname" exit 0;
      
      





原則として、彼はすでにコメントされています;ここで説明する特別なものはありません。 Nslookupを使用して最初にIPアドレスに関する情報を取得し、不要な情報を排除するためにgrepおよびsedでコマンドの出力をフィルタリングします。 大量の行を記述しないように、grepの機能を使用して、選択のためのいくつかの条件(文字「 \ | 」)を含めました。 スクリプトを便利な場所に保存し、実行権限を割り当てます。 gethost.shとして/ usr / binに保存されているとしましょう。



スクリプトは端末から簡単に使用できます。



 gethost.sh ip_address
      
      





次に、このスクリプトをScreen Squidに添付する方法を説明します。 / var / www / htmlにインストールされているとします。 このフォルダーには、 reports.phpファイルがあるレポートのサブフォルダーがあります。 変更を加える必要があるのはその中にあります。 このファイルでは、次の行を見つける必要があります。



 $result=mysql_query($queryOneIpaddressTraffic) or die (mysql_error()); $numrow=1; $totalmb=0; while ($line = mysql_fetch_array($result,MYSQL_NUM)) { echo "<tr>"; echo "<td>".$numrow."</td>"; if($enableUseiconv==1) $line[0]=iconv("CP1251","UTF-8",urldecode($line[0])); echo "<td><a href='http://".$line[0]."' target=blank>".$line[0]."</a></td>";
      
      





最後の行の代わりに、次を挿入します。



 //, HTTPS      (   ':') //  ,   HTTP ,     $dv=strpos($line[0], ":") ; if ($dv < 1) { echo "<td><a href='http://".$line[0]."' target=blank>".$line[0]."</a></td>"; } else { //      ':' ,   HTTPS ,  //  "" ... //  IP    , ..    ':' $str1=strpos($line[0], ":"); $row1=substr($line[0], 0, $str1); $ipaddress = ltrim($ipaddress); $ipaddress = $row1; //   IP     gethost.sh $hostname = shell_exec('/usr/bin/gethost.sh ' . $ipaddress); //       IP  echo "<td><a href='https://".$ipaddress."' target=blank>".$hostname."</a></td>"; }
      
      





コードは急いで書かれましたが、動作します。 また、「IPアドレスのユーザーのトラフィック」というレポートが開かれたときに機能します。ほとんどの場合、個人的にそのようなレポートのみが必要です。 必要に応じて、他のレポートに同様のコードを追加できます。



コード自体は非常に単純です。最初に、テーブルに現在表示されているリソースを判断します:HTTPまたはHTTPS。HTTPS( ":"記号の存在によって判断される)の場合、IPアドレスをポートから分離し、IPアドレスをgethostスクリプトに渡します.sh 、スクリプト出力をIPアドレスに関する情報の形式で取得し、画面に表示します。



すぐにデータベースに必要なデータを入力する考えがありましたが、データベースを埋める段階で上記の方法で解決すると、コーヒー飲料を飲む長いプロセスにつながるので、私はそれを拒否しました。



そうそう、スクリプトはScreen Squidパーサーが配置されているサーバーと同じサーバー上にある必要があります。 さて、これはそうです、ところで。



このスクリプトの改善、改良、変更のための提案があれば、喜んで聞きます。



追加:


仲間のkboolがここで正しく指摘しているように、私は少し違ったやり方をしまし 。 そこから情報を読み取ることで、目的のホストのSSL証明書データをPHPから直接取得できます。 以下は、上記の代わりにreports.phpに挿入する必要があるコードです。

 //, HTTPS      (   ':') //  ,   HTTP ,     $dv=strpos($line[0], ":") ; if ($dv < 1) { echo "<td><a href='http://".$line[0]."' target=blank>".$line[0]."</a></td>"; } else { //      ':' ,   HTTPS ,  //  "" ... //  IP    , ..    ':' $str1=strpos($line[0], ":"); $row1=substr($line[0], 0, $str1); $ipaddress = ltrim($ipaddress); $ipaddress = $row1; //   IP  /////////////////////////////////////////////////////////// $options = array( "ssl" => array( "capture_peer_cert" => true, "capture_peer_chain" => true, "capture_peer_cert_chain" => false, "verify_peer" => false, "verify_peer_name" => false, "allow_self_signed" => false ) ); $get = stream_context_create($options); $read = stream_socket_client("ssl://".$ipaddress.":443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get); $cert = stream_context_get_params($read); $certinfo = openssl_x509_parse($cert['options']['ssl']['peer_certificate']); $certinfo = $certinfo['name']; $CN=strpos($certinfo,"CN=")+3; $CN_end=strlen($certinfo); $hostname = substr($certinfo, $CN, $CN_end); //////////////////////////////////////////////////////////// //       IP  echo "<td><a href='https://".$ipaddress."' target=blank>".$hostname."</a></td>"; }
      
      






All Articles