VPN клиент на OpenWrt
- Подробности
- Категория: Настройка
- Опубликовано: 11 ноября 2018
- Просмотров: 65612
Использовать VPN для доступа к запрещенным сайтам сейчас уже не кажется таким кощунством, как раньше. За последние лет десять было создано такое огромное количество VPN-сервисов, который все в один голос трубят, как снимают с вас ограничения на интернет-контент, наложенный как нашим государством, так и отдельными интернет-провайдерами в частности, и о том, как все супер-анонимно и абсолютно бесследно. Так ли это на самом деле, каждый решает для себя сам. Мы же рассмотрим сегодня как поднять VPN клиента на вашем OpenWrt роутере. В качестве примера будем устанавливать VPN-соединение на устройстве TP-Link WR842ND с OpenWrt 18.06.1 используя пакет OpenVPN и VPN сервис FrootVPN.
1. Установка необходимых пакетов
Репозитарий OpenWrt имеет несколько вариаций скомпилированного пакета OpenVPN в зависимости от типа используемого шифрования, будь то OpenSSL, mbedTSL либо вовсе без никакого. В нашем примере установим пакет openvpn с поддержкой пакета шифрования OpenSSL.
opkg update
opkg install openvpn-openssl
Он потянет за собой зависимости такие как kmod-tun, liblzo,zlib,libopenssl. Типовой вывод команды ниже:
Installing openvpn-openssl (2.4.5-4) to root...
Downloading ...
Installing kmod-tun (4.9.120-1) to root...
Downloading ...
Installing liblzo (2.10-1) to root...
Downloading ...
Installing zlib (1.2.11-2) to root...
Downloading ...
Installing libopenssl (1.0.2p-1) to root...
Downloading ...
Configuring kmod-tun.
Configuring liblzo.
Configuring zlib.
Configuring libopenssl.
Configuring openvpn-openssl.
Те, кто не любит стучать по клаве вручную забивая конфиги должны поставить еще один пакет OpenVPN для веб морды OpenWrt.
opkg install luci-app-openvpn
2. Получение файлов конфигурации от провайдера VPN
Авторизируемся на сайте вашего VPN сервиса. И скачиваем файл с настройками для приложения OpenVPN. Обычно он имеет расширение *.ovpn. Загрузив данный файл на ваш роутер в папку /etc/openvpn/ через WinSCP и открыв директорию через SSH можно теперь вручную проверить как проходит соединение с сервером,у меня например файл называется sweden.ovpn:
cd /etc/openvpn
Узнаем сначала наш текущий внешний IP
wget -qO- http://openwrt.su/ip
Your external IP adress: 91.233.43.254
Далее попробуем подключиться из командной строки:
openvpn sweden.ovpn
Tue Nov 6 17:20:57 2018 OpenVPN 2.4.5 mips-openwrt-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD]
Tue Nov 6 17:20:57 2018 library versions: OpenSSL 1.0.2p 14 Aug 2018, LZO 2.10
В процессе терминал попросит ввести имя пользователя и пароль
Enter Auth Username: Wrtman
Enter Auth Password: ********
И если все пройдет успешно, то он вам сообщит следующее
Tue Nov 6 17:22:24 2018 TCP/UDP: Preserving recently used remote address: [AF_INET]178.73.195.109:1195
Tue Nov 6 17:22:24 2018 UDP link local: (not bound)
Tue Nov 6 17:22:24 2018 UDP link remote: [AF_INET]178.73.195.109:1195
Tue Nov 6 17:22:25 2018 [server] Peer Connection Initiated with [AF_INET]178.73.195.109:1195
Tue Nov 6 17:22:26 2018 Options error: Unrecognized option or missing or extra parameter(s) in [PUSH-OPTIONS]:5: block-outside-dns (2.4.5)
Tue Nov 6 17:22:26 2018 TUN/TAP device tun0 opened
Tue Nov 6 17:22:26 2018 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
Tue Nov 6 17:22:26 2018 /sbin/ifconfig tun0 46.246.86.3 netmask 255.255.255.224 mtu 1500 broadcast 46.246.86.31
Tue Nov 6 17:22:26 2018 Initialization Sequence Completed
Последняя строка говорит о том, что все прошло успешно. Проверим, изменился ли наш внешний IP:
wget -qO- http://openwrt.su/ip
Your external IP adress: 46.246.86.3
Это значит что IP подменился на шведский VPNшный. Вручную все прошло успешно.
На этом можно было бы наверное и сворачиваться, но файлы конфигурации в данном виде полезны только в случае ручного запуска openvpn. И они малость отличаются от тех конфигов, которые OpenWrt привыкла есть на завтрак. Поэтому для начала пришлось их малость конвертировать при помощи следующих действий. Начнем с сертификатов и файла авторизации. Закрываем терминал.
Как правило файл *.ovpn включают в себя не только настройки конфигурации, а также сгенерированные вашим сервисом сертификаты и ключи для подключения. Сертификаты и ключи заключены в конфигурационных файлах в специальные теги типа <ca>код</ca><cert>код</cert><key>код</key>. Желательно их выделить в отдельные файлы. То есть код, который содержится между тегами <ca>код</ca> выделить в отдельный файл ca.crt, аналогично поступить и с <cert>код</cert> в файл cert.crt и <key>код</key> в файл key.key
В абсолютном большинстве случаев подключение к VPN-серверу в виде клиента требует авторизации. Поэтому создаем также отдельный файл, например, userpass.txt где первой строкой в обычном текстовом редакторе вводим имя пользователя, а второй строкой пароль для доступа VPN, которые вы придумали при регистрации на сервисе, либо которые вам выдал провайдер VPN отдельно. Таким образом у вас уже должно быть 4 файла: ca.crt, cert.crt, key.key и userpass.txt. Заходим на роутер через WinSCP, заливаем эти файлы в папку etc/openvpn/. Там же у нас лежит *.ovpn файл скаченный ранее, так как с ним мы еще не закончили.
3. Настройка OpenVPN через Luci
Для начала смотрим опции в файле *.ovpn от нашего провайдера. У меня опции выглядят так
cat /etc/openvpn/sweden.ovpn
client
dev tun
resolv-retry infinite
nobind
persist-key
auth-user-pass
auth-nocache
remote-cert-tls server
cipher AES-256-CBC
auth SHA384
server-poll-timeout 3
proto udp
remote se.frootvpn.com 1195
sndbuf 0
rcvbuf 0
Далее переходим в меню Services - OpenVPN и вводим название какое-хотим дать нашему конфигу и выбираем тип Simple client configuration for a routed point-to-point VPN и жмем кнопку ADD. Сразу жмем на Switch to advanced configuration и имея перед глазами верхний список опций - начинаем ставить галочки и выбирать опции из выпадающих списков.
Во вкладке Networking у меня согласно конфигу от провайдера нужно установить: port 1195, dev tun0, nobind и persist_key, установить буферы
Во вкладке VPN собственно ставим галочку что мы client, скармливаем userpass.txt в графе
и переходим во вкладку Cryptography. Именно в этот момент системе как раз и нужно указать на подготовленные ранее файлы ca.crt, cert.crt, key.key, также указать ключи и алгоритмы шифрования, указать чтобы openvpn не держал в кэше данные авторизации auth_nocache, а также установить шифрование на уровне сервера в графе
Включаем галочкой наш конфиг, жмем Save & Apply. И Start. Если все прошло успешно - переходим к интерфейсу.
4. Создаем интерфейс для VPN туннеля
Без интерфейса затея работать как надо не будет. Хоть устройство tun и создалось, ему нужно присвоить интерфейс. Идем в Network - Interfaces - Add new interface. Указываем протокол Unmanaged.
Во вкладке Physical Setting выбираем Interface нашего VPN соединения tun0
И сразу создадим зону фаервола на будущее. Save and Apply и перейдем к ее настройке.
5. Настройка правил фаервола для VPN соединения
Тут на начальном этапе все просто. Input и Forward в Reject, Output в Accept. По умолчанию как и для любой другой зоны откуда приходит интернет. Галочки в Masquerading и MSS clamping. И в конце разрешить перенаправление из зоны LAN.
Чтобы в последующем клиенты LAN сети имели возможность прикрываться запущенным VPN клиентом на роутере то нужно еще в зоне LAN также настроить перенаправление в нашу новую VPN зону. Это можно сказать минимальный рабочий набор.
6. Базовая маршрутизация через OpenVPN
Как вы сумели заметить по умолчанию весь траффик идет через VPN. И абсолютно все клиенты в локальной сети будут использовать его как шлюз. Если вы добавите в опции настроек OpenVPN во вкладке Networking опцию route_noexec то наоборот все будут использовать интерфейс по умолчанию, даже если поднят VPN-клиент, до тех пор пока вы прямо не укажите кому куда идти и через что.
В качестве примера попробуем направить весь трафик от компьютера в локальной сети с адресом 192.168.1.3 через VPN, а все остальные клиенты локальной сети будут получать доступ в интернет как обычно. Для этого включаем опцию route_noexec в конфиге openvpn во вкладке Networking.
Дальше ставим пакет ip. Он как правило потянет за собой свою полную версию ip-full.
opkg install ip
Смотрим общую таблицу маршрутизации
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.40.1 0.0.0.0 UG 0 0 0 pppoe-wan
46.246.12.64 0.0.0.0 255.255.255.224 U 0 0 0 tun0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br-lan
192.168.40.1 0.0.0.0 255.255.255.255 UH 0 0 0 pppoe-wan
Смотрим существующие таблицы
cat /etc/iproute2/rt_tables
# reserved values
#
128 prelocal
255 local
254 main
253 default
0 unspec
#
# local
#
Добавляем свою таблицу с именем 10 vpn
vi /etc/iproute2/rt_tables
# reserved values
#
128 prelocal
255 local
254 main
253 default
0 unspec
10 vpn
#
# local
#
Добавляем IP-адрес машины в локальной сети в таблицу vpn
ip rule add from 192.168.1.3 table vpn
Проверяем как добавилось
ip rule list
0: from all lookup local
32765: from 192.168.1.3 lookup vpn
32766: from all lookup main
32767: from all lookup default
Прописываем указание на то, что все, кто включен в таблицу vpn, должны использовать интерфейс нашего VPN соединения tun0
ip route add default dev tun0 table vpn
Ну и сбрасываем кэш
ip route flush cache
После чего локальная машина с IP-адресом 192.168.1.3 будет отправлять и пропускать траффик только через VPN интерфейс tun0.
Комментарии
нигде не видел более подробного описания
Есть проблемка, ныне FrootVPN выдает ovpn без приватного ключа и сертификата... только CA и TLS.
Вроде раскидал куда чего нужно, Ip'шник подменяется, но соединения при поднятом VPN'e нет.
Интересный еще момент выяснился, временами выскакивает в логах "write UDP: Operation not permitted (code=1)"
Попробую еще вечерком отключить полностью ipv6, возможно в этом проблема...
Решение:
В /etc/config/dhcp
Закомментировать в разделе config dnsmasq строчку
option localservice '1'
Добавить в разделе config dnsmasq:
option localservice '0'
option noresolv '1'
list server '8.8.8.8'
list server '8.8.4.4'
Цитирую Sandrick:
Огромное спасибо, я перелопатил кучу материала а найти никак не мог в чем проблема. У меня работало 50/50 чтото открывало, а чтото нет.
Но подмены адреса не происходит сервис работает в логах есть ошибки at Feb 8 14:30:57 2020 daemon.notice openvpn(PrivateTunnel)[6555]: Attempting to establish TCP connection with [AF_INET]185.217.1.75:443 [nonblock] Sat Feb 8 14:30:57 2020 daemon.info hostapd: wlan1: STA 64:89:f1:44:bb:c7 IEEE 802.11: associated (aid 5) Sat Feb 8 14:30:57 2020 daemon.notice hostapd: wlan1: AP-STA-CONNECTED 64:89:f1:44:bb:c7 Sat Feb 8 14:30:57 2020 daemon.info hostapd: wlan1: STA 64:89:f1:44:bb:c7 WPA: pairwise key handshake completed (RSN) Sat Feb 8 14:30:57 2020 daemon.info hostapd: wlan1: STA 64:89:f1:44:bb:c7 IEEE 802.11: authenticated Sat Feb 8 14:30:58 2020 daemon.notice openvpn(PrivateTunnel)[6555]: TCP connection established with [AF_INET]185.217.1.75:443 Sat Feb 8 14:30:58 2020 daemon.notice openvpn(PrivateTunnel)[6555]: TCP_CLIENT link local: (not bound) Sat Feb 8 14:30:58 2020 daemon.notice openvpn(PrivateTunnel)[6555]: TCP_CLIENT link remote: [AF_INET]185.217.1.75:443 Sat Feb 8 14:30:58 2020 daemon.err openvpn(PrivateTunnel)[6555]: Connection reset, restarting [0] Sat Feb 8 14:30:58 2020 daemon.notice openvpn(PrivateTunnel)[6555]: SIGUSR1[soft,connection-reset] received, process restarting Sat Feb 8 14:30:58 2020 daemon.notice openvpn(PrivateTunnel)[6555]: Restart pause, 5 second(s) Sat Feb 8 14:31:03 2020 daemon.notice openvpn(PrivateTunnel)[6555]: TCP/UDP: Preserving recently used remote address: [AF_INET]185.217.1.75:1194 Sat Feb 8 14:31:03 2020 daemon.notice openvpn(PrivateTunnel)[6555]: Socket Buffers: R=[163840->163840] S=[163840->163840] Sat Feb 8 14:31:03 2020 daemon.notice openvpn(PrivateTunnel)[6555]: UDP link local: (not bound) Sat Feb 8 14:31:03 2020 daemon.notice openvpn(PrivateTunnel)[6555]: UDP link remote: [AF_INET]185.217.1.75:1194 Sat Feb 8 14:32:03 2020 daemon.err openvpn(PrivateTunnel)[6555]: TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity) Sat Feb 8 14:32:03 2020 daemon.err openvpn(PrivateTunnel)[6555]: TLS Error: TLS handshake failed Sat Feb 8 14:32:03 2020 daemon.notice openvpn(PrivateTunnel)[6555]: SIGUSR1[soft,tls-error] received, process restarting Sat Feb 8 14:32:03 2020 daemon.notice openvpn(PrivateTunnel)[6555]: Restart pause, 5 second(s)
видимо что-то не так с настройками Firewall
Цель сделать так, что все клиенты которые вонткнуты в роутер и подключены по wifi использовали VPN. Прошу помощи.
1. После разрыва соединения с VPN сервером хост начинает ходить в инет напрямую, что крайне нежелательно. Можно с этим что-то сделать?
2. После повторного подключения к VPN хост все равно продолжает ходить в инет напрямую, что тоже не хорошо
так же используйте Kill switch, чтоб роутер отрубало от инета когда впн падает.
Было хорошо если автор описал как это делать.
В целом капать надо в сторону iptables - примерно так
iptables -I FORWARD -i br0 -o $WAN_IF -j REJECT --reject-with icmp-host-prohibited
iptables -I FORWARD -i br0 -p tcp -o $WAN_IF -j REJECT --reject-with tcp-reset
iptables -I FORWARD -i br0 -p udp -o $WAN_IF -j REJECT --reject-with udp-reset
Уже три дня настраиваю связку mikrotik как openvpn server и tplink openwrt как openvpn client.
Подключение клиента к серверу происходит и в зависимости от настройи tap или tun на сервере и клиенте появляется нужный интерфейс.
И на этом интерфейсе назначается ip адрес который выдает сервер.
А вот дальше есть проблема. А именно с клиента не пингуется сервер и с сервера не пингуется клиент..
Я проверил все что только мог и даже в качестве сервера сделал виртуалку на openwrt и на ней все работает, но как только я делаю сервер на микротике, то клиент адрес от сервера получает, а пинга нет.
Я и разные версии микротиков использовал и разные ротоколы udp tcp, всегда один результат, клиент получает адрес, но пинг не идет.
Единственное пока , что не нашел, это что принцепи связка с микротом рабочая или нет.
Буду признателен за любые рекомендации.
while I am also keen of getting knowledge.
Here is my blog - пакеты строительные
easily know it, Thanks a lot.
Here is my page: Polipropilenovye-Meshki04.Ru
very well written article. I will make sure to
bookmark it and return to read more of your useful information. Thanks for the post.
I will definitely comeback.
Visit my web site мусорные мешки для строительного мусора
for ones time for this fantastic read!! I definitely really liked every bit of it and I have you
saved as a favorite to see new information on your site.
Feel free to visit my web site :: упаковочная клейкая лента
my homepage :: polipropilenovye-meshki01.ru/
Anyways, I'm definitely glad I found it and I'll be bookmarking and checking back frequently!
Here is my webpage; Polipropilenovye-Meshki05.ru/
My last blog (wordpress) was hacked and I ended up losing months of hard work due to no data backup.
Do you have any methods to stop hackers?
Take a look at my blog post :: стрейч лента
для упаковки
There's a lot of folks that I think would really enjoy
your content. Please let me know. Thank you
Here is my site ... клейкая лента упаковочная
kind of information in such a perfect manner of writing?
I've a presentation next week, and I am on the search for such information.
Here is my webpage скотч для
коробок
if like to read it then my contacts will too.
Look at my web blog - скотч профессиональный
got the bravery to go ahead and give you a shout out from Houston Tx!
Just wanted to say keep up the fantastic work!
My blog - мешок мусорный
thanks for providing such information.
Here is my web-site мешок мусорный