🌐 Как проверить и мониторить Tinyproxy в качестве HTTP-прокси |

🌐 Как проверить и мониторить Tinyproxy в качестве HTTP-прокси

Мануал

Tinyproxy – это легкий, но мощный HTTP-прокси с открытым исходным кодом, который можно использовать как в качестве прямого (исходящего), так и обратного (входящего) HTTP-прокси.

Одной из главных особенностей является использование фильтров, которые могут служить в качестве списка разрешенных или заблокированных доменов.

Чтобы правильно контролировать Tinyproxy (используемый в качестве прямого прокси), необходимо обратить внимание на несколько вещей.

🛡️ Как использовать обратный прокси Nginx для ограничения внешних вызовов внутри веб-браузера

Проверка HTTP через прокси

Давайте начнем с самой важной проверки: Фактическая проверка HTTP, которая проходит через форвардный прокси, создавая исходящее HTTP-соединение с местом назначения.

К счастью, плагин мониторинга check_http, который входит в пакет monitoring-plugins на Debian и Ubuntu и в пакет nagios-plugins на RedHat и производных, позволяет использовать прокси.

Хитрость заключается в изменении метода запроса (параметр -j).

Вместо более распространенного метода GET или POST здесь используется метод CONNECT.

 -j, –method=STRING  (for example: HEAD, OPTIONS, TRACE, PUT, DELETE, CONNECT, CONNECT:POST)
Set HTTP method.

Вывод –help для check_http должен даже показать реальный пример использования check_http с прокси:

  CHECK SSL WEBSERVER CONTENT VIA PROXY USING HTTP 1.1 CONNECT:
check_http -I 192.168.100.35 -p 80 -u https://www.verisign.com/ -S -j CONNECT -H www.verisign.com
all these options are needed: -I <proxy> -p <proxy-port> -u <check-url> -S(sl) -j CONNECT -H <webserver>

Для мониторинга собственного через Proxy:

/usr/lib/nagios/plugins/check_http -I 127.0.0.1 -p 8888 -u https://www.itsecforu.ru/ -S -j CONNECT -H www.itsecforu.ru
HTTP OK: HTTP/1.1 200 OK -- 34990 bytes in 0.063 second response time |time=0.062641s;;;0.000000;10.000000 size=34990B;;;0

В данной ситуации Tinyproxy прослушивает 127.0.0.1:8888.

Использование check_http полезно для добавления этой автоматической проверки в программу мониторинга, такую как Nagios или Icinga.

В качестве альтернативы (вручную) можно использовать curl, чтобы быстро проверить, работает ли HTTP-запрос через прокси. Из man-страницы curl:

      -x, –proxy [protocol://]host[:port] Use the specified proxy.

The proxy string can be specified with a protocol:// prefix. No protocol specified or http:// will be
treated as HTTP proxy. Use socks4://, socks4a://, socks5:// or socks5h:// to request a specific SOCKS
version to be used.  (The protocol support was added in curl 7.21.7)

HTTPS proxy support via https:// protocol prefix was added in 7.52.0 for OpenSSL, GnuTLS and NSS.

В следующем примере мы используем curl через Tinyproxy (опять же, слушая 127.0.0.1:8888) и отправляю запрос HEAD (-I) в свой блог:

curl --proxy http://127.0.0.1:8888 https://www.claudiokuenzler.com -I
HTTP/1.0 200 Connection established
Proxy-agent: tinyproxy/1.10.0
HTTP/2 200
server: nginx
date: Thu, 15 Dec 2022 06:43:00 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
strict-transport-security: max-age=63072000

Последим за логами

Лог-файл Tinyproxy (по умолчанию находится в /var/log/tinyproxy/tinyproxy.log) содержит важную информацию о соединениях.

Он также показывает, был ли заблокирован (отфильтрован) целевой домен.

По умолчанию в журнале не отображается много информации, только при установке уровня LogLevel не ниже NOTICE можно увидеть важные события журнала.

 $ grep ^LogLevel /etc/tinyproxy/tinyproxy.conf
LogLevel Info

Если Tinyproxy испытывает большую нагрузку (много одновременных соединений), может потребоваться увеличить количество одновременных серверов Tinyproxy (дочерних процессов) или увеличить количество одновременных соединений.

Записи в логах, такие как «Ожидающие серверы» или подобные, являются такими событиями в журнале.

tail -f /var/log/tinyproxy/tinyproxy.log
NOTICE    Dec 15 07:08:26 [3999474]: Waiting servers (21) exceeds MaxSpareServers (20). Killing child.
NOTICE    Dec 15 07:08:26 [4021250]: Waiting servers (21) exceeds MaxSpareServers (20). Killing child.
NOTICE    Dec 15 07:08:26 [4021615]: Waiting servers (21) exceeds MaxSpareServers (20). Killing child.
NOTICE    Dec 15 07:08:31 [1608899]: Waiting servers (0) is less than MinSpareServers (5). Creating new child.
NOTICE    Dec 15 07:08:36 [1608899]: Waiting servers (0) is less than MinSpareServers (5). Creating new child.
NOTICE    Dec 15 07:08:41 [1608899]: Waiting servers (0) is less than MinSpareServers (5). Creating new child.
NOTICE    Dec 15 07:08:46 [1608899]: Waiting servers (0) is less than MinSpareServers (5). Creating new child.
NOTICE    Dec 15 07:08:51 [1608899]: Waiting servers (0) is less than MinSpareServers (5). Creating new child.
NOTICE    Dec 15 07:08:51 [3998401]: Waiting servers (21) exceeds MaxSpareServers (20). Killing child.
NOTICE    Dec 15 07:08:51 [4004268]: Waiting servers (21) exceeds MaxSpareServers (20). Killing child.
NOTICE    Dec 15 07:08:51 [4021297]: Waiting servers (21) exceeds MaxSpareServers (20). Killing child.
NOTICE    Dec 15 07:08:51 [4020932]: Waiting servers (21) exceeds MaxSpareServers (20). Killing child.
NOTICE    Dec 15 07:08:51 [4022756]: Waiting servers (21) exceeds MaxSpareServers (20). Killing child.
NOTICE    Dec 15 07:08:56 [1608899]: Waiting servers (0) is less than MinSpareServers (5). Creating new child.
NOTICE    Dec 15 07:09:01 [1608899]: Waiting servers (0) is less than MinSpareServers (5). Creating new child.
NOTICE    Dec 15 07:09:06 [1608899]: Waiting servers (0) is less than MinSpareServers (5). Creating new child.
NOTICE    Dec 15 07:09:11 [1608899]: Waiting servers (0) is less than MinSpareServers (5). Creating new child.
NOTICE    Dec 15 07:09:16 [1608899]: Waiting servers (0) is less than MinSpareServers (5). Creating new child.
NOTICE    Dec 15 07:09:21 [1608899]: Waiting servers (0) is less than MinSpareServers (5). Creating new child.
NOTICE    Dec 15 07:09:21 [4001896]: Waiting servers (21) exceeds MaxSpareServers (20). Killing child.
NOTICE    Dec 15 07:09:21 [4002820]: Waiting servers (21) exceeds MaxSpareServers (20). Killing child.
NOTICE    Dec 15 07:09:21 [4022676]: Waiting servers (21) exceeds MaxSpareServers (20). Killing child.

Причина также может заключаться в том, что многие HTTP-запросы в данный момент выполняются с задержкой (медленный сайт назначения) и заставляют серверы «зависнуть», пока не будет достигнут тайм-аут Tinyproxy (по умолчанию 300 с).

Внутренняя (лайв) статистика Tinyproxy

Tinyproxy также поставляется с собственным сайтом статистики.

Конфигурационный файл дает подсказку:

 grep stats /etc/tinyproxy/tinyproxy.conf
tinyproxy.stats.
StatHost “tinyproxy.stats”
StatFile “/usr/share/tinyproxy/stats.html”

StatHost – это «внутренний поддельный DNS», который указывает Tinyproxy отображать внутреннюю HTTP-страницу, содержащую статистику в реальном времени. Эта статистика содержит:

  • Количество открытых соединений (лайв значение)
  • Количество запросов (счетчик с момента последнего запуска)
  • Количество неудачных соединений (счетчик с момента последнего запуска)
  • Количество отклонённых соединений (счётчик с момента последнего запуска)
  • Количество отклонённых соединений из-за высокой нагрузки (счётчик с момента последнего запуска)

Статистику можно получить, сделав HTTP запрос к Tinyproxy (например, через веб-сервер) и запросив домен, настроенный в StatHost (по умолчанию: tinyproxy.stats):

  $ curl -H “Host: tinyproxy.stats” http://127.0.0.1:8888
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN” “http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en”>
<head>
<title>tinyproxy version 1.10.0 run-time statistics</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
<style type=”text/css” media=”screen”>
<!--/*--><![CDATA[<!--*/
th, td
text-align: left;
padding: 0.5em;
border: 1px solid gray;
}
/*]]>*/-->
</style>
</head>
<body>
<h1>tinyproxy version 1.10.0 run-time statistics</h1>
<table>
<tr>
<th>Name</th>
<th>Value</th>
</tr>
<tr>
  <td>Number of open connections</td>
<td>1</td>
</tr>
<tr>
  <td>Number of requests</td>
<td>191</td>
</tr>
<tr>
  <td>Number of bad connections</td>
<td>2</td>
</tr>
<tr>
  <td>Number of denied connections</td>
<td>2</td>
</tr>
<tr>
  <td>Number of refused connections due to high load</td>
<td>0</td>
</tr>
</table>
<hr />
<p><em>Generated by <a href=”https://tinyproxy.github.io/”>tinyproxy</a> version 1.10.0.</em></p>
</body>
</html>

Как видно из вывода, это HTML-вывод, содержащий таблицы и красиво отформатированные для человеческого глаза столбцы.

Если вы хотите (автоматически) разобрать этот вывод, то лучше использовать вывод в формате JSON.

Но этот HTML-вывод может быть изменен. Шаблон, который будет использоваться, можно задать в конфигурации Tinyproxy с помощью опции StatFile.

Скопировав и изменив существующий шаблон, вы можете легко создать более удобный для разбора вывод, например JSON. Обратите внимание, что для того, чтобы «обмануть Tinyproxy», начальные фигурные скобки должны быть установлены дважды (Tinyproxy использует фигурные скобки для определения внутренних переменных):

cat /usr/share/tinyproxy/stats-json.html
{{ “version”:”{version}”, “open”:{opens}, “requests”:{reqs}, “bad”:{badconns}, “denied”:{deniedconns}, “refused”:{refusedconns} }

Этот новый шаблон (stats-json.html) теперь может быть определен в конфигурации Tinyproxy:

 $ grep StatFile /etc/tinyproxy/tinyproxy.conf
StatFile: The HTML file that gets sent when a request is made
StatFile “/usr/share/tinyproxy/stats-json.html”

И после очередной перезагрузки (/etc/init.d/tinyproxy reload работает, systemctl reload tinyproxy – нет на Debian Bullseye), HTTP-статистика может быть получена в формате JSON:

  $ curl -H “Host: tinyproxy.stats” http://127.0.0.1:8888
{ “version”:”1.10.0″, “open”:1, “requests”:263, “bad”:2, “denied”:2, “refused”:0 }

А с помощью парсера JSON это можно отобразить удобнее:

 $ curl -s -H “Host: tinyproxy.stats” http://127.0.0.1:8888 | jq
{
“version”: “1.10.0”,
“open”: 1,
“requests”: 267,
“bad”: 2,
“denied”: 2,
“refused”: 0
}

Подобный вывод теперь можно добавить в программу мониторинга, например, с помощью плагина для мониторинга check_json или другого.

см. также:

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий