Анонимный VPN роутер на pfSense
У вас может быть и другой 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 со стрелочкой вверх(!):
И создадим 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.