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

Глава 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.

Синтаксис:

dns.request.name=domain_name
dns.request.name=(domain_name, ...)

Где: 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 атаках) или ограничить разрешённые типы записей.

Синтаксис:

dns.request.type=record_type
dns.request.type=(record_type, ...)

Где: 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-перенаправлений.

Синтаксис:

dns.response.cname=domain_name
dns.response.cname=(domain_name, ...)

Где: 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-сервера). Позволяет применять отдельные политики к запросам, которые не удалось разрешить.

Синтаксис:

dns.resolved=yes|no

Где: - 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.

Синтаксис:

dns.nxdomain=yes|no

Где: - 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 пока ограничен шестью перечисленными.