LINUX.ORG.RU
ФорумAdmin

Как защититься от DnsLeak на openvpn?

 


2

1

Всем бодрого духа!

Господа, есть идеи, как защититься от dnsleak при соединении с openvpn?
https://dnsleaktest.com/what-is-a-dns-leak.html

Как я понимаю, проблема в том, что openvpn не заворачивает в свой туннель dns запросы, которые могут ходить через своего провайдера как ни в чём ни бывало.

Как это обойти?

OpenVPN умеет запускать скрипты в момент установки соединения. Теоретически, можно попробовать написать скрипт который будет менять таблицу маршрутизации. И при завершении соединения воротать всё взад.
Однако.. а если соединение разорвётся само? Или хост выключится? Или просто гдето прав не хватит или ещё что...

Есть вменяемый метод?

Укажите днс сервер в конфиге сервера и будет счастье.

push "dhcp-option DNS ip-днс-сервера"

anc ★★★★★ ()

Однако.. а если соединение разорвётся само? Или хост выключится? Или просто гдето прав не хватит или ещё что...

Поднять на хосте свой DNS-сервер и вертеть там форварды как тебе вздумается

Pinkbyte ★★★★★ ()
Ответ на: комментарий от Pinkbyte

Поднять на хосте свой DNS-сервер и вертеть там форварды как тебе вздумается

Этот мудрый человек прав. Решение универсальное, но требует понимания и настройки.

Jameson ★★ ()
Ответ на: комментарий от anc

anc, спасибо за ответ.
Эдак нужно несколько DNS серверов прописать, чтобы заменить все клиентские настройки по DNS серверам, я правильно понимаю?
push «dhcp-option DNS 8.8.8.8 8.8.8.4» или как?

Piter_prbg ()
Ответ на: комментарий от Piter_prbg

ну что вы говорите, это же клиентский хост..

И что? Никаких религиозных запретов держать на хосте запущенным кеширующий bind с прописанными forward к разным DNS серверам для разных сетей нет, только неумение настоить. Я, например, люблю когда за разрешением интернет адресов bind напрямую к корневым серверам ходит, а forwardы на провайдерский и локальный DNS отвечают за внутрипрововские и локальные ресурсы. При поднятии тоннеля в разные локалки forward к DNS этой локалки добавляется к конфигурации bind автоматически. При поднятии vpn c default route bind делает свои запросы к корневым серверам через этот vpn, и ничего не течёт.

Соответственно у меня в resolv.conf всегда 127.0.0.1, всё остальное разруливает bind.

Jameson ★★ ()
Ответ на: комментарий от Piter_prbg

ну что вы говорите, это же клиентский хост..

У меня на работе на рабочей станции стоит DNS-сервер - обслуживает только 127.0.0.1 и не является авторитетным ни для одной из зон - только форвардит запросы как мне надо на другие DNS-сервера.

Это единственный способ нормально заставить DNS работать например с парой VPN-ов, за которыми свои DNS-зоны.

Pinkbyte ★★★★★ ()
Ответ на: комментарий от Piter_prbg

это же клиентский хост..

Предлагаю перестать думать в категориях рабочих станций. Любой настольный Линукс от сервера отличается мелочами и настройками преимущественно. Мысли ширше, как сетевой админ. Например во времена сильно платного исчерпаемого трафика мне был актуален локальный Squid. Ибо кеши у браузеров есть конечно, но браузеров несколько, не считая тех что внутри виртуалок... А тут настроил их всех на локальный прокси и у всех браузеров можно собственный кеш в 0 выставлять.

Jameson ★★ ()
Ответ на: комментарий от Pinkbyte

Это единственный способ нормально заставить DNS работать например с парой VPN-ов, за которыми свои DNS-зоны.

А это собственно и есть основной смысл использования VPN (virtual PRIVATE network). Сценарий, при котором туннель используется для смены точки выхода в интернет не основной, поэтому на нём косяки типа DNS leak и вылезают.

А вообще, правильный VPN провайдер должен снабдить тебя своим DNS, а правильный дистрибутив запихать его в resolv.conf. Если нет, правильный пользователь рабочей станции прописывает в настройках NetworkManager для этого соединения DNS 8.8.8.8 руками, после чего правильный дистрибутив запихивает это опять таки в resolv.conf. После опускания тоннеля всё должено возвращаться назад.

Jameson ★★ ()
Последнее исправление: Jameson (всего исправлений: 1)

А ещё мне вспомнился эпичный баг Networknanager https://bugs.archlinux.org/task/47535 , к счастью быстро пофикшенный. Суть в том, что vpn соединение устанавливалось, но default route не менялся, при этом никаких ошибок никуда кроме лога не писалось. В результате юзер пребывал в полной уверенности что он уже работает через vpn, но про факту продолжал светить трафик провайдеру. И формально нёс ответственность, так как софтина ему честно в лог сказала, «тоннель - смогла, маршрут - нет», но ктож эти логи читает? Тоннель взлетел? Взлетел. ЗначОк есть? Есть. Значит всё в поряде :)

Jameson ★★ ()
Ответ на: комментарий от Piter_prbg

Эдак нужно несколько DNS серверов прописать, чтобы заменить все клиентские настройки по DNS серверам, я правильно понимаю?

Не распарсил формулировку «чтобы заменить все клиентские настройки»

anc ★★★★★ ()
Ответ на: комментарий от Jameson

Господа, я рекомендуя вам вылезти чуть дальше своего сервера на локалхосте (в данном случае это про то что вы писали, а не намек на «админ локалхоста»). Случаев когда нужна именно раздача днс очень много и DNS leak не так уж и смешно как может показаться. А вот пользователям (именно пользователям) раздавать кроме ключей, паролей и т.д. еще и мануалы с инструкциями (под разные ОС) как настроить у себя днс сервер это все-таки перебор.

anc ★★★★★ ()
Ответ на: комментарий от anc

Уже написали же — запушить юзеру настройки DNS и всё, OpenVPN клиент сам всё пропишет, где надо.

Legioner ★★★★★ ()
Ответ на: комментарий от anc

Господа, видимо, не поняли сути проблемы ввиду моего не совсем ясного изложения.
Юзеры (то биш, виндовс десктопы) массово коннектятся к openvpn серверу. Я пытаюсь понять их защитить от DNSleak.

Piter_prbg ()
Ответ на: комментарий от anc

Чё-то я протормозил.
у меня и так стоит
push «dhcp-option DNS 8.8.8.8»
push «dhcp-option DNS 8.8.4.4»

и от утечки dns это не помогает.

Piter_prbg ()
Ответ на: комментарий от Piter_prbg

Хм, как определили? В конфиге клиента не запрещено случайно?

anc ★★★★★ ()
Ответ на: комментарий от anc

Не думаю, что на клиенте что-то запрещено.
вот конфиг клиента:

[br]client[br]dev tun[br]proto tcp[br]remote x.x.x.x 1194 #server's ip[br]nobind[br]persist-key[br]persist-tun[br]auth-user-pass[br]comp-lzo[br]reneg-sec 0[br]verb 3[br]

при соединении вижу:
[br]PUSH: Received control message: 'PUSH_REPLY,route 10.10.52.0 255.255.255.0,dhcp-option DNS 8.8.8.8,dhcp-option DNS 8.8.4.4,route 10.10.52.1,topology net30,ping 10,ping-restart 120,ifconfig 10.10.52.94 10.10.52.93'[br]

т.е. вроде как просасываются настройки.

Определили так
https://www.dnsleaktest.com/
Даже быстрый standard test запалил местонахождение.

Piter_prbg ()
Ответ на: комментарий от Piter_prbg

Походу винда новая, у меня старше семерки нигде нэма, там все работает норм. Вот что в инете есть http://habrahabr.ru/post/268173/
btw судя по нику, автор и здесь присутствует, ValdikSS Ваше творение?

anc ★★★★★ ()
Ответ на: комментарий от anc

Не понял вопрос(реплику?) про ник, но на всякий случай скажу, что на хабре не зареген, и на этом форуме у меня только один ник.

На винде пока не проверял, проверю вечером, напишу.
Ситуация такая: настраиваю openvpn-сервер на дебиане, хочу обезопаситься от dns leak.
Клиенты предполагается что будут на всех осях и девайсах.
Сам сижу на линукс минте, на нём проверяю.

Piter_prbg ()
Ответ на: комментарий от Piter_prbg

Так может тебе надо пушить внутренний ip впн сервера, а не гугла?
Тебе об этом в первом же комментарии написали.

xtraeft ★★☆☆ ()
Ответ на: комментарий от Piter_prbg

Не понял вопрос(реплику?) про ник, но на всякий случай скажу, что на хабре не зареген, и на этом форуме у меня только один ник.

Я написал что ValdikSS есть и здесь на лоре и предполагаю что судя по нику это один и тот же человек.

