bol-van / zapret

DPI bypass multi platform
5.84k stars 512 forks source link

nft конфиг для редиректа dns #322

Closed drizt closed 2 weeks ago

drizt commented 2 weeks ago

https://github.com/bol-van/zapret/blob/master/docs/quick_start.txt тут сказано что можно проблему dns решить с помощью nftables, но не сказано как. Я как человек далёкий от этого потратил пару дней чтоб разобраться. Вариант с dnsmasq не прокатывается потому что blockcheck.sh всё равно не использует системный DNS а в dig его явно указывет. У меня роутер с OpenWRT и fw4. Настроил по итогу так.

/etc/nftables.d/dns.nft

set exclude_ips {
    type ipv4_addr;
    flags interval
    # Тут список ip-адресов DNS запросы к которым не должны перенаправляться
    # нужен на случай если есть собственный DNS-сервер, который работает с внутренней сетью
    elements = { 192.168.0.0/16, 127.0.0.0/8, 10.0.0.0/24}
}

chain user_output_dns {
    # Это для запросов которые посылает сам роутер
    type nat hook output priority filter; policy accept;
    udp dport 53 ip daddr != @exclude_ips dnat ip to 77.88.8.88:1253
    tcp dport 53 ip daddr != @exclude_ips dnat ip to 77.88.8.88:1253
}

chain user_prerouting_dns {
    # Это для запросов из сети которые роутер перенаправляет
    type nat hook prerouting priority filter; policy accept;
    udp dport 53 ip daddr != @exclude_ips dnat ip to 77.88.8.88:1253
    tcp dport 53 ip daddr != @exclude_ips dnat ip to 77.88.8.88:1253
}

Думаю это можно в документацию к zapret включить.

bol-van commented 2 weeks ago

blockcheck.sh использует системный DNS он сканирует другие DNS только при dnscheck в начале и городить этот огород было вовсем не обязательно

что касается редиректа, то это стандартная схема, которая описана где угодно как для iptables, так и для nftables

drizt commented 2 weeks ago

Ну тогда это как бы не совсем нормально, что он кидает предупреждение в случае, если системный DNS настроен правильно. Тем более что в доке прямым текстом сказано.

Запустите blockcheck.sh. blockcheck.sh в начале проверяет DNS. Если выводятся сообщения о подмене адресов, то первым делом нужно решить эту проблему, иначе ничего не будет работать.

Воспринимается так как будто надо добиться, чтоб этого предупреждения не было.

По поводу огорода, ну ChatGPT сходу эту настройку выдать не мог, пришлось долго вникать как это всё работает. И уже с понимание писать так как нужно.

Сейчас специально загуглил по фразе openwrt nft redirect dns. Нет там этого.

bol-van commented 2 weeks ago

Что пишет тестер DNS в блокчеке ? лог сюда

drizt commented 2 weeks ago
dig output
root@OpenWrt:~# dig rutracker.org

; <<>> DiG 9.18.27 <<>> rutracker.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36359
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;rutracker.org.                 IN      A

;; ANSWER SECTION:
rutracker.org.          272     IN      A       104.21.32.39
rutracker.org.          157     IN      A       172.67.182.196

;; Query time: 169 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Sun Aug 25 13:25:03 +05 2024
;; MSG SIZE  rcvd: 74

root@OpenWrt:~# dig -p 53 @77.88.8.88 rutracker.org

; <<>> DiG 9.18.27 <<>> -p 53 @77.88.8.88 rutracker.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15612
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;rutracker.org.                 IN      A

;; ANSWER SECTION:
rutracker.org.          600     IN      A       188.186.154.88

;; Query time: 0 msec
;; SERVER: 77.88.8.88#53(77.88.8.88) (UDP)
;; WHEN: Sun Aug 25 13:25:14 +05 2024
;; MSG SIZE  rcvd: 47

root@OpenWrt:~# dig -p 1253 @77.88.8.88 rutracker.org

; <<>> DiG 9.18.27 <<>> -p 1253 @77.88.8.88 rutracker.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64995
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;rutracker.org.                 IN      A

;; ANSWER SECTION:
rutracker.org.          142     IN      A       172.67.182.196
rutracker.org.          142     IN      A       104.21.32.39

;; Query time: 40 msec
;; SERVER: 77.88.8.88#1253(77.88.8.88) (UDP)
;; WHEN: Sun Aug 25 13:25:14 +05 2024
;; MSG SIZE  rcvd: 74

blockcheck.sh
root@OpenWrt:/opt/zapret# ./blockcheck.sh 
* checking system
Linux detected
firewall type is nftables
* checking privileges
* checking prerequisites
* checking DNS
system DNS is working
comparing system resolver to public DNS : 8.8.8.8
pornhub.com : OK
putinhuylo.com : OK
rutracker.org : MISMATCH
-- system resolver :
104.21.32.39
172.67.182.196
-- 8.8.8.8 :
188.186.154.88
-- POSSIBLE DNS HIJACK DETECTED. ZAPRET WILL NOT HELP YOU IN CASE DNS IS SPOOFED !!!
-- DNS CHANGE OR DNSCRYPT MAY BE REQUIRED
* checking virtualization
cannot detect

NOTE ! this test should be run with zapret or any other bypass software disabled, without VPN

specify domain(s) to test. multiple domains are space separated.
domain(s) (default: rutracker.org) : 

/etc/config/dhcp
config dnsmasq
        option domainneeded '1'
        option localise_queries '1'
        option local '/lan/'
        option domain 'lan'
        option expandhosts '1'
        option authoritative '1'
        option readethers '1'
        option leasefile '/tmp/dhcp.leases'
        option resolvfile '/tmp/resolv.conf.d/resolv.conf.auto'
        option localservice '1'
        option ednspacket_max '1232'
        option rebind_protection '1'
        list server '77.88.8.88#1253'
...
/etc/config/network
...
config interface 'wan'
        option device 'wan'
        option proto 'pppoe'
        option username '********'
        option password '********'
        option ipv6 'auto'
        option peerdns '0'

...

bol-van commented 2 weeks ago

домру подменяет DNS и перехватывает запросы DNS на 53 порт то что после замены DNS на yandex#1253 блокчек продолжает ругаться, это нормально. он сравнивает ответы системного DNS с 8.8.8.8 и находит подмену и указывает на необходимость решить проблему DNS но он не проверяет решена ли она по факту для системного DNS или нет если решена, можно дальше игнорировать результат

drizt commented 2 weeks ago

Ну вот в том то и дело что получается что решение через nft более предпочтительнее, потому что с ним нет этой неоднозначности. Проверка через blockcheck.sh проходит на ура. И мне не надо думать, решена проблема или нет.

bol-van commented 2 weeks ago

Не согласен. Но так тоже работает

drizt commented 2 weeks ago

Ну тогда можно задачу закрывать. Я лишь хотел предложить добавить сразу конфиг для nft чтоб, если кто-либо захочет так же сделать, чтоб ему не нужно была искать решение. Но нет так нет.

bol-van commented 2 weeks ago

Решение не нужно для проблемы, которой нет. Лучше ограничиваться МНВ - минимально необходимое воздействие. Не стоит уподобляться дому ру и искажать глобальную сеть своим перехватом. Лучше видеть то, что выдается от провайдера, пусть оно им искажено. Но свои искажения вносить не есть хорошо. Гораздо лучше сделать так, чтобы свой DNS выдавал то, что нужно. Этого вполне достаточно.