У меня есть очень примитивный сервер имен, написанный на Python, который использует только socket
и dnslib
, в основном предназначенные для ответов на запросы Let's Encrypt DNS-01, а также пару записей A для экспериментальных целей.
Мой вопрос в том, что должен ответить сервер имен, когда запрос достигает сервера, но он не содержит соответствующих данных, на которые сервер хочет ответить?
Должен ли он просто игнорировать это?
Я спрашиваю, потому что получаю запросы на ANY leth.cc
, которые, по-видимому, используются для атак с усилением DNS. Прежде чем заметить это, я отвечал на запросы с пустым разделом ответов, теперь я ничего не отправляю обратно по указанному адресу.
Я изменил с
data, addr = sock_dns.recvfrom(1024)
q = dnslib.DNSRecord.parse(data)
a = q.reply()
# add an answer if query is relevant
# a.add_answer(*dnslib.RR.fromZone(qname + " 30 IN TXT " + verification_code))
sock_dns.sendto(a.pack(), addr)
to
data, addr = sock_dns.recvfrom(1024)
q = dnslib.DNSRecord.parse(data)
a = q.reply()
# add an answer if query is relevant
# a.add_answer(*dnslib.RR.fromZone(qname + " 30 IN TXT " + verification_code))
if len(a.rr) > 0:
sock_dns.sendto(a.pack(), addr)
Это приемлемое поведение?
Принимая во внимание ответ Патрика Мевзека, я изменил его на
data, addr = sock_dns.recvfrom(1024)
q = dnslib.DNSRecord.parse(data)
a = q.reply()
# add an answer if query is relevant
# a.add_answer(*dnslib.RR.fromZone(qname + " 30 IN TXT " + verification_code))
if not a.rr:
a.header.rcode = dnslib.RCODE.REFUSED
sock_dns.sendto(a.pack(), addr)
Хотя это может быть правильным ответом для действительных клиентов, при нормальной работе ни один запрос для leth.cc
никогда не должен доходить до сервера, так как нет ничего, указывающего на мой сервер имен, кроме записей NS, которые я настроил в онлайн-интерфейсе конфигурации DNS регистраторов. Это их серверы имен указывают, что клиент должен пойти и попросить мой сервер имен дать ответ на более конкретные запросы, на которые они не могут ответить.
Но в случае запроса leth.cc
, доходящего до моего сервера, этот запрос, скорее всего, исходит из очень необычного источника. Можно ли по-прежнему отвечать на эти запросы с помощью RCODE.REFUSED
, или запрос мог быть подделан таким образом, что addr
содержал адрес, с которым не следует связываться, чтобы избежать DDOS-атаки на этот адрес? В конце концов, это атака усиления; это что-то вроде отраженной DDOS-атаки? Я не возражаю против того, чтобы МОЙ сервер имен подвергался DDOS-атаке (это мое дело решать), я просто не хочу, чтобы он участвовал в ней, если это возможно.
Кроме того, это не разрешающий сервер имен, он не выходит и не запрашивает другие серверы имен, если информация не может быть найдена. Я не вижу ничего плохого в том, чтобы не отвечать на запросы к qnames
, которые не принадлежат этому домену серверов имен.