Клиенты предполагается что будут на всех осях и девайсах.

Да не должно быть проблем, собстно и на винде не было, да вот оказалось, что очередное поделие опять выпендрилось.

anc ★★★★★ ()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от anc

Piter_prbg, для начала определитесь, так ли важно для вас защищаться от DNS Leak. На Linux getaddrinfo будет пытаться резолвить хостнейм через следующий (не первый) nameserver только в том случае, если первый не ответил по таймауту. Т.е., в обычном случае, такое случается довольно редко (проблемы с сетью), но, конечно, если сеть контролируется злоумышленником (Wi-Fi хакера, к которой вы подключились), то он сможет произвольно устраивать вам DNS Leak (правда, для вас это будет выглядеть, как тормоза сети).

В Windows до 8 примерно такая же ситуация. Начиная с 8.1, Windows отправляет запросы на все ей известные DNS параллельно, байндясь к интерфейсу. Вот это уже плохо. Для устранения такого поведения можно использовать параметр

--block-outside-dns
Block  DNS servers on other network adapters to prevent DNS leaks.
This option prevents any application from accessing TCP or UDP port 53 except one inside the tunnel.
It uses Windows Filtering Platform (WFP) and works on Windows Vista or later.
Правда, эта опция будет вызывать отказ в подключении на Windows Vista. Будет исправлено в OpenVPN 2.3.11 (надеюсь). Либо же плагин, который делает то же самое: https://github.com/ValdikSS/openvpn-fix-dns-leak-plugin (тут и Vista уже работает).

Про OS X ничего не могу сказать. На Android DNS Leak нет.

OpenVPN в Linux сам по себе не умеет устанавливать DNS. Если вы запускаете его из консоли, используйте up-скрипт update-resolv-conf (в Debian находится в /etc/openvpn/update-resolv-conf). NetworkManager умеет устанавливать DNS, но, насколько мне известно, в Ubuntu все еще имеется баг из-за использования dnsmasq, он там как-то странно устанавливается. Я рекомендую закомментировать строку:

dns=dnsmasq
в файле /etc/NetworkManager/NetworkManager.conf и перезапустить NetworkManager:
sudo service network-manager restart
https://bugs.launchpad.net/ubuntu/ source/network-manager-openvpn/ bug/1169437

ValdikSS ★★★★★ ()
Последнее исправление: ValdikSS (всего исправлений: 2)
Ответ на: комментарий от ValdikSS

Про OS X ничего не могу сказать.

Тут все зашибись. Есть Tunnelblick https://www.tunnelblick.net там прям в гуйне можно настроить устанавливать dns или нет, dns ставиться единственным так что никаких левых адресов как в винде.

anc ★★★★★ ()
Ответ на: комментарий от ValdikSS

ValdikSS, anc, xtraeft,
спасибо за ответы. пойду всё это пробовать, напишу по итогам.

Piter_prbg ()
Ответ на: комментарий от Piter_prbg

Так, товарищи.
Я поставил последнюю версию с сайта openvpn-2.3.10,
хр,7,8.1 работает норм, тест dnsleak не определяет реальное местоположение.
Однако, на моём клиентском linux mint тест определяет меня, несмотря на то, что после соеднинения выполняю /etc/openvpn/update-resolv-conf

На андройде 5 кстати тоже проверил, утечки нет.
блочных устройств пока не нашёл погонять.

Piter_prbg ()
Ответ на: комментарий от Piter_prbg

Однако, на моём клиентском linux mint тест определяет меня, несмотря на то, что после соеднинения выполняю /etc/openvpn/update-resolv-conf

А о содержимом /etc/openvpn/update-resolv-conf мы видимо догадаться должны?

anc ★★★★★ ()
Ответ на: комментарий от anc

Ну, не я его писал; думал, что оно стандартное.

[br]#!/bin/bash[br]#[br]# Parses DHCP options from openvpn to update resolv.conf[br]# To use set as 'up' and 'down' script in your openvpn *.conf:[br]# up /etc/openvpn/update-resolv-conf[br]# down /etc/openvpn/update-resolv-conf[br]#[br]# Used snippets of resolvconf script by Thomas Hood and Chris Hanson.[br]# Licensed under the GNU GPL.  See /usr/share/common-licenses/GPL.[br]#[br]# Example envs set from openvpn:[br]#[br]#     foreign_option_1='dhcp-option DNS 193.43.27.132'[br]#     foreign_option_2='dhcp-option DNS 193.43.27.133'[br]#     foreign_option_3='dhcp-option DOMAIN be.bnc.ch'[br]#[br][br][ -x /sbin/resolvconf ] || exit 0[br][ "$script_type" ] || exit 0[br][ "$dev" ] || exit 0[br][br]split_into_parts()[br]{[br]        part1="$1"[br]        part2="$2"[br]        part3="$3"[br]}[br][br]case "$script_type" in[br]  up)[br]        NMSRVRS=""[br]        SRCHS=""[br]        for optionvarname in ${!foreign_option_*} ; do[br]                option="${!optionvarname}"[br]                echo "$option"[br]                split_into_parts $option[br]                if [ "$part1" = "dhcp-option" ] ; then[br]                        if [ "$part2" = "DNS" ] ; then[br]                                NMSRVRS="${NMSRVRS:+$NMSRVRS }$part3"[br]                        elif [ "$part2" = "DOMAIN" ] ; then[br]                                SRCHS="${SRCHS:+$SRCHS }$part3"[br]                        fi[br]                fi[br]        done[br]        R=""[br]        [ "$SRCHS" ] && R="search $SRCHS[br]"[br]        for NS in $NMSRVRS ; do[br]                R="${R}nameserver $NS[br]"[br]        done[br]        echo -n "$R" | /sbin/resolvconf -a "${dev}.openvpn"[br]        ;;[br]  down)[br]        /sbin/resolvconf -d "${dev}.openvpn"[br]        ;;[br]esac[br][br]

Piter_prbg ()
Ответ на: комментарий от Piter_prbg

блин, форум чё-то ерунду делает с кодом. И отредактировать сообщение нельзя.

[br][br]#!/bin/bash[br]#[br]# Parses DHCP options from openvpn to update resolv.conf[br]# To use set as 'up' and 'down' script in your openvpn *.conf:[br]# up /etc/openvpn/update-resolv-conf[br]# down /etc/openvpn/update-resolv-conf[br]#[br]# Used snippets of resolvconf script by Thomas Hood and Chris Hanson.[br]# Licensed under the GNU GPL.  See /usr/share/common-licenses/GPL.[br]#[br]# Example envs set from openvpn:[br]#[br]#     foreign_option_1='dhcp-option DNS 193.43.27.132'[br]#     foreign_option_2='dhcp-option DNS 193.43.27.133'[br]#     foreign_option_3='dhcp-option DOMAIN be.bnc.ch'[br]#[br][br][ -x /sbin/resolvconf ] || exit 0[br][ "$script_type" ] || exit 0[br][ "$dev" ] || exit 0[br][br]split_into_parts()[br]{[br]        part1="$1"[br]        part2="$2"[br]        part3="$3"[br]}[br][br]case "$script_type" in[br]  up)[br]        NMSRVRS=""[br]        SRCHS=""[br]        for optionvarname in ${!foreign_option_*} ; do[br]                option="${!optionvarname}"[br]                echo "$option"[br]                split_into_parts $option[br]                if [ "$part1" = "dhcp-option" ] ; then[br]                        if [ "$part2" = "DNS" ] ; then[br]                                NMSRVRS="${NMSRVRS:+$NMSRVRS }$part3"[br]                        elif [ "$part2" = "DOMAIN" ] ; then[br]                                SRCHS="${SRCHS:+$SRCHS }$part3"[br]                        fi[br]                fi[br]        done[br]        R=""[br]        [ "$SRCHS" ] && R="search $SRCHS[br]"[br]        for NS in $NMSRVRS ; do[br]                R="${R}nameserver $NS[br]"[br]        done[br]        echo -n "$R" | /sbin/resolvconf -a "${dev}.openvpn"[br]        ;;[br]  down)[br]        /sbin/resolvconf -d "${dev}.openvpn"[br]        ;;[br]esac[br][br]

Piter_prbg ()
Ответ на: комментарий от Piter_prbg

#!/bin/bash
#
# Parses DHCP options from openvpn to update resolv.conf
# To use set as 'up' and 'down' script in your openvpn *.conf:
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
#
# Used snippets of resolvconf script by Thomas Hood and Chris Hanson.
# Licensed under the GNU GPL.  See /usr/share/common-licenses/GPL.
#
# Example envs set from openvpn:
#
#     foreign_option_1='dhcp-option DNS 193.43.27.132'
#     foreign_option_2='dhcp-option DNS 193.43.27.133'
#     foreign_option_3='dhcp-option DOMAIN be.bnc.ch'
#

[ -x /sbin/resolvconf ] || exit 0
[ "$script_type" ] || exit 0
[ "$dev" ] || exit 0

split_into_parts()
{
        part1="$1"
        part2="$2"
        part3="$3"
}

case "$script_type" in
  up)
        NMSRVRS=""
        SRCHS=""
        for optionvarname in ${!foreign_option_*} ; do
                option="${!optionvarname}"
                echo "$option"
                split_into_parts $option
                if [ "$part1" = "dhcp-option" ] ; then
                        if [ "$part2" = "DNS" ] ; then
                                NMSRVRS="${NMSRVRS:+$NMSRVRS }$part3"
                        elif [ "$part2" = "DOMAIN" ] ; then
                                SRCHS="${SRCHS:+$SRCHS }$part3"
                        fi
                fi
        done
        R=""
        [ "$SRCHS" ] && R="search $SRCHS
"
        for NS in $NMSRVRS ; do
                R="${R}nameserver $NS
"
        done
        echo -n "$R" | /sbin/resolvconf -a "${dev}.openvpn"
        ;;
  down)
        /sbin/resolvconf -d "${dev}.openvpn"
        ;;
esac



Piter_prbg ()
Ответ на: комментарий от Piter_prbg

Я бы сказал это не очень «стандартное». Что такое resolvconf нашел только в инете в мане к убунту. По простому вам нужно при поднятии впн записывать в /etc/resolv.conf получаемый адрес(а) и там должны быть только они, а при дауне впн возвращать назад. Как это реализовать, решать вам, тут много нюансов может быть.
А что именно пишет resolvconf туда я хз, убунту не держим, скорее всего оставляет и старые адреса.

anc ★★★★★ ()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от anc

resolvconf был неплохой утилитой, но в последний раз я его видела лет так пять назад. с тех пор на десктопных дистрибутивах завёлся network-manager (меня лично он бесит, но факт, что он распространился везде, как ветрянка). и если он установлен, то надо в его настройках это всё прописывать, а то он перетирает resolv.conf автоматически.

Iron_Bug ★★★★ ()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

resolvconf был неплохой утилитой

хм, не сталкивался... сейчас под рукой были debian и cent os не свежие, тама нема.

с тех пор на десктопных дистрибутивах завёлся network-manager .... а то он перетирает resolv.conf автоматически.

Не только он может это делать, другие подключения, dhcpcd и т.д., я поэтому написал «тут много нюансов может быть». Один из простых способов «победить» chattr +i, главное не забывать при загрузке назад делать :)

anc ★★★★★ ()
Ответ на: комментарий от anc

хм, у меня в /etc/resolv.conf стоит только nameserver 127.0.1.1
и скрипт update-resolv-conf ничего не меняет.

Piter_prbg ()
Ответ на: комментарий от Piter_prbg

Предполагаю, что /sbin/resolvconf у вас нет. Если это так , то для вашего случая можно допилить этот скрипт самому.
вот эту строчку

        echo -n "$R" | /sbin/resolvconf -a "${dev}.openvpn"
заменить на
echo -n "$R" >/etc/resolv.conf
и
/sbin/resolvconf -d "${dev}.openvpn"
на
echo 'nameserver 127.0.1.1' >/etc/resolv.conf
Но тут много подводных камней. 1. В случае «бум» например перезагрузка по питалову у вас останется исправленный openvpn файл, а не nameserver 127.0.1.1. 2. Как выше писала Iron_Bug всякие NM могут его менять, плюс установка другого сетевого подключения может по dhcp получить, и т.д. и т.п.

anc ★★★★★ ()
Ответ на: комментарий от Piter_prbg

update-resolv-conf ничего не меняет.

в конфиге клиента есть?

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

ving2 ()
Ответ на: комментарий от Piter_prbg

у меня и так стоит

это должно быть на стороне сервера, если не ошибаюсь

ving2 ()
Ответ на: комментарий от ving2

да и совет для установки впн соединения используйте либо терминал, либо gopenvpn. Потому что NM плагин не умеет некоторых опций. В том числе и кривизна смены днс.

ving2 ()

В Debian 9 проблема все еще актуальна.

Решение:

  • установить resolvconf:

    sudo apt install resolvconf

  • в client.conf добавить строчки

    script-security 2
    up /etc/openvpn/update-resolv-conf
    down /etc/openvpn/update-resolv-conf
    
dzutaro ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.