Как заблокировать DNS через HTTPS с помощью IPtables

Я недавно впервые начал использовать iptables на моем маршрутизаторе на базе OpenWrt, Linux. Изначально брандмауэр OpenWrt очень хорош, однако, после того, как захотелось сделать с брандмауэром более сложные вещи, такие как принудительный DNS, iptables выглядела так, как будто это был единственный выход.

Я пытаюсь пропустить весь DNS-трафик через маршрутизатор, чтобы пользователи, подключенные к сети, не могли переопределить DNS-серверы, задавая ручные настройки DNS на своих устройствах. Я успешно сделал это для стандартного трафика порта 53, используя правило перенаправления.

Я проверил это, установив DNS на моем маршрутизаторе OpenWrt и используя dnsleaktest.com, чтобы увидеть, какие DNS были обнаружены. Как и ожидалось, я использовал DNS, установленный в OpenWrt. Затем в Windows я установил DNS вручную, отличный от openwrt, снова провел тест на «dnsleaktest.com» и начал видеть некоторые из переопределенных DNS. Наконец, я применил правило перенаправления iptables и провел тест в третий раз, и действительно, на этот раз ручной DNS, установленный на клиенте, не отображался, а вместо этого проходили DNS маршрутизатора.

Кроме того, я также заблокировал DNS через TLS (DoT), отбросив порт 853. Однако у меня возникли проблемы с DNS через HTTPS (DoH).

Я читал в нескольких местах, что единственный способ остановить DoH - это заблокировать IP на порту 443 (SSL).Имея это в виду, я составил полный список общедоступных серверов DNS через HTTPS, таких как Google, Adguard и Cloudflare. Я поместил IP-адреса в ipset и загрузил их в iptables, но, похоже, он не работает.

Для тестирования DoH я установил флажок «Включить DNS через HTTPS» в настройках сети Mozilla Firefox и протестировал с помощью «dnsleaktest.com».

/etc/Block_DoH.txt (ipset)

create Block_DoH hash:ip,port
add Block_DoH 8.8.4.4,443
add Block_DoH 8.8.8.8,443
add Block_DoH 149.112.112.112,443
add Block_DoH 9.9.9.9,443
add Block_DoH 149.112.112.9,443
add Block_DoH 9.9.9.10,443
add Block_DoH 149.112.112.10,443
add Block_DoH 9.9.9.11,443
add Block_DoH 149.112.112.11,443
add Block_DoH 104.28.1.106,443
add Block_DoH 104.28.0.106,443
add Block_DoH 45.90.28.0,443
add Block_DoH 45.90.30.0,443
add Block_DoH 176.103.130.131,443
add Block_DoH 176.103.130.130,443
add Block_DoH 176.103.130.132,443
add Block_DoH 176.103.130.134,443
add Block_DoH 96.113.151.147,443
add Block_DoH 185.228.168.9,443
add Block_DoH 185.228.169.9,443
add Block_DoH 185.228.168.168,443
add Block_DoH 185.228.169.168,443
add Block_DoH 185.228.168.10,443
add Block_DoH 185.228.169.11,443
add Block_DoH 1.1.1.1,443
add Block_DoH 1.0.0.1,443
# Force DNS to router's DNS
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT

# Block DNS over TLS
iptables -I INPUT -p tcp --sport 853 -j DROP
iptables -I INPUT -p udp --sport 853 -j DROP
iptables -I OUTPUT -p tcp --dport 853 -j DROP
iptables -I OUTPUT -p udp --dport 853 -j DROP

# Block DNS over HTTPS
iptables -I OUTPUT -m set --match-set Block_DoH src -j DROP
iptables -I INPUT -m set --match-set Block_DoH dst -j DROP

# Tried blocking Cloudflare with IPtables directly
iptables -I INPUT -s 1.1.1.1 -j DROP
iptables -I INPUT -s 1.0.0.1 -j DROP
iptables -I OUTPUT -d 1.1.1.1 -j DROP
iptables -I OUTPUT -d 1.0.0.1 -j DROP

# Tried to redirect to DNS running on router
iptables -t nat -I OUTPUT -p tcp -s 1.1.1.1 --sport 443 -d 192.168.1.1 --dport 53 -j REDIRECT
iptables -t nat -I OUTPUT -p udp -s 1.1.1.1 --sport 443 -d 192.168.1.1 --dport 53 -j REDIRECT
iptables -t nat -I OUTPUT -p tcp -s 1.0.0.1 --sport 443 -d 192.168.1.1 --dport 53 -j REDIRECT
iptables -t nat -I OUTPUT -p udp -s 1.0.0.1 --sport 443 -d 192.168.1.1 --dport 53 -j REDIRECT

Есть идеи?

Заранее большое спасибо.

ОБНОВЛЕНИЕ 1

@hardillb Строки, на которых я обращаю внимание, это #Block DNS over HTTPS . Я явно пытаюсь заблокировать DoH, чтобы клиент вернулся к стандартному DNS.

0
задан 24 December 2019 в 00:59
3 ответа

То, что вы хотите, как хорошо сказал @hardillb, не может быть сделано. Как ваш ответ, с моей точки зрения, у него нет решения, потому что это разные протоколы, я думаю, единственное, что вы можете сделать, это отфильтровать порт. Например, создайте свой собственный dns и разрешите запросы только для своего dns и заблокируйте все остальные запросы. Следующий пример (bash iptables) относится к google dns, но вы должны сделать это со своим dns (заменить переменные):

PS: это не очень хорошее решение, но в конечном итоге может помочь

# UDP: DNS Public (53) and DNS over TLS (853)
dns="8.8.8.8 8.8.4.4"
# local interface
lan=enp2s0 
# internet interface
internet=enp2s1

for ip in $dns; do
    iptables -A INPUT -s $ip -i $internet -p udp -m multiport --sports 53,853 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -d $ip -o $internet -p udp -m multiport --dports 53,853 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
    iptables -A FORWARD -i $lan -p udp -m multiport --dports 53,853 -d $ip -o $internet -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
done
iptables -A INPUT -i $lan -p udp -m multiport --dports 53,853 -j DROP
iptables -A FORWARD -i $lan -p udp -m multiport --dports 53,853 -j DROP`

Другой альтернативой является фильтрация трафик с помощью инструментов, например pi-hole или ipset, но этот тип фильтрации сильно замедляет трафик

0
ответ дан 4 June 2020 в 14:15

Заблокировать протокол DoH на маршрутизаторе сложно или даже невозможно. DoH не может быть легко заблокирован, потому что он использует TCP-порт 443, который является тем же портом, который используется для HTTPS. Вы можете заблокировать такие IP-адреса: 443, но некоторые из этих серверов используют его как для DoH, так и для контента. Например, сервер DoH dns.cloudflare.com имеет те же IP-адреса, что и cdnjs.cloudflare.com, последний используется для обслуживания некоторых сценариев, используемых несколькими веб-сайтами, такими как linuxquestions.org

. Таким образом, вы можете заблокировать только некоторые серверы DoH.

Как вариант, вы можете настроить собственный сервер DoH в локальной сети, используя dnscrypt2 / H2O / Simple AdBlock и т. д. Но приложение может хотеть или не хотеть его использовать.

Принудительное перенаправление трафика на собственный сервер DoH не работает из-за криптографической защиты

1
ответ дан 19 March 2021 в 11:24

Пожалуйста, используйте ipset, см. https://ipset.netfilter.org/. Для такого огромного списка вам не нужно иметь так много правил, т.е. по одному на IP.

0
ответ дан 19 March 2021 в 12:06

Теги

Похожие вопросы