Здесь рассматривается, как настроить роутер с OpenWrt в качестве клиента сервера OpenVPN.

  • Всё проделывается на OpenWrt 22.03.5. На других версиях настройка не отличается
  • Предполагается, что уже есть работающий клиентский конфиг
  • Туннель можно настроить через консоль и через LuCi

Установка пакета

opkg update && opkg install openvpn-openssl

Настройка состоит из копирования конфига на роутер, создании зоны для OpenVPN и разрешения на передачу трафика из зоны lan в зону tun.

Настройка через консоль, копирование конфига

Тут всё довольно просто: есть специальная директория /etc/openvpn/, в которую можно просто закинуть свой конфиг и при старте OpenVPN возьмёт его и поднимет туннель.

Конфиг клиента openvpn копируем в /etc/openvpn/client.conf

Например, через scp

scp client.ovpn root@192.168.1.1:/etc/openvpn/client.conf

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

Стартуем openvpn

service openvpn start

Проверяем, что интерфейс поднялся. По умолчанию это будет tun0

root@OpenWrt:/etc/openvpn# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
...
6: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN qlen 500
    link/[65534] 
    inet 10.12.0.2/24 scope global tun0
       valid_lft forever preferred_lft forever
...

Проверить, что туннель работает, можно простым пингом с указанием интерфейса

ping -I tun0 itdog.info

Для того чтобы клиенты роутера могли ходить через туннель, необходимо добавить зону для интерфейса openvpn и разрешить forwarding из lan зоны в /etc/config/firewall

config zone
        option name 'tun'
        option forward 'REJECT'
        option output 'ACCEPT'
        option input 'REJECT'
        option masq '1'
        option mtu_fix '1'
        option device 'tun0'
        option family 'ipv4'

config forwarding
        option name 'lan-tun'
        option dest 'tun'
        option src 'lan'
        option family 'ipv4'

Логика такая же, как для WG, но есть одно но. Для WG мы указываем интерфейс через опцию network, потому что WG интерфейс определён в /etc/config/network. А для openvpn указываем device, потому что openvpn сам создаёт этот интерфейс, и в network его нет.

После этого нужно перезапустить firewall

service firewall restart

Настройка через LuCi

Для управления через LuCi. Понадобится ещё пакет для этого. Установка через консоль

opkg install luci-app-openvpn

Чтоб установить через LuCi, надо зайти в System - Software. В поле Download and install package ввести имя пакета luci-app-openvpn и нажать кнопку Install

И если у вас не установлен основной пакет, то нужно установить и его openvpn-openssl.

Зайти в VPN - OpenVPN. В OVPN configuration file upload нажать кнопку Choose file и выбрать свой конфиг, ввести какое-нибудь имя для него в поле Instance name и нажать кнопку Upload.

Этот конфиг должен появиться в OpenVPN instances. Включить его галочкой Enabled и Save & Apply.

openvpn-zone

В столбце Started должен появиться статус yes. С помощью Stop/Start можно останавливать и стартовать туннель.

Чтоб редактировать конфиг, нужно нажать Edit, внести изменения и нажать Save.

Добавление zone и forwarding через LuCi

Зайти в Network - Firewall, промотать до Zones. Нажать кнопку Add

Заполнить вкладку:

Name - tun

Input - reject

Output - accept

Forward - reject

Masquerading - проставить галочку

MSS clamping - проставить галочку

Allow forward from source zones - lan

openvpn-zone

Save - Save & Apply

Перенаправление всего трафика в туннель

За перенаправление всего трафика в OpenVPN отвечает директива redirect-gateway. Она может находиться в вашем клиентском конфиге, либо сам OpenVPN сервер может проставлять соединению без вашего спроса.

Проверить, идёт ли весь трафик в туннель на роутере, можно через traceroute к любому незаблокированному ресурсу

root@OpenWrt:~# traceroute itdog.info
traceroute to itdog.info (95.217.5.75), 30 hops max, 46 byte packets
 1  10.12.0.1 (10.4.0.1)  67.590 ms  66.855 ms  67.474 ms
 2  172.31.1.1 (172.31.1.1)  71.196 ms  70.921 ms  70.797 ms

Если на первом месте не IP роутера, а незнакомый IP (или знакомый, если vpn сервер ваш), то трафик идёт через туннель.

Также можно посмотреть таблицу маршрутизации

root@OpenWrt:~# ip r
0.0.0.0/1 via 10.8.0.1 dev tun0 

Эта строка означает, что весь трафик идёт в интерфейс tun0. А tun0 это интерфейс OpenVPN, в этом случае.

В случае, если вам не нужно перенаправлять весь трафик в туннель, а это происходит, проверьте в первую очередь ваш конфиг.

Если присутствует redirect-gateway, то нужно выпилить эту директиву.

Если в клиентском конфиге она отсутствует, но маршрут всё равно прописывается и весь трафик идёт в туннель, то в конфиге клиента добавляем строку

pull-filter ignore redirect-gateway

Это может выглядеть так

verb 3
pull-filter ignore redirect-gateway
<ca>
-----BEGIN CERTIFICATE-----

Она будет игнорировать настройку сервера.

Делаем рестарт openvpn, либо из LuCi, либо из командной строки

service openvpn restart

Настройка с помощью конфигурации OpenWrt

Конфигурация лежит в /etc/config/openvpn. Там есть уже готовые примеры.

Также можно вручную задать в LuCi все настройки. Для этого в Template based configuration выбрать Client configuration…, задать имя и нажать Add. После этого созданный instance редактировать с помощью кнопки Edit.

Это сложнее, чем копирование файла конфигурации. Помимо настройки конфига, нужно копировать на роутер 2 сертификата и 2 ключа. Поэтому подробно рассматривать этот вариант не буду.

Переключение роутинга на OpenVPN

Речь идёт про мой способ роутинга .

Тут есть два варианта, в зависимости от того по какой инструкции вы делали маршрут для таблицы vpn

Новый вариант через /etc/confg/network

В /etc/config/network в правиле

config interface 'vpn0'
	option name 'vpn0'
	option proto 'none'
	option auto '1'
	option device 'tun0'

config route 'vpn_route'
	option name 'vpn_route'
	option interface 'vpn0'
	option table 'vpn'
	option target '0.0.0.0/0'

у вас должен быть указать tun0, а не wg0. И так же создан интерфейс прослойка vpn0.

Старый вариант через hotplug

В файле /etc/hotplug.d/iface/30-vpnroute меняем интерфейс с wg0 на tun0.

У меня во время тестов не всегда поднимался маршрут при рестарте роутера. Это означает, что интерфейс openvpn поднимался после того, как отрабатывал hotplug. Решается это простой задержкой

#!/bin/sh

sleep 10
ip route add table vpn default dev tun0

После этого рестартуем сеть, и роутинг теперь осуществляется через openvpn

/etc/init.d/network restart

Нашли ошибку, неточность или знаете как лучше? Пишите в комментарии

Все обновления и новые статьи публикую в моём телеграм-канале .