# nslookup и drill: DNS-разрешение в терминале

Индекс LLMS: [llms.txt](/llms.txt)

---

Сервер не резолвит домен, а пинги летят. Привычный dig под рукой нет — в BIOS уже грузится минимальный busybox. Или на хосте без bind-tools. nslookup и drill закрывают эту щель: первый встроен почти везде, второй даёт больше контекста при отладке.

## nslookup: интерактивный и однострочный режим

nslookup входит в состав bind-utils и isc-dhcp-client. Работает в двух режимах.

Однострочный запрос:

```
nslookup example.com
nslookup example.com 8.8.8.8
```

Интерактивный режим запускается без аргументов. Типичная сессия:

```
$ nslookup
> server 1.1.1.1
Default server: 1.1.1.1
Address: 1.1.1.1#53
> set type=MX
> example.com
Server:         1.1.1.1
Address:        1.1.1.1#53

example.com     mail exchanger = 10 mx1.example.com.
> exit
```

Переключение сервера внутри сессии меняет ресолвер только для этого запроса. Если нужен постоянный ресолвер — правь `/etc/resolv.conf`.

## Типы DNS-записей в запросах

По умолчанию nslookup запрашивает A-запись. Для остального используется `set type=`:

| Тип записи | Назначение | Пример вывода |
|------------|------------|---------------|
| A | IPv4-адрес | `93.184.216.34` |
| AAAA | IPv6-адрес | `2606:2800:220:1::` |
| MX | Почтовый обменник | `10 mail.example.com` |
| TXT | Текстовые записи, SPF | `v=spf1 include:_spf.example.com ~all` |
| NS | Авторитативные серверы | `a.iana-servers.net` |
| SOA | Start of Authority | serial 2005080901 |
| CNAME | Каноническое имя | `example.com canonical name = www.example.com` |
| PTR | Обратное разрешение | `34.216.184.93.in-addr.arpa name = example.com` |

Однострочный эквивалент — флаг `-type=`:

```
nslookup -type=ANY example.com
nslookup -type=MX github.com
```

> [!WARNING]
> Запросы `ANY` часто блокируются на уровне resolver. Рекурсор вернёт SERVFAIL или пустой ответ. Не полагайтесь на ANY при диагностике.

## drill: вывод с типом Resource Record

drill — часть ldns. Выдаёт результат в классическом DNS-формате с секциями ANSWER, AUTHORITY, ADDITIONAL:

```
drill A example.com
drill MX github.com @1.1.1.1
```

Вывод drill читабельнее при разборе цепочки CNAME:

```
$ drill CNAME www.cloudflare.com
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDRIBUTE: 0

;; QUESTION SECTION:
;www.cloudflare.com.   IN   CNAME

;; ANSWER SECTION:
www.cloudflare.com.  300  IN  CNAME  cloudflare.com.

;; AUTHORITY SECTION:
;; ADDITIONAL SECTION:
```

Без флага `@server` drill берёт ресолвер из `/etc/resolv.conf`.

## DNSSEC-валидация

drill проверяет цепочку доверия DNSSEC:

```
drill -S _dmarc.example.com TXT @1.1.1.1
```

Флаг `-S` запрашивает DS-запись выше по цепочке и валидирует подпись. При невалидной цепочке:

```
drill: RRSIG validation failed: Signature has expired
```

nslookup DNSSEC не валидирует — только отправляет запросы с флагом DO (добавить RRSIG в ответ). Для полноценной валидации нужен drill или `delv`.

## NXDOMAIN и SERVFAIL: разбор кодов ответа

Первый шаг при любой ошибке — посмотреть код ответа.

**NXDOMAIN** (код 3) — домен не существует. Источник: авторитативный сервер зоны. Если `dig +short` возвращает пустоту, а nslookup пишет `** server can't find example.invalid`, это NXDOMAIN. Причины: опечатка в домене, устаревший CNAME, удалённая зона.

**SERVFAIL** (код 2) — ресолвер не смог ответить. Причины: DNSSEC-валидация сломана, превышен таймаут, циклическая ссылка в NS-записях, перегрузка authoritative-сервера. nslookup показывает `** server can't find example.com: Server failed`.

**REFUSED** (код 5) — рекурсор отказался отвечать. Обычно ACL на DNS-сервере или rate limiting.

```
nslookup example.com 10.0.0.1
# Server:  10.0.0.1
# Address: 10.0.0.1#53
# ** server can't find example.com: Server failed
```

## Ключевые флаги nslookup и drill

### nslookup

| Флаг | Действие |
|------|----------|
| `-type=RR` | Тип записи (A, MX, TXT, ANY) |
| `host` | Перенаправление на заданный сервер |
| `-port=53` | Нестандартный порт (например, 5353 для mDNS) |
| `-timeout=5` | Таймаут в секундах |
| `-retry=3` | Количество повторов |
| `-vc` | TCP вместо UDP |

```
nslookup -type=TXT -port=5353 _http._tcp.local 224.0.0.251
```

### drill

| Флаг | Действие |
|------|----------|
| `@server` | Сервер для запроса |
| `-Q` | Тихий режим, только ответ |
| `-T` | Показывать время ответа |
| `-S` | DNSSEC-валидация |
| `-D` | Принудительный DNSSEC (запрос с флагом DO) |
| `-p port` | Нестандартный порт |
| `-t timeout` | Таймаут в секундах |

```
drill -TD -S TXT dkim._domainkey.example.com @8.8.8.8
```

`-T` полезен для сравнения latency между ресолверами:

```
drill A google.com @1.1.1.1
# Query timeout: 2
# Answer received in 45ms
```

## Установка

```
# Debian / Ubuntu
apt install dnsutils ldnsutils

# RHEL / CentOS / Fedora
dnf install bind-utils ldns

# Alpine
apk add bind-tools ldns
```

В минимальных образах busybox уже содержит упрощённый nslookup. Полный набор функций доступен после установки dnsutils.
