Доопрацювання парсера логів Squid для коректного перегляду відвіданих HTTPS ресурсів

Всім привіт! Я отримував і отримую багато листів від людей з питаннями за Squid, який працює на основі моєї статті. Найбільш часто виникає питання про перегляд логів Squid яким-небудь парсером. Проблема в тому, що версія Squid 3.5.8 з налагодженим прозорим проксированием HTTPS логирует відвідувані HTTPS ресурси не у вигляді доменних імен, а у вигляді IP адрес з портами (прим. 164.16.43.56:443). Відповідно, при перегляді статистики відвідувань замість людської інформації проскакують ці самі IP адреси. Збирати статистику з такими даними досить складно. Я зв'язувався з розробниками Squid з цього приводу, але чіткої відповіді так і не отримав. Єдине, що я з'ясував, нормальне логування працює в більш нових версіях Squid, але на них прозоре проксіювання особисто у мене так і не запрацювала належним чином. Тому виникло питання про те, як зробити резолв IP адрес в самому парсере логів.

Особисто я користуюся парсером Screen Squid, і саме в ньому я вирішив спробувати зробити потрібні зміни. Так як мені подібний резолв буває потрібен просто при роботі в терміналі з Bash, я вирішив весь процес резолва зробити у вигляді скрипта на Bash, а в Screen Squid вже засобами PHP його використовувати, коли це буде потрібно.

Отже, для всього задуманого нам потрібні:

  1. власне, сам парсер Screen Squid (інструкцію по його установці друкувати не буду, все є на оф.сайті).
  2. Grep
  3. Sed
  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;

В принципі, він вже откомментирован, описувати тут особливо й нічого. Ми отримуємо інформацію про IP адресу спочатку за допомогою Nslookup, паралельно фільтруючи висновок команди з допомогою grep і sed, щоб виключити непотрібну інформацію. Щоб не писати купу рядків, були використані можливості grep по включенню кількох умов для вибірки (символи "\|"). Зберігайте скрипт в будь-якому зручному місці, призначайте йому права на виконання. Припустимо, він збережений у /usr/bin під іменем gethost.sh.

Скрипт можна використовувати просто з терміналу:

gethost.sh ip_address 

Далі розповім, як цей скрипт прикрутити до Screen Squid. Припустимо, що встановлений він в /var/www/html. У цій папці буде підпапка reports, де знаходиться файл 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. Ну це так, до слова.

Якщо маєте пропозиції щодо вдосконалення, доробки, переробки даного скрипта, буду радий вислухати.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.