Итак, у нас есть туннель до VPN-провайдера и мы хотим быть уверены что весь трафик, включая DNS запросы, идёт только через этот туннель, а в случае его недоступности пользователи ни в коем случае не должны выходить напрямую через сеть провайдера. Установлена pfSense CE версии 2.5.2, регистрация на CyberGhost пройдена - поехали.
CyberGhost
У вас может быть и другой VPN-провайдер,- CyberGhost выбран ввиду простоты настройки и для демонстрации настройки получения DNS серверов при подключении. Если в вашей стране не заблокирован ExpressVPN, то настройки будут практически идентичны.
Регистрация пройдена, оплачено нужное количество месяцев. На странице VPN > Управление устройствами выбираем Ручная установка -> Настроить устройство. В появившемся окне в качестве протокола выбираем просто OpenVPN, какую хочется страну и группу серверов. Называем это pfSense.
Далее на странице VPN > Управление устройствами видим pfSense в списке активных VPN-устройств. Нажимаем на "просмотреть" в новом окне и скачиваем архив с конфигураций. Username и Password нам также пригодятся при настройке клиента.
Сертификаты
Распаковываем скачанный архив pfsense_openvpn.zip и видим там несколько файлов. Для начала нам нужны ca.crt, client.crt и client.key.
Переходим в pfSense на страницу System / Certificate Manager / CAs и жмём кнопку Add.
Называем это дело GyberGhost VPN CA, выбираем в качестве метода Import an existing Certificate Authority и вставляем содержимое файла ca.crt данные в поле Certificate data. CA импортирован.
Теперь переходим на вкладку System / Certificate Manager / Certificates, кнопка Add, выбираем в качестве метода Import an existing Certificate, называем CyberGhost Client Certificate и копируем содержимое файла client.crt в поле Certificate data, а файла client.key - в поле Private key data.
Сертификат импортирован.
OpenVPN клиент
Настроим OpenVPN клиент. Жмём Add на странице VPN / OpenVPN / Clients, а также открываем содержимое файла openvpn.ovpn из архива. В моём случае это выглядит так:
client
remote 87-1-at.cg-dialup.net 443
dev tun
proto udp
auth-user-pass
resolv-retry infinite
redirect-gateway def1
persist-key
persist-tun
nobind
cipher AES-256-CBC
ncp-disable
auth SHA256
ping 5
ping-exit 60
ping-timer-rem
explicit-exit-notify 2
script-security 2
remote-cert-tls server
route-delay 5
verb 4
ca ca.crt
cert client.crt
key client.key
Начинаем заполнять поля настройки клиента. Если что-то не указано, то оставляем по умолчанию. Поехали:
Server host or address: хост из строки remote, в моём случае 87-1-at.cg-dialup.net
Server port: порт из строки remote, в моём случае 443
Description: CyberGhost VPN
Username/Password: копируем со страницы предварительного просмотра роутера (см. выше)
TLS Configuration: убираем
Peer Certificate Authority: CyberGhost VPN CA
Client Certificate: CyberGhost VPN Client Certificate
Data Encryption Negotiation: отключаем (строка ncp-disable)
Fallback Data Encryption Algorithm: оставляем AES-256-CBC (строка cipher)
Auth digest algorithm: оставляем SHA256 (строка auth)
Pull DNS: позволяет использовать предоставляемый клиенту DNS, включаем
Сохраняем и на странице Status / OpenVPN проверяем что клиент подключился (Status = up):
Настройка DNS
Нашей задачей является запрет на использование публичных DNS серверов клиентами сети,- мы не хотим показывать куда ходят клиенты через VPN туннель (т.е. исключить DNS Leak).
Для начала назначим OpenVPN интерфейс, это нам пригодится в дальнейшем. На странице Interfaces / Interface Assignments выбираем ovpnc1 и нажимаем Add. Называем CyberGhost_VPN, чекаем Enable и сохраняем.
Переходим на страницу System / General Setup и убираем всё из списка DNS Servers. Ставим галочку DNS Server Override, - это позволит использовать получаемый от OpenVPN сервер DNS в качестве форвардера.
Настроим DNS сервер на Services / DNS Resolver / General Settings. Разрешаем запросы только на LAN и loopback интерфейсах - Network Interfaces = LAN, Localhost. Выбираем в Outgoing Network Interfaces только CyberGhost_VPN и ставим галочку у DNS Query Forwarding.
Исключаем DNS Leak
Вот тут начинаются хитрости. В зависимости от типа подключения к провайдеру нам нужно произвести разные настройки чтобы исключить попадание провайдерских DNS в список форвардеров,- иначе при отвале VPN'а все DNS запросы пойду через следующий по приоритету DNS, т.е. тот что мы автоматически получаем от провайдера.
Для начала добавим на странице Services / DNS Resolver > Host Overrides адреса VPN сервера. Сперва получим их с помощью команды `dig a 87-1-at.cg-dialup.net`:
$ dig a 87-1-at.cg-dialup.net
...пропущено...
;; ANSWER SECTION:
87-1-at.cg-dialup.net. 30 IN A 37.19.223.231
87-1-at.cg-dialup.net. 30 IN A 37.19.223.5
87-1-at.cg-dialup.net. 30 IN A 37.19.223.10
87-1-at.cg-dialup.net. 30 IN A 37.19.223.203
87-1-at.cg-dialup.net. 30 IN A 37.19.223.32
87-1-at.cg-dialup.net. 30 IN A 37.19.223.217
87-1-at.cg-dialup.net. 30 IN A 89.187.168.165
87-1-at.cg-dialup.net. 30 IN A 37.19.223.251
87-1-at.cg-dialup.net. 30 IN A 37.19.223.8
87-1-at.cg-dialup.net. 30 IN A 37.19.223.250
Создадим Host Entry перечислив полученные адреса через запятую:
Если для подключения к провайдеру используется статический адрес - то по данной части всё готово, никакие другие DNS'ы кроме тех что прилетают при подключении по OpenVPN у нас не появятся.
Если же у нас DHCP подключение то нужно отключить приём настроек DNS через DHCP. В настройках интерфейса нет такой опции, но есть Configuration Override, позволяющая использовать собственный конфигурационный файл. Вот ею и воспользуемся.
Скопируем скрипт запускаемый при подключении по DHCP:
cp /usr/local/sbin/pfSense-dhclient-script /usr/local/sbin/pfSense-dhclient-script.nodns
И закомментируем в нём строки 359, 388-390. Скопируем автоматически сгенерированный конфиг DHCP клиента:
cp /var/etc/dhclient_wan.conf /usr/local/etc/nodns_dhcp.conf
И поменяем там лишь строку `script`:
script "/usr/local/sbin/pfSense-dhclient-script.nodns";
Указываем путь к нашему конфигу в Configuration File Override:
Вот и всё - теперь настройки DNS получаемые по DHCP будут игнорироваться.
А что если PPPoE подключение? Придётся кое-что поправить в скрипте вызываемом при подключении,- /usr/local/sbin/ppp-linkup
. Чуть заменим одну строку:
- if [ "${DNSALLOWOVERRIDE}" = "true" ]; then
+ if [ "${DNSALLOWOVERRIDE}" = "X" ]; then
Аналогично, теперь получаемые по PPPoE настройки DNS будут игнорироваться. Но это ещё не всё.
Тут внимательные пользователи pfSense могут спросить - а зачем все эти правки, если получаемый по OpenVPN DNS сервер будет иметь приоритет над теми что прилетают через DHCP/PPPoE? Дело в том, что если по каким-то причинам DNS сервер VPN провайдера не отвечает, то резолвер начнёт пробовать отправлять запрос к следующему по приоритету DNS серверу, и запросы пойдет мимо туннеля.
Настройка Firewall
Нужно исключить возможность использования пользователями/программами нашей локалки каких-либо других DNS серверов кроме того предоставляется VPN провайдером.
Для этого создадим правило блокирующее DNS-over-TLS трафик (853 TCP порт) на вкладке Firewall / Rules / LAN - Add со стрелочкой вверх(!):
Action: Reject
Address Family: IPv4
Protocol: TCP
Source/Destination: Any
И создадим Port Forwarding правило перенаправляющее все DNS запросы наружу на наш pfSense. Вкладка Firewall / NAT / Port Forward -> Add:
Interface: LAN
Address Family: IPv4
Protocol: TCP/UDP
Destination: Invert match - включить, Type: LAN Address
Destination port range: DNS
Redirect target IP: LAN address
Redirect target port: DNS
Filter rule association: Add associated filter rule
Теперь нам нужно настроить фаервол так, чтобы при падении VPN туннеля наши пользователи не побежали неожиданно через сеть провайдера.
На странице System / Advanced / Miscellaneous включаем Skip rules when gateway is down, - это нужно для того, чтобы при отвале VPN'а не создавались правила использующие шлюз этого VPN. В этом случае правила как бы "не будет", а следом нет и других правил,- соответственно deny, трафик будет дропаться.
Создадим же само правило (Add со стрелочкой вниз):
Action: Pass
Interface: LAN
Address Family: IPv4
Protocol: Any
Source: LAN net
Destination: Any
Advanced Options / Gateway: CYBERGHOST_VPN_VPNV4
Итого у нас должен получиться следующий порядок правил:
Настроим Outbound NAT для клиентов локальной сети. На Firewall / NAT / Outbound переключаем Mode в "Hybrid Outbound NAT rule generation" и нажимаем Save. Теперь можно добавить следующее правило:
Interface: CYBERGHOST_VPN
Address Family: IPv4
Protocol: any
Source: адрес нашей LAN сети, в моём случае - 192.168.3.0/24
Destination: Any
Address: Interface Address
Теперь IP адреса хостов LAN сети попадая в туннель будут автоматически транслироваться в адрес OpenVPN-интерфейса (маскарадинг).
Настройка pfBlockerNG
Подробнее про настройку этого чудо-блокировщика я уже писал ранее, поэтому пробежимся только по тому что нам от него нужно. Для начала установим пакет pfBlockerNG-devel через System / Package Manager / Available Packages, сделаем дефолтную настройку с помощь визарда на Firewall / pfBlockerNG и перейдём к специфичным для нас вещам.
А именно блокировке DoH серверов. На странице Firewall / pfBlockerNG / DNSBL / DNSBL SafeSearch переводим DoH/DoT Blocking в Enable и выбираем через Ctrl+A все сервера в DoH/DoT Blocking List.
В принципе, это основное что нам нужно от pfBlockerNG - исключить DNS leak через DoH сервера. При желании можно настроить фиды для блокировки IP или DNS адресов, например использовать фиды из категории Firebog_Trackers для блока трек-адресов или блокировать рекламу с помощью Firebog_Advertisement, ADs и Easylist фидов.
Не забываем запустить Force / DNSBL на Firewall / pfBlockerNG / Update для применения изменений.
Готово
Проверяем: https://www.cyberghostvpn.com/ru_RU/dns-leak-test
Можно дополнительно проверить что трафик не пойдёт мимо VPN'а если тот отвалится,- просто остановите OpenVPN клиент на Status / OpenVPN (иконка с "кирпичиком") и убедитесь что клиенты даже не смогут ничего пинговать по IP адресу.
Как уже говорилось в начале, данная конфигурация применима и к другим VPN провайдерам работающим по OpenVPN, незначительные отличия могут быть лишь в правильной "интерпретации" .ovpn конфига и для настройки OpenVPN клиента в pfSense.
Комментарии (12)
werter_l
30.10.2021 17:43Спасибо.
Но мне кажется, что схема немного переусложнена )
Переходим на страницу System / General Setup и СНИМАЕМ галку с DNS Server Override.
Тем самым мы «лишаемся» (что хорошо) в корне возможности использовать провайдерские dns.
Там же прописываем DNS (напр., 1.1.1.1) и ЯВНО указываем gateway к этому DNS — наш ovpn_gw. Правильнее указать неск-ко ip-адресов dns по аналогии. Тогда клиенты в локалке за пф получив по dhcp в кач-ве 1-го днс ip пфсенса будут пользовать те днс (форвардингом), что указаны в настройках пфсенса на странице System / General Setup и ТОЛЬКО через впн-туннель.
Также непонятно, зачем блокировать doh пфблокером клиентам? У нас же ВЕСЬ трафик уходит в впн-туннель — так пусть пользуют doh через впн на здоровье.
Далее, правило fw на скрине с reject-ом всего dnssec (853\TCP). ВЕСЬ трафик и так уходит в туннель (и dnnsec тоже, ес-но) согласно последнему правилу на этом же скрине и смысл в его блокировке стремится к нулю.
После правки правил fw рекомендую сделать Reset states ради чистоты эксперимента.
Касаемо конфига впн от киберхоста. Эти строки:cipher AES-256-CBC
ncp-disable
Оч. плохо, что этот хостер НЕ ПОДДЕРЖИВАЕТ алгоритмы шифрования с аппаратным ускорением AES (
Даже странно как-то — это же и им лишняя нагрузка на железо.
В таком случае вы более 10-20 Мбит\с через этот впн не «прокачаете».
Но получите приличную нагрузку на cpu железки, где установлен пфсенс. Причем даже, если ваш cpu умеет ускорять aes.silinio Автор
30.10.2021 22:41Схема переусложнена по причине динамического получения IP адреса DNS сервера VPN-провайдера при подключении по OpenVPN. По той же причине блокируется DoH и DNS-over-TLS.
Если вы хотите использовать публичный DNS вместо сервера VPN провайдера — то да, ваша конфигурация вполне подойдёт.werter_l
31.10.2021 14:09А причем здесь блокировка DoH и dnssec (dnssec - это не DoT) ?
Наоборот, использование DoH, dnssec etc на клиентской стороне НЕ позволяет перехватывать днс-трафик и впн-провайдеру тоже. Зачем киберхосту знать, куда я хожу через их впн?
Еще раз повторюсь, что этот киберхост - школоло-поделка. Мне хватило того, что они в конфиге впн касаемо AES нарисовали. Сами себе в ногу стреляют не используя аппаратное ускорение.
silinio Автор
01.11.2021 16:17> Еще раз повторюсь, что этот киберхост — школоло-поделка. Мне хватило того, что они в конфиге впн касаемо AES нарисовали. Сами себе в ногу стреляют не используя аппаратное ускорение.
Как было не раз сказано, CyberGhost выбран лишь в качестве примера
Вы можете использовать описанную конфигурацию с любом другим VPN провайдером
silinio Автор
30.10.2021 22:56если проц поддерживает AES-NI то OpenVPN автоматом использует его для ускорение всех AES-*-* алгоритмов
werter_l
31.10.2021 14:00Я вас разочарую. Openvpn будет "поддерживать" только то, что указано в конфигурационном файле. Сами проверьте.
При этом надо еще и руками на самом пфсенсе вкл. ускорение AES в настройках. Оно выкл. по умолчанию.
werter_l
04.11.2021 13:08Про выбор алгоритмов шифрования для vpn
logon61
07.11.2021 20:14Интересно было бы почитать про настройку wireguard или openvpn, чтобы через туннель клиенты ходили только на определенные сайты из алиаса. Я пробовал настраивать такой конфиг, вроде все работало, но потом увидел, что pfsense сам ходит в инет только через vpn туннель, получается, что увеличивается задержка от серверов dns. В общем работал некорректно, как мне показалось. Хотелось бы почитать, как это грамотно организовать.
NikaLapka
Извините, а почему бы не воспользоваться более популярным protonvpn(если он не заблокирован, к сожалению не обладаю информацией)? И просто мысли: ovpn и pfSense это довольно требовательная связка, в отличие от l2tp\ipsec + любой домашний роутер. Утечку DNS можно удобно исключить в табличке маршрутизации.
silinio Автор
Можно использовать и ProtonVPN, какой угодно VPN провайдер на базе OpenVPN. Об этом сказано в самом начале.
Полностью согласен со вторым доводом
Как можно исключить утечку DNS с помощью таблички маршрутизации если адрес DNS получается динамически?