Я запускаю настраиваемую службу DNS на 127.0.0.1:53, и я не хочу, чтобы все запросы проходили через нее, я также хочу, чтобы только эта служба отвечала. Вот где возникает проблема. Моя настройка NAT iptables:
iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53
iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:53
Вот tcpdump меня, пингует ya.ru
:
[root@localhost ~]# tcpdump -nnSXvv -i any udp
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
18:34:15.974227 IP (tos 0x0, ttl 64, id 20601, offset 0, flags [DF], proto UDP (17), length 51)
192.168.0.6.54387 > 127.0.0.1.53: [bad udp cksum 0x3fe0 -> 0x2c11!] 58964+ A? ya.ru. (23)
<data here>
18:34:15.974457 IP (tos 0x0, ttl 64, id 26083, offset 0, flags [DF], proto UDP (17), length 604)
192.168.0.6.56172 > 77.66.84.233.443: [bad udp cksum 0x6533 -> 0x48f0!] UDP, length 576
<data here>
18:34:16.028783 IP (tos 0x0, ttl 57, id 7923, offset 0, flags [none], proto UDP (17), length 204)
77.66.84.233.443 > 192.168.0.6.56172: [udp sum ok] UDP, length 176
<data here>
18:34:16.029127 IP (tos 0x0, ttl 64, id 12032, offset 0, flags [DF], proto UDP (17), length 78)
1.1.1.1.53 > 192.168.0.6.54387: [bad udp cksum 0xc2fb -> 0xc42e!] 58964 q: A? ya.ru. 1/0/1 ya.ru. A 87.250.250.242 ar: . OPT UDPsize=1252 (50)
<data here>
18:34:16.075993 IP (tos 0x0, ttl 64, id 20662, offset 0, flags [DF], proto UDP (17), length 73)
192.168.0.6.38972 > 127.0.0.1.53: [bad udp cksum 0x3ff6 -> 0x7be2!] 32011+ PTR? 242.250.250.87.in-addr.arpa. (45)
<data here>
18:34:16.076448 IP (tos 0x0, ttl 64, id 26142, offset 0, flags [DF], proto UDP (17), length 604)
192.168.0.6.53415 > 77.66.84.233.443: [bad udp cksum 0x6533 -> 0xf1ca!] UDP, length 576
<data here>
18:34:16.186718 IP (tos 0x0, ttl 57, id 7930, offset 0, flags [none], proto UDP (17), length 268)
77.66.84.233.443 > 192.168.0.6.53415: [udp sum ok] UDP, length 240
<data here>
18:34:16.187096 IP (tos 0x0, ttl 64, id 12081, offset 0, flags [DF], proto UDP (17), length 103)
1.1.1.1.53 > 192.168.0.6.38972: [bad udp cksum 0xc314 -> 0xfa7e!] 32011 q: PTR? 242.250.250.87.in-addr.arpa. 1/0/1 242.250.250.87.in-addr.arpa. PTR ya.ru. ar: . OPT UDPsize=1252 (75)
<data here>
1) процесс с локальным портом 54387 отправляет запрос, и он перенаправляется на 127.0.0.1:53, как ожидалось
2) локальная настраиваемая служба DNS отправляет запрос на удаленный DNS-сервер
3) удаленный сервер отвечает
4) ??? исходный процесс с локальным портом 54387 получает ответ от 1.1.1.1:53 ???
5+) повторить для PTR
Что и почему здесь произошло и как этого избежать, не редактируя resolv? В целом это не будет большой проблемой, но запросы DNS от пользовательской службы зашифрованы, а ответ от 1.1.1.1:53 - нет.
Для справки, текущий файл resolv.conf обновляется через аренду DHCP:
1.1.1.1
8.8.8.8
У меня нет возможности редактировать его, потому что исходный вопрос был предназначен для Android 9+, который просто нет места, где можно просто установить DNS и быть счастливым. Мне удалось воспроизвести ту же ситуацию на моем CentOS8 настройка, поэтому вопрос должен применимый.
Запрос в пункте 1) выше отображается ПОСЛЕ того, как произошел DNAT в одной из цепочек предварительной маршрутизации. Вот почему вы видите адрес назначения 127.0.0.1 вместо ОРИГИНАЛЬНОГО адреса назначения 1.1.1.1. Эти пакеты и ваш преобразователь, а затем вы, кажется, продолжаете DNS через HTTPS.
Когда ответ от вашего локального преобразователя отправляется обратно запрашивающей стороне, он ТАКЖЕ проходит через NAT. Этот NAT гарантирует, что адрес ИСТОЧНИКА ответа является ОРИГИНАЛЬНЫМ адресом НАЗНАЧЕНИЯ запроса. Вот почему вы видите 1.1.1.1 в качестве адреса источника в пункте 4) выше.
В основном NAT выполняется в двух местах: