Глава 17. Условия DNS¶
Условия DNS используются в слое <DNS-Proxy> для фильтрации DNS-запросов и ответов. Они позволяют реализовать DNS-firewall: блокировку вредоносных доменов, перехват определённых типов записей, контроль DNS-ответов.
В BlueCoat условия DNS описаны в разделе DNS-Proxy Layer.
Обработка DNS-трафика в процессе реализации
Все условия этой главы принимаются (политика загружается), однако обработка
DNS-трафика (заполнение DNS-контекста запроса/ответа) ещё не реализована.
Фактически сейчас работают: dns.request.name= (сопоставляется с именем хоста
запроса) и dns.request.type= (только значение A). Остальные условия не
сработают до завершения реализации.
17.1. dns.request.name — запрашиваемое доменное имя¶
Проверяет доменное имя в DNS-запросе. Поддерживает точное совпадение, wildcard-шаблоны и списки доменов. Это основное условие для реализации DNS-firewall и блокировки вредоносных доменов.
Особенность реализации: условие сопоставляется с именем хоста запроса (общее поле с
url.host), а не с отдельным QNAME DNS-пакета. В слое<DNS-Proxy>это эквивалентно; в HTTP-слоях условие совпадёт с хостом URL.
Синтаксис:
Где: domain_name -- доменное имя. Поддерживает wildcard (*), подстроки, списки.
Тип значения: строковый (поддерживает wildcard, списки, подстроки).
Допустимые слои: <DNS-Proxy>
Примеры:
<DNS-Proxy>
; Блокировка вредоносных доменов
dns.request.name=malware.example.com deny
; Wildcard: все поддомены
dns.request.name=*.evil.com deny
; Список доменов
dns.request.name=(malware.com, phishing.net, exploit.org) deny
; Перенаправление DNS для внутренних доменов
dns.request.name=*.corp.example.com dns.respond(10.0.0.1)
См. также: dns.request.type (17.2), dns.nxdomain (17.6).
17.2. dns.request.type — тип DNS-запроса¶
Проверяет тип записи (QTYPE) в DNS-запросе. Позволяет фильтровать запросы по типу: например, блокировать запросы ANY (часто используемые в DNS amplification атаках) или ограничить разрешённые типы записей.
Синтаксис:
Где: record_type -- тип DNS-записи (регистронезависимый).
Допустимые значения: A, AAAA, CNAME, MX, TXT, NS, SOA, PTR, SRV, CAA, ANY (или *).
Ограничение: до завершения обработки DNS-трафика тип запроса в контексте фиксирован значением
A— фактически совпадает толькоdns.request.type=A(и списки, его содержащие).
Разделители в списке: пробел, запятая или | (pipe).
Тип значения: список типов DNS-записей.
Допустимые слои: <DNS-Proxy>
Примеры:
<DNS-Proxy>
; Блокировка DNS ANY запросов (anti-amplification)
dns.request.type=ANY deny
; Разрешить только A и AAAA
dns.request.type=(A, AAAA) allow
deny
; Блокировка TXT запросов (часто используются для DNS tunneling)
dns.request.type=TXT deny
; Альтернативный синтаксис с pipe
dns.request.type=(A|AAAA|CNAME) allow
См. также: dns.request.name (17.1), dns.response.address (17.3).
17.3. dns.response.a= — IP-адрес (A-запись) в DNS-ответе¶
В процессе реализации. Условие принимается, но оценка DNS-ответа ещё не выполняется — правило с этим условием не сработает.
Проверяет IPv4-адрес (A-запись), возвращённый в DNS-ответе. Поддерживает одиночные адреса, CIDR-нотацию и именованные подсети (определённые через define subnet). Назначение — обнаружение DNS rebinding атак и блокировка ответов, указывающих на внутренние адреса. Для IPv6 (AAAA) — отдельное условие dns.response.aaaa=.
Принимаемые имена (эквивалентны): dns.response.a= — основное имя (как в BlueCoat); dns.response.address= — алиас Redcoat.
Синтаксис:
dns.response.a=ip_address
dns.response.a=ip_network/prefix
dns.response.a=subnet_name
dns.response.address=... ; алиас Redcoat
Где: ip_address -- IPv4 или IPv6 адрес, CIDR-нотация или имя подсети из define subnet.
Тип значения: IP-адрес (поддерживает CIDR, подсети, списки).
Допустимые слои: <DNS-Proxy>
Примеры:
<DNS-Proxy>
; Защита от DNS rebinding: блокировка ответов с внутренними адресами
dns.response.address=127.0.0.0/8 deny
dns.response.address=10.0.0.0/8 deny
dns.response.address=192.168.0.0/16 deny
dns.response.address=172.16.0.0/12 deny
; Блокировка ответов с определённого сервера
dns.response.address=203.0.113.50 deny
См. также: dns.response.cname (17.4), dns.resolved (17.5).
17.4. dns.response.cname — CNAME в DNS-ответе¶
В процессе реализации. Условие принимается, но оценка DNS-ответа ещё не выполняется — правило с этим условием не сработает.
Проверяет каноническое имя (CNAME) в DNS-ответе. Позволяет фильтровать цепочки CNAME-перенаправлений.
Синтаксис:
Где: domain_name -- доменное имя. Поддерживает wildcard и списки.
Тип значения: строковый (поддерживает wildcard, списки, подстроки).
Допустимые слои: <DNS-Proxy>
Примеры:
<DNS-Proxy>
; Блокировка CNAME-перенаправлений на нежелательные CDN
dns.response.cname=*.evil-cdn.com deny
; Логирование CNAME цепочек
dns.response.cname=*.cloudfront.net access_log(yes)
См. также: dns.response.address (17.3), dns.request.name (17.1).
17.5. dns.resolved — результат DNS-разрешения¶
Расширение Redcoat. В BlueCoat данное условие отсутствует (близкое —
dns.response.code=).В процессе реализации. Зависит от обработки DNS-трафика (код ответа в контексте пока не заполняется) — правило с этим условием не сработает.
Проверяет, завершился ли DNS-запрос успешно (получен ответ от upstream DNS-сервера). Позволяет применять отдельные политики к запросам, которые не удалось разрешить.
Синтаксис:
Где:
- yes -- DNS-запрос вернул успешный ответ (RCODE = NOERROR).
- no -- DNS-запрос завершился ошибкой (timeout, SERVFAIL и т.д.).
Тип значения: логический (yes/no).
Допустимые слои: <DNS-Proxy>
Примеры:
<DNS-Proxy>
; Логировать неудачные DNS-запросы
dns.resolved=no access_log(yes)
; Применить действие только к успешно разрешённым запросам
dns.resolved=yes dns.request.name=*.corp.local allow
См. также: dns.nxdomain (17.6), dns.response.address (17.3).
17.6. dns.nxdomain — домен не существует (NXDOMAIN)¶
Расширение Redcoat. В BlueCoat данное условие отсутствует (эквивалент —
dns.response.code=NXDOMAIN).В процессе реализации. Зависит от обработки DNS-трафика — правило с этим условием не сработает.
Проверяет, вернул ли DNS-сервер ответ NXDOMAIN (Non-Existent Domain, RCODE 3). Этот код означает, что запрашиваемый домен не зарегистрирован. Условие отличается от dns.resolved=no, которое покрывает все ошибки разрешения, включая таймауты и SERVFAIL.
Синтаксис:
Где:
- yes -- DNS-ответ содержит RCODE = NXDOMAIN (домен не существует).
- no -- DNS-ответ не является NXDOMAIN.
Тип значения: логический (yes/no).
Допустимые слои: <DNS-Proxy>
Примеры:
<DNS-Proxy>
; Перенаправить NXDOMAIN на страницу-заглушку
dns.nxdomain=yes dns.respond(10.0.0.1)
; Логировать запросы к несуществующим доменам (детекция DGA malware)
dns.nxdomain=yes access_log(yes)
См. также: dns.resolved (17.5), dns.request.name (17.1).
17.7. Прочие условия DNS (принимаются, в процессе реализации)¶
В процессе реализации. Все условия этого раздела принимаются (политика загружается; имена как в BlueCoat), но до завершения обработки DNS-трафика не сработают.
dns.client_transport={TCP|UDP} ; транспорт DNS-запроса клиента
dns.request.address=ip|subnet ; адрес в reverse (PTR) запросе
dns.request.class={IN|CH|HS} ; класс DNS-запроса
dns.request.opcode={QUERY|IQUERY|STATUS}
dns.request.category=(категории) ; категоризация запрашиваемого имени
dns.response.aaaa=значение ; AAAA-записи (IPv6) в ответе
dns.response.code={NOERROR|NXDOMAIN|SERVFAIL|REFUSED|FORMERR|NOTIMP}
dns.response.nodata={yes|no} ; ответ без записей запрошенного типа
dns.response.ptr=имя ; PTR-записи в ответе
Значения
dns.client_transportиdns.response.codeрегистронезависимы. Набор кодовdns.response.codeпока ограничен шестью перечисленными.