Глава 7. Сетевые условия¶
Сетевые условия позволяют фильтровать трафик по IP-адресам и портам клиента, прокси-сервера и целевого сервера, а также по сетевому интерфейсу приёма запроса.
7.1. client.address=¶
Проверяет IP-адрес клиента. Выражение может содержать IP-адрес, подсеть, диапазон или метку блока define subnet.
Примечание: Если пользователь подключён к прокси через explicit proxy, политика слоя
<Proxy>применяется даже если URL назначения — административный адрес самого прокси. Поэтому административные правила рекомендуется также дублировать в слое<Admin>. При использованииclient.address=в слое<Admin>клиенты, подключённые через explicit proxy, будут иметь IP-адрес, установленный в IP-адрес прокси.
Синтаксис:
где:
- ip_address — IP-адрес клиента, например
10.25.198.0 - ip_address_range — диапазон IP-адресов, например
192.0.2.0..192.0.2.255 - subnet — подсеть в CIDR-нотации, например
10.25.198.0/24 - subnet_label — метка блока
define subnet, объединяющего несколько IP-адресов или подсетей
Примечание: IP-адресные wildcard вида
10.25.*.0(с подстановочными символами в октетах) не поддерживаются. Используйте CIDR-нотацию или блокиdefine subnet.
Слои и транзакции:
- Слои: Admin, Cache, Diagnostics, DNS-Proxy, Exception, Forward, Proxy, SSL, SSL-Intercept
- Недоступно, если транзакция не связана с клиентом
Пример 1
Заблокировать рабочую станцию:
Пример 2
Выбрать realm аутентификации в зависимости от подсети клиента:
<Admin>
client.address=10.25.198.0/24 authenticate(LDAPRealm)
client.address=10.25.199.0/24 authenticate(NTLMRealm)
authenticate(LocalRealm) ; все остальные
См. также:
- Условия:
client.interface=,client.protocol=,proxy.address=,proxy.port= - Определения:
define subnet
7.2. source.port=¶
Проверяет порт, с которого клиент устанавливает соединение.
Синтаксис:
Слои и транзакции:
- Слои: Admin, DNS-Proxy, Forward, Proxy, SSL, SSL-Intercept
- Транзакции: все прокси-транзакции
Пример
Проверить подключения клиента на порту 8080:
См. также:
- Условия:
client.address=,proxy.port=,server.port=
7.3. client.protocol=¶
Проверяет протокол, используемый между клиентом и прокси.
Синтаксис:
где:
- protocol — один из поддерживаемых протоколов:
http|https|ftp|tcp|socks|ssl|dns
Реализовано в Redcoat: -
http— plain HTTP proxy request (GET/POST через прокси-порт) -https— HTTPS через CONNECT tunnel (включая MITM inner HTTP)Планируется:
tcp(CONNECT bypass без MITM),ssl(transparent TLS),socks(SOCKS proxy),dns(DNS proxy). Остальные протоколы (ftp,rtsp,mms,sipи др.) — не актуальны для текущей архитектуры.Примечания: -
tcpобозначает туннелированную транзакцию (CONNECT без SSL interception). -client.protocol=dnsдопустимо только в слое<DNS-Proxy>. - Возвращает false, если транзакция не связана с клиентом. - Поддерживается отрицание:client.protocol=!https, списки:client.protocol=(http https).
Слои и транзакции:
- Слои: Exception, Forward, Proxy, SSL, SSL-Intercept
- Транзакции: все прокси-транзакции
- Возвращает false, если транзакция не связана с клиентом
Пример
Отключить определение протокола для указанного домена и разрешить только SSL-транзакции:
<Proxy>
url.domain=example.com client.protocol=ssl allow
url.domain=example.com client.protocol!=ssl deny
См. также:
- Условия:
client.address=,client.interface=,proxy.address=,proxy.port=
7.3a. has_client=¶
Проверяет, связана ли транзакция с клиентским соединением. Условие истинно (yes), если у транзакции есть клиент (обычный прокси-запрос от клиента), и ложно (no) для транзакций без клиента — например, фоновых или некоторых служебных DNS-транзакций, выполняемых без участия клиентского соединения.
Полезно для написания правил, которые должны применяться только к транзакциям без клиента (или, наоборот, исключать их).
Имя как в BlueCoat.
Синтаксис:
where:
yes— транзакция связана с клиентским соединением;no— транзакция не связана с клиентом.
Слои и транзакции: все прокси-транзакции.
Пример:
См. также: client.address= (7.1), client.protocol= (7.3).
7.4. proxy.address=¶
Проверяет IP-адрес назначения входящего IP-пакета.
Если запрос отправлен через explicit proxy, проверяется IP-адрес, который клиент использовал для подключения к прокси. IP-адрес назначения — это либо IP-адрес сетевого интерфейса, на котором принят запрос, либо виртуальный IP-адрес. Это условие предназначено для ситуаций, когда прокси имеет несколько виртуальных IP-адресов.
Если запрос был прозрачно перенаправлен, проверяется IP-адрес назначения из IP-пакета.
Синтаксис:
где:
- ip_address — IP-адрес или подсеть, например
10.25.198.0/24 - ip_address_range — диапазон, например
192.0.2.0..192.0.2.255 - subnet_label — метка блока
define subnet
Слои и транзакции:
- Слои: Admin, DNS-Proxy, Exception, Forward, Proxy, SSL, SSL-Intercept
- Транзакции: HTTP прокси
Пример
Запретить обслуживание через прокси в подсети 1.2.3.x:
См. также:
- Условия:
client.address=,client.interface=,client.protocol=,proxy.port=
7.5. proxy.port=¶
Проверяет IP-порт, используемый запросом, в пределах указанного диапазона или на точное совпадение. Условие proxy.port= не может содержать пробелов.
Если запрос отправлен через explicit proxy, проверяется IP-порт, который клиент использовал для подключения к прокси.
Если запрос был прозрачно перенаправлен, proxy.port= проверяет порт, к которому клиент считает, что подключается — порт целевого сервера или OCS. Если клиент подключается напрямую к OCS, а транзакция прозрачно перенаправлена, и порт в запросе клиента соответствует и не подделан, то proxy.port= и server_url.port= проверяют одно и то же значение.
Примечание: Тестировать можно только порты прокси, которые настроены и активны. Например, если transparent FTP на порту 21 не настроен или отключён, правило
proxy.port=21не будет иметь эффекта.
Синтаксис:
где:
- range — диапазон портов, например
8080..8082. Значения от 1 до 65535 - port_number — номер порта, например
80. Значения от 1 до 65535
Слои и транзакции:
- Слои: Admin, DNS-Proxy, Exception, Forward, Proxy, SSL, SSL-Intercept
- Транзакции: все прокси-транзакции
Пример
Запретить URL через диапазон портов:
См. также:
- Условия:
client.address=,client.interface=,client.protocol=,proxy.address=
7.6. client.interface=¶
Проверяет сетевой интерфейс, на котором был принят (обслужен) клиентский запрос. Позволяет применить политику ко всему трафику, пришедшему на конкретный физический/виртуальный интерфейс прокси.
Синтаксис (значение — платформенное имя интерфейса):
Отличие от BlueCoat (платформенная адаптация). BlueCoat ProxySG адресует интерфейсы как adapter:interface.vlan (например 0:0.345) — это hardware-нумерация аплайнса. У Redcoat (Linux/OSv) такого нет; значением служит имя интерфейса ОС: lo, eth0, а VLAN-под-интерфейсы — eth0.345 (у них собственный IP, поэтому резолвятся естественно). Условие и семантика идентичны BlueCoat, отличается только формат значения. Парсер принимает произвольную строку.
Как определяется. Клиент подключается к одному из локальных IP-адресов прокси; этот локальный адрес принадлежит ровно одному интерфейсу. Redcoat сопоставляет локальный IP-адрес имени интерфейса по снимку сетевых интерфейсов системы. Снимок берётся на первом соединении (изменение набора интерфейсов в процессе работы требует перезапуска).
Слои и транзакции:
- Слои: Admin, Exception, Forward, Proxy, SSL, SSL-Intercept, Tenant
- Транзакции: все прокси-транзакции
Пример
Разрешить трафик, пришедший на eth1, только к internal.corp; запретить всё остальное на этом интерфейсе:
Поведение: клиент подключается к 127.0.0.1 → запрос обслужен на lo → client.interface=lo deny возвращает 403, а client.interface=<несуществующий> deny возвращает 200 (условие не реагирует на любой трафик).
См. также:
- Условия:
client.address=,client.protocol=,has_client=,proxy.address=,proxy.port= client.interface.routing_domain=— пока не реализовано (требуется источник данных о маршрутных доменах).
7.7. url.address= / server_url.address= — IP origin-сервера¶
Проверяют IP-адрес целевого (origin) сервера — резолв хоста из URL. server_url.address= — то же для server URL (после rewrite/forwarding). Имена как в BlueCoat. (Прежнее server.address= Redcoat удалено — это был дубль url.address на то же поле; используйте url.address=.)
Что тестируется (как в BlueCoat): IP-адрес сервера, с которого получают контент. Типичный сценарий — блокировка/маршрутизация по IP назначения или подсети.
Где надёжно: transparent-режим (адрес известен из перехвата) и explicit с IP-таргетом. В explicit-режиме с доменным таргетом IP назначения на ранней фазе ещё не резолвлен — фильтруйте по
url.host=/url.domain=. Чтобы матчить адрес самого прокси (VIP/интерфейс), используйтеproxy.address=(это другая сущность — см. 7.4).
Синтаксис:
url.address={ip_address|ip_address_range|ip_address_wildcards|subnet|subnet_label}
server_url.address={...}
где:
- ip_address — IP-адрес, например
8.8.8.8 - ip_address_range — диапазон, например
10.0.0.1..10.0.0.255 - subnet — подсеть, например
10.0.0.0/8 - subnet_label — метка блока
define subnet
Слои и транзакции: <Proxy>, <Forward>, <SSL>, <Exception>. Все прокси-транзакции.
Пример — запретить доступ к внутренним серверам по IP назначения:
define subnet internal_servers
10.100.0.0/24
10.100.1.0/24
end
<Proxy>
url.address=internal_servers authenticated=no deny
См. также:
- Условия:
client.address=,proxy.address=(адрес прокси, 7.4),server.port=,url.host=
7.8. server.port=¶
Расширение Redcoat. В BlueCoat выделенного условия для TCP-порта назначения нет (
server.port=проверяет порт назначения TCP-соединения, отдельное поле). BlueCoat-альтернативы для порта сервера:url.port=/server_url.port=(порт из URL, работают в обоих режимах);proxy.port=— порт самого прокси (другая сущность).Где надёжно: transparent-режим (порт известен из перехвата) и explicit с IP-таргетом. В explicit с доменным таргетом порт назначения на ранней фазе не определён — используйте
url.port=/server_url.port=.
Проверяет фактический порт назначения TCP-соединения (origin), отдельно от порта в URL.
- Transparent proxy: порт целевого сервера (original destination port).
- Explicit proxy: порт самого прокси.
Для фильтрации по порту сервера в explicit-режиме с доменным таргетом используйте
url.port=/server_url.port=.
Синтаксис:
где:
- range — диапазон портов, например
80..8080. Значения от 1 до 65535 - port_number — номер порта, например
443. Значения от 1 до 65535
Слои и транзакции:
- Слои: Exception, Forward, Proxy, SSL
- Транзакции: все прокси-транзакции
- В explicit-режиме с доменным таргетом значение может быть placeholder — используйте
url.port=
Пример
Заблокировать нестандартные порты в transparent режиме:
; Работает корректно только в transparent proxy режиме
<Proxy>
server.port=(80, 443, 8080, 8443) allow
deny
См. также:
- Условия:
client.address=,proxy.port=,source.port=,url.port=
7.9. client.interface.routing_domain=¶
Примечание: Условие распознаётся синтаксически, но пока не применяется: данные о маршрутном домене не заполняются, поэтому условие никогда не срабатывает (безопасное поведение). Будет включено при поддержке маршрутных доменов.
Проверяет имя routing domain (виртуального маршрутного пространства) входящего интерфейса клиента. Используется для сегментации политики по виртуальным маршрутным доменам.
Синтаксис:
Допустимые слои: <Proxy>, <Admin>.
Примеры:
<Proxy>
client.interface.routing_domain=guest_net deny
client.interface.routing_domain=corp_net allow
См. также: client.interface= (раздел 7.6).