OpenVPN: Policy Based Routing

Прикупил недавно роутер Keenetic Ultra KN-1810 и подумал хорошо бы обойти блокировки, чтобы telegram и protonmail работали без запинок поскольку они нужны для работы. Но сперва понадобится сервер, через который можно будет смаршрутизировать трафик.

Поиск недорогого хостинга

Пошерстив интернет остановился на немецкой компании Hetzner: https://www.hetzner.com/cloud и выбрал тариф CX11 за 2.99 евро (где-то 300 рублей в месяц). Главное что бросилось в глаза это 20 терабайт трафика в месяц. Думаю этого мне хватит за глаза. Далее установил на него CentOS и приступил к настройке.

Настройка OpenVPN Server

Устанавливаем OpenVPN и генерируем ключ:

openvpn --genkey --secret static.key

Пусть у сервера будет адрес 10.1.0.1, а у клиента 10.1.0.2. Создаем файл конфигурации в /etc/openvpn/server.conf:

dev tun
verb 1
cipher AES-256-CBC
auth SHA256
comp-lzo adaptive
<secret>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
Здесь содержимое static.key
-----END OpenVPN Static key V1-----
</secret>
ifconfig 10.1.0.1 10.1.0.2
route 192.168.1.0 255.255.255.0

Поскольку клиент почему-то не принимал директиву push route, то маршрутизацию настроим на стороне клиента (и да, галочка «получать маршруты от удаленной стороны» стояло включенным).

Настройка сети

Включаем форвардинг пакетов в /etc/sysctl.conf:

net.ipv4.ip_forward=1
sysctl -p

Открываем порт OpenVPN для моего домашнего статического IP-адреса, чтобы не принимало подключения с левых адресов (на всякий case):

firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="домашний внешний IP адрес" port protocol="udp" port="1194" accept'

Далее добавляем интерфейс OpenVPN в доверенную зону:

firewall-cmd --permanent --zone=trusted --add-interface=tun0

Включем маскарадинг, чтобы фаервол натил пакеты с адреса 10.1.0.1 через интерфейс eth0 который подключен к интернет:

firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth0 -j MASQUERADE -s 10.1.0.1/32

Настройка роутера на стороне клиента

Заходим в админку Keentic и идем в меню Управление -> Общие настройки -> Изменить набор компонентов. Устанавливаем OpenVPN и перезагружаем роутер. Подключемся к роутеру через telnet или ssh и выполняем следующие команды:

interface OpenVPN0 no ip global
interface OpenVPN0 security-level private
no isolate-private
system configuration save

Теперь идем в меню Интернет -> Другие подключения -> Добавить подключение. Задаем имя что-то вроде vpn и протокол OpenVPN. Приводим конфигурацию к следующему виду:

dev tun
verb 1
cipher AES-256-CBC
auth SHA256
comp-lzo adaptive
<secret>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
Здесь содержимое static.key
-----END OpenVPN Static key V1-----
</secret>
remote IP-адрес_openvpn_сервера
ifconfig 10.1.0.2 10.1.0.1
#protonmail
route 35.158.103.183 255.255.255.255 10.1.0.1
#telegram
route 91.108.56.0 255.255.252.0 10.1.0.1
route 91.108.4.0 255.255.252.0 10.1.0.1
route 67.198.55.0 255.255.255.0 10.1.0.1
route 149.154.172.0 255.255.252.0 10.1.0.1
route 149.154.168.0 255.255.252.0 10.1.0.1
route 149.154.164.0 255.255.252.0 10.1.0.1
route 149.154.160.0 255.255.240.0 10.1.0.1
route 109.239.140.0 255.255.255.0 10.1.0.1
route 128.199.145.114 255.255.255.255 10.1.0.1
route 185.70.41.0 255.255.255.0 10.1.0.1
route 18.194.0.0 255.254.0.0 10.1.0.1
route 149.154.167.99 255.255.255.255 10.1.0.1

После сохранения активируем подключение, идем в Сетевые правила -> Межсетевой экран и выставляем настройки согласно скринам:

OpenVPN: Policy Based Routing 1
OpenVPN: Policy Based Routing 2

И пробуем зайти скажем на protonmail.com с устройства подключенного через WiFi. Должно все работать и не надо каждое подключенное к роутеру устройство настраивать отдельно.