Перейти к содержанию

Глава 7. Сетевые условия

Сетевые условия позволяют фильтровать трафик по IP-адресам и портам клиента, прокси-сервера и целевого сервера, а также по сетевому интерфейсу приёма запроса.

7.1. client.address=

Проверяет IP-адрес клиента. Выражение может содержать IP-адрес, подсеть, диапазон или метку блока define subnet.

Примечание: Если пользователь подключён к прокси через explicit proxy, политика слоя <Proxy> применяется даже если URL назначения — административный адрес самого прокси. Поэтому административные правила рекомендуется также дублировать в слое <Admin>. При использовании client.address= в слое <Admin> клиенты, подключённые через explicit proxy, будут иметь IP-адрес, установленный в IP-адрес прокси.

Синтаксис:

client.address={ip_address|ip_address_range|subnet|subnet_label}

где:

  • 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

Заблокировать рабочую станцию:

<Proxy>
    client.address=10.25.198.0 deny

Пример 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=

Проверяет порт, с которого клиент устанавливает соединение.

Синтаксис:

source.port=port_number

Слои и транзакции:

  • Слои: Admin, DNS-Proxy, Forward, Proxy, SSL, SSL-Intercept
  • Транзакции: все прокси-транзакции

Пример

Проверить подключения клиента на порту 8080:

<Admin>
    source.port=8080

См. также:

  • Условия: client.address=, proxy.port=, server.port=

7.3. client.protocol=

Проверяет протокол, используемый между клиентом и прокси.

Синтаксис:

client.protocol=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.

Синтаксис:

has_client={yes|no}

where:

  • yes — транзакция связана с клиентским соединением;
  • no — транзакция не связана с клиентом.

Слои и транзакции: все прокси-транзакции.

Пример:

<Proxy>
    ; Запретить транзакции без клиентского соединения
    has_client=no force_deny

См. также: client.address= (7.1), client.protocol= (7.3).

7.4. proxy.address=

Проверяет IP-адрес назначения входящего IP-пакета.

Если запрос отправлен через explicit proxy, проверяется IP-адрес, который клиент использовал для подключения к прокси. IP-адрес назначения — это либо IP-адрес сетевого интерфейса, на котором принят запрос, либо виртуальный IP-адрес. Это условие предназначено для ситуаций, когда прокси имеет несколько виртуальных IP-адресов.

Если запрос был прозрачно перенаправлен, проверяется IP-адрес назначения из IP-пакета.

Синтаксис:

proxy.address={ip_address|ip_address_range|subnet|subnet_label}

где:

  • 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:

<Proxy>
    proxy.address=1.2.3.0/24 deny

См. также:

  • Условия: 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 не будет иметь эффекта.

Синтаксис:

proxy.port={range|port_number}

где:

  • range — диапазон портов, например 8080..8082. Значения от 1 до 65535
  • port_number — номер порта, например 80. Значения от 1 до 65535

Слои и транзакции:

  • Слои: Admin, DNS-Proxy, Exception, Forward, Proxy, SSL, SSL-Intercept
  • Транзакции: все прокси-транзакции

Пример

Запретить URL через диапазон портов:

<Proxy>
    url=http://www.example.com proxy.port=8080..8082 deny

См. также:

  • Условия: client.address=, client.interface=, client.protocol=, proxy.address=

7.6. client.interface=

Проверяет сетевой интерфейс, на котором был принят (обслужен) клиентский запрос. Позволяет применить политику ко всему трафику, пришедшему на конкретный физический/виртуальный интерфейс прокси.

Синтаксис (значение — платформенное имя интерфейса):

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; запретить всё остальное на этом интерфейсе:

<Proxy>
    client.interface=eth1 url.domain=internal.corp allow
    client.interface=eth1 force_deny

Поведение: клиент подключается к 127.0.0.1 → запрос обслужен на loclient.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=.

Синтаксис:

server.port={range|port_number}

где:

  • 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 (виртуального маршрутного пространства) входящего интерфейса клиента. Используется для сегментации политики по виртуальным маршрутным доменам.

Синтаксис:

client.interface.routing_domain=<domain_name>

Допустимые слои: <Proxy>, <Admin>.

Примеры:

<Proxy>
    client.interface.routing_domain=guest_net deny
    client.interface.routing_domain=corp_net  allow

См. также: client.interface= (раздел 7.6).