24 октября, 2021

VPN туннель через роутер с 3G модемом

Это статья о том, как с помощью роутера, поддерживающего 3G модемы, подключаемые в порт USB, организовать VPN туннель для устройств в локальной сети. На самом деле это всё понадобилось по одной простой причине — как оказалось, у провайдера «Интертелеком», так называемые «коробочные решения», т.е. модемы, продваемые с вшитым номером и готовым подключением, при выходе в интернет получают ip-адреса из «серого» диапазона. Из-за этого такое подключение становится непригодным для использования его снаружи — подключиться к видеонаблюдению, например, или еще какому-нибудь сервису внутри локальной сети из интернета невозможно.

На сегодняшний день описанная тут прошивка устарела, а с новой её версией не всё гладко — для поддержки всех описанных возможностей в роутере нехватает памяти. Проблему решает кастомная прошивка, подробности по ссылке: Прошивка OpenWRT для роутера TP-link TL-MR3220.

В моем случае ситуация была такой: есть офис с сервером, на удаленной точке устанавливался кассовый аппарат, сервер из офиса должен делать запрос на кассовый аппарат и получать с него данные продаж. Т.е. необходимо организовать связь так, чтобы сервер видел кассу. Самый простой вариант — установить на точке роутер, в котором есть поддержка служб вроде Noip или DynDNS, подключить роутер к интернету, открыть нужный порт на кассовый аппарат. И вот тут получилась загвоздка. Выходом в интернет был 3G-модем и он при соединении с провайдером получал «серый» ip. Тогда необходим вариант посложнее, нужен vpn-сервер, нужен роутер, который сможет работать как vpn-клиент и будет делать это автоматически, без лишнего вмешательства. Идеальным вариантом мне кажется использование с обеих сторон роутеров Mikrotik, например RB751. Но есть еще одно препятствие.

Не все модемы из тех что есть в продаже подходят для использования в роутерах и наоборот, не все роутеры, которые работают с модемами, поддерживают те модемы, что есть в продаже.

Я составил список модемов, которые были в наличии у нас в магазинах и список роутеров, которые доступны, ну и соотвественно выписал списки поддерживаемых модемов для каждого роутера. У меня получилась всего одна подходящая парочка: роутер TP-link TL-MR3220 и модем Huawei EC306. Еще одно важное свойство этого роутера — для него есть прошивка OpenWrt, в которой, собственно, и есть нужные функции по поднятию vpn-туннеля.

Прошивка
Первое, что нужно будет сделать — прошить роутер. Прошивки для роутеров TP-Link лежат тут: Wiki OpenWrt

Прошивка которую использовал я: r42625, это вариант прошивки с веб-интерфейсом Luci.

На сегодняшний день актуальная версия прошивки r46767, в указанной выше уже не работают функции загрузки пакетов, вернее не работают ссылки, вшитые в прошивку.

Настройка 3G модема
После того как роутер прошит, он не будет сразу работать с модемом, для этого нужно добавить недостающие пакеты.

Чтобы добавить пакеты нужно подключить роутер к интрнету. Проще всего — вставить в wan порт кабель от другого роутера, по которому наш подопытный получит настройки по dhcp и выйдет в интернет. Можно использовать для выхода в интернет и wifi.

После того как интернет подключен заходим в раздел System — Software
openwrt-system-software
Сначала нужно нажать Update lists, будет получен список доступных пакетов, в разделе Available packages выбрать необходимые:

comgt
kmod-usb2
kmod-usb-serial
kmod-usb-serial-option
kmod-usb-serial-wwan
kmod-usb-acm
usb-modeswitch
luci-proto-3g

После установки пакетов нужно вставить модем, в разделе System — Startup нужно проверить чтобы все опции запуска были включены (Enabled), и перезагрузить роутер.
После того как поддержка usb и протокол установлены нужно добавить новый сетевой интерфейс: в разделе Network — Interfaces. При создании нового интерфейса в поле выбора протокола должен быть доступен пункт UMTS/GPRS/EV-DO, после его выбора появятся поля для ввода параметров подключения: APN, username, password.
openwrt-network-3g
В настройках 3G интерфейса, на закладке Firewall settings нужно выбрать зону wan.
Теперь можно отключить те настройки, которые были сделаны для подключения роутера к интрнету (кабель или wifi) и перезагрузить роутер — должна установиться связь через модем.

Настройка VPN
Для vpn-подключения я использовал протокол pptp. По тому же принципу, что и при настройке модема, нужно в сетевых интерфейсах добавить новый, с использованием протокола pptp. Если такого варианта при выборе протоколов нет, нужно добавить пакеты с поддержкой этого протокола. В свойствах интерфейса нужно будет указать адрес сервера vpn, логин и пароль. На вкладке Firewall settings нужно добавить новую зону с произвольным именем, например ‘vpn’. Если всё настроено верно, после сохранения настроек роутер сразу установит связь с сервером.
Теперь нужно добавить правило для трафика между локальной сетью и vpn. В разделе Network — Firewall — Traffic rules создаем New forward rule, источник (Source zone) — lan, назначение (Destination zone) — vpn, действие (Action) — Accept. В том же разделе, на вкладке General settings для зоны VPN нужно убрать блокировку входящего и исходящего трафика и включить Masquerading.
openwrt-firewall-zones

на последней версии прошивки наблюдались проблемы при установке соединения по pptp протоколу, для устранения проблем необходимо проверить наличие и доустановить пакеты:
gre
kmod-gre
kmod-nf-nathelper-extra

Для проверки прохождения трафика через vpn можно зайти в браузере на любой сервис проверки «моего ip», должен определиться ip адрес vpn-сервера к которому мы установили подключение.

Примерно так выглядит страница со списком сетевых интерфейсов после настройки всех нужных соединений:
openwrt-network-interfaces

Открываем порты
Последний этап настройки — открываем порты по которым можно будет обратиться к устройствам снаружи через созданный туннель.
Раздел Network — Firewall — Port Forwards. У меня почему-то сразу не выбирались нужные зоны, по этому я вписал нужные порты, добавил правило и уже потом отредактировал его как надо. А надо из зоны «vpn» с порта «нужный нам внешний порт» на адрес «указываем адрес устройства в локальной сети» на порт «нужный порт на устройстве» в зоне «lan». Т.е. зона vpn это в нашем случае внешняя зона (External) а локальная сеть — внутренняя (Internal).

Теперь всё должно работать. При обращении из локальной сети vpn-сервера на клиентский ip, который получает наш роутер по настроенному порту мы попадем на нужный порт устройства, подключенного к роутеру.