OpenWrt + VPNclient для роутера с 4mb ROM

Доброго времени суток, Хабр!

Недавно у меня появилась необходимость обеспечить доступ в интернет всех пользователей домашней сети через OpenVPN. Изначально для этих целей использовался древний IBM NetVista 6646-Q1G c Linux Centos 6 на борту.

Справлялся он с данной задачей хорошо, но, как говорится, нет предела совершенству. Захотелось заменить его на что-либо более компактное. Изначально выбор пал на Raspberry Pi Model B, но смущала цена в 50$, ведь с задачей, которую он должен был выполнять, успешно справлялся и текущий сервер. Я приступил к изучению альтернативных вариантов. И нашел, как мне показалось, идеальное решение – роутер + прошивка DD-WRT, которая содержит клиент OpenVPN. Далее настал черед выбора роутера. Я остановился на TP-Link WR841N. Поиск по базе показал, что DD-WRT его поддерживает.

Буквально в тот же день девайс был приобретен и прошит. Но тут меня ждало разочарование – в веб интерфейсе на вкладке VPN отсутствовала возможность настройки клиента OpenVPN. Найти причину данной несправедливости помог google очень быстро: “OpenVPN is only available on units with at least 8mb flash (except the Broadcom VPN build.)”.
Как говорят мудрейшие, внимательно читайте договор документацию.

Ладно, так даже интереснее. Беглый поиск альтернативных прошивок привел меня к OpenWRT. Ее отличие от DD-WRT в том, что в ней есть менеджер пакетов opkg с неплохим репозиторием и имеется возможность гибко настроить систему под свои нужды. Фактически, это очень сильно облегченная версия linux.

В OpenWRT настроить OpenVPN из коробки не получилось – проблема та же, что и с DD-WRT. Но, благодаря архитектуре данной прошивки, надежда, что все получится, была. Довольно много свободного места было обнаружено в tmpfs:

root@OpenWrt:~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
rootfs                    1088       352       736  32% /
/dev/root                 2048      2048         0 100% /rom
tmpfs                    14608      3256     11352  22% /tmp
tmpfs                      512         0       512   0% /dev
/dev/mtdblock3            1088       352       736  32% /overlay
overlayfs:/overlay        1088       352       736  32% /

Как понятно из названия, в /tmp монтируется оперативная память роутера. Несколько минут гугления привели меня на страницу с вариантом решения данного вопроса.
К сожалению, мне он не подошел, так как после установки пакетов kmod-tun, liblzo и libopenssl в корневой файловой системе осталось критически мало места. Поэтому было принято решение немного модернизировать этот мануал. Вот что у меня получилось.

1. Подключаемся к роутеру по ssh и выполняем команды:

opkg  update
opkg install kmod-tun zlib liblzo
mkdir /etc/openvpn
touch /etc/init.d/openvpn
chmod +x /etc/init.d/openvpn

2. Редактируем init скрипт:

vi /etc/init.d/openvpn

#!/bin/sh /etc/rc.common

START=99

start() {
    local TMPPATH=/tmp/openvpn
    [ ! -d ${TMPPATH} ] && mkdir ${TMPPATH}
    cd ${TMPPATH}
    opkg update || exit 1 
    tar xzf $(opkg download libopenssl | grep Downloaded | cut -d\  -f4 | sed '$s/.$//') 
    tar xzf data.tar.gz 
    tar xzf $(opkg download openvpn | grep Downloaded | cut -d\  -f4 | sed '$s/.$//')
    tar xzf data.tar.gz                                                              
    rm -f pkg.tar.gz data.tar.gz control.tar.gz debian-binary getopenvpn.sh          
    for i in $(ls ${TMPPATH}/usr/lib)                                                                              
        do                                                                                                         
        [ ! -f /usr/lib/$i ] && ln -s  /tmp/openvpn/usr/lib/$i  /usr/lib/$i                                        
        done                                                                                                       
    ${TMPPATH}/usr/sbin/openvpn  --writepid /tmp/ovpn_ciberterminal.pid --daemon --cd /etc/openvpn --config my.conf
        }                                                                                                           
                                                                                                                   
stop() {                                                                                                           
       PIDOF=$(ps | egrep openvpn | egrep  -v grep | awk '{print $1}')                                             
       kill ${PIDOF}                                                                                               
       }   

3. Копируем в папку /etc/openvpn файл конфигурации (в нашем случае my.conf), сертификаты и ключ.

4. Запускаем openvpn:

/etc/init.d/openvpn start

Если все прошло успешно, то при выполнении команды ifconfig увидим новый tun или tap интерфейс. Пример:

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.54  P-t-P:10.8.0.53  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:100558 errors:0 dropped:0 overruns:0 frame:0
          TX packets:78362 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:85115045 (81.1 MiB)  TX bytes:16184384 (15.4 MiB

Если соединение не установилось, можно попробовать найти ошибку с помощью команды:

logread -f

Далее необходимо добавить сетевой интерфейс и настроить фаервол для того, чтобы пустить трафик клиентов через VPN. Это можно выполнить с помощью веб интерфейса. Примеры на скриншотах ниже:

image

image

Данное решение успешно протестировано работает на роутере TP-Link WR841N, так же оно подойдет для других поддерживаемых OpenWRT устройств, имеющих ROM 4 мегабайта.
Поделиться публикацией
Комментарии 31
    +1
    Скажите, какая максимальная скорость работы OpenVPN получилась? И какой именно у вас роутер (их несколько ревизий было выпущено)
      +1
      Примерно 4Мб/с — она уперлась в максимальную скорость доступа в интернет для моего тарифного плана.
        +1
        Ревизия v.8.0
          +1
          Я выжимал на OpenVPN (OpenWRT) и TP-Link 1043ND 32 Мбит/с, но это только при iperf-е. В реальности рутер ложился раньше этой скорости на более мелких пакетах.
            0
            А не подскажете коим образом? У меня на TP-Link 1043ND rev1.2 iperf ноут-роутер выдает максимум 8-9 мбит/с
              0
              У меня на TP-Link 1043ND rev1.2 iperf ноут-роутер выдает максимум 8-9 мбит/с
              Значит что-то неверно.
              Вот TP-LINK по метро(!)сети без туннелей:

              [ 3] 0.0-10.0 sec 111 MBytes 93.2 Mbits/sec
          +4
          Если не хватает места в rootfs — нужно выпиливать Luci и uhttpd. Тогда openvpn туда влезет абсолютно свободно.
            0
            Согласен. Но для этого необходимо пересобирать прошивку. К тому же я хотел оставить возможность управления через веб интерфейс.

            Надежность работы данного решения зависит только от доступности репозитория в момент перезапуска роутера (ну и, конечно, от наличия доступа в интернет). Как вариант, можно перестраховаться и выложить закачиваемые файлы на компьютере в локальной сети или на внешнем хранилище (например в dropbpx). Для этого надо будет внести минимальные правки в init скрипт.
              0
              Удваиваю коммент artemlight, только дополню, что luci и uhttpd вполне себе тоже помещаются. Проверял на тп-линковских роутерах с 4мб флеш-памяти.
              Если интересно, могу даже готовую копипасту тут выложить.
                0
                Да, конечно интересно.

                Конкретно в моем роутере, как я писал в посте, пакеты kmod-tun, zlib liblzo и libopenssl заняли практически все свободное место. Openvpn устанавливать было уже некуда.
                  +2
                  данная паста актуальна для текущего транка.
                  на правах копипасты:
                  make -j4 image PROFILE="TLWR720" PACKAGES="base-files busybox dnsmasq dropbear firewall iptables iw jshn kernel kmod-ath kmod-ath9k kmod-ath9k-common kmod-cfg80211 kmod-crypto-aes kmod-crypto-arc4 kmod-crypto-core kmod-crypto-hash kmod-crypto-manager kmod-crypto-pcompress kmod-gpio-button-hotplug kmod-ipt-conntrack kmod-ipt-core kmod-ipt-nat kmod-ipt-nathelper kmod-leds-gpio kmod-ledtrig-default-on kmod-ledtrig-netdev kmod-ledtrig-timer kmod-ledtrig-usbdev kmod-lib-crc-ccitt kmod-mac80211 kmod-nls-base kmod-ppp kmod-pppoe kmod-pppox kmod-slhc kmod-usb-core kmod-usb-ohci kmod-usb2 libblobmsg-json libc libgcc libip4tc libjson-c libjson-script libnl-tiny libpthread libsqlite3 libubox libubus libuci libxtables mtd netifd opkg ppp ppp-mod-pppoe procd swconfig uboot-envtools ubox ubus ubusd uci luci openvpn-polarssl -wpad -wpad-mini hostapd-mini -hostapd -kmod-ipv6 -6relayd -ip6tables -kmod-ip6tables -kmod-ipv6 -libip6tc -odhcp6c iperf coreutils-stty" FILES="FILES_720"
                  

                  где
                  PACKAGES набор пакетов включаемых в прошивку и исключаемых из нее(-)
                  PROFILE имя роутера в openwrt
                  FILES директория в которой лежат файлы пользователя, например etc.
                  вот что у меня там хранится.
                  etc
                  etc/sysctl.conf
                  etc/shells
                  etc/config
                  etc/config/uhttpd
                  etc/config/network
                  etc/config/ucitrack
                  etc/config/firewall
                  etc/config/dropbear
                  etc/config/openvpn
                  etc/config/ubootenv
                  etc/config/wireless
                  etc/config/luci
                  etc/config/system
                  etc/config/dhcp
                  etc/dropbear
                  etc/dropbear/dropbear_rsa_host_key
                  etc/dropbear/dropbear_dss_host_key
                  etc/hosts
                  etc/openvpn
                  etc/openvpn/%CENSORED%.key
                  etc/openvpn/%CENSORED%.crt
                  etc/openvpn/ca.crt
                  etc/openvpn/ta.key
                  etc/openvpn/dh1024.pem
                  etc/openvpn/openvpn.conf
                  etc/profile
                  etc/sysupgrade.conf
                  etc/group
                  etc/shadow
                  etc/passwd
                  etc/rc.local
                  


                  +1
                  У меня небольшой офф к вам, как к (очевидно) специалисту по OpenWrt. Не подскажите, как организовать конфигурацию OpenWRT устройства в качестве клиента? Вот тут есть рекомендации, но у меня устройство не Broadcom, и на строчку
                  option type broadcom
                  OpenWRT ругается. Какой там можно тип использовать, посоветуете? Или хотя бы как выяснить, какие именно типы поддерживает данная сборка OpenWRT?
                    0
                    к сожалению, не 100% подскажу, т.к. специалистом по OpenWrt не являюсь, просто по работе пришлось столкнуться и решить конкретно вышеобозначенную проблему «впихивания» openvpn в прошивку.
                    нужно получить ethernet-порт «воткнутый» в wifi-сеть? правильно я задачу понял?
                    не знаю, какие могут быть тонкости в openwrt, но на обычном linux не вижу проблемы «сбриджевать» беспроводной и проводной интерфейс.
                      0
                      В качестве клиента чего? OpenVPN или WiFi? Для OpenVPN — конфигурационный файл чуть другой (стандартный), для WiFi через Веб на WiFi вкладке Network -> WiFi -> Scan и на нужной сети жмём Join Network.
                        0
                        в общем я проверил на своем роутере(tp-link 703) и подтверждаю, когда вай-фай адаптер роутера работает в режиме клиента, добавить его в бридж нет возможности. с relayd тоже не завелось.
                          0
                          Получалось завести как раз только с помощью relayd на TP-LINK 1043ND. Полагаю, что должно работать и на 703-м.
                    0
                    Хотел было написать это, но уже увидел сообщение :)
                      0
                      Так их же и так нет из коробки. По крайней мере, ставлю образы на WR741N из trunk, там эти пакеты не предустановлены. Более того, текущие версии этих пакетов у меня не влезли в 4 МБ. И да, интерфейс у LuCI сейчас другой (на бутстрапе).
                      +1
                      Пробовал на NETGEAR WNR3500L V2 с самой свежей прошивкой Tomato. Разочаровался вытягивает 10-20 Мбит/c, при скорости канала 70 Мбит/c. При локальном клиенте скорость работы OpenVPN перекрывает весь канал в 70 Мбит/c. Пришлось отказаться от openvpn на роутере, нужна железяка посерьезней.
                        0
                        Можно также выбрать тип VPN побыстрее.
                        0
                        Если у вас будут wifi клиенты — зря вы купили 841. У него проблемы с wifi и они вас рано или поздно замучают :(

                        А за статью плюсанул :)
                          0
                          хотя, wifi_watchdog вас по идее до момента замены устройства — вполне спасет :)
                            0
                            Спасибо за подсказку! Действительно, проблемы с wi-fi проскакивали пару раз, но я не успел их локализовать. Сейчас настроил wifi_watchdog и временно включил запись логов в файл.
                            0
                            А что скажете насчет wdr4300? У него с wifi и в остальном нет проблем? А то поглядываю на него, переживаю…
                              0
                              У меня на нём был очень странный глюк, причину которого выявить я не смог. При просмотре видео по сети через встроенный коммутатор наблюдались лаги на видео с FullHD. Замена прошивки на OpenWRT не помогла. В той же ситуации на WR1043ND и Linksys проблем нету.
                                0
                                Хм, интересно, спасибо за информацию!
                                0
                                честно говоря, учитывая его стоимость, я бы скорее брал mikrotik 751/951
                                  0
                                  Ну, я посматривал в их сторону, но как-то они меня немного смущают, меня интересует usb, знаю, что у 951Ui он есть, так же смущает отсутствие внешних антенн, еще я ориентируюсь на прошивку OpenWRT, а не на их собственную закрытую по непонятным мне причинам, с непонятно какими бэкдорами, которую необходимо изучать отдельно, но инфы по их перепрошиванию на оную очень мало (видимо из-за малой распространенности), да и то, что находится свидетельствует о достаточной геморройности этого дела и возможных проблемах с поддержкой железа…
                              0
                              Хочу немного дополнить личным опытом. Тот же 841n с openwrt 12.09 stable, все по вашему рецепту работает, кроме автозапуска. Делаю ../init.d/openvpn enable, в итоге после ребута openvpn стартует, но не принимает почему то от сервера роутинг. Решил проблему так:
                              ../init.d/openvpn disable
                              #В rc.local дописываю путь к скрипту в котором:
                              sleep 300 && /etc/init.d/openvpn start
                              # sleep 300 потому что пока все поднимется, чтобы так сказать наверняка)
                                +1
                                Однозначно неправильный вариант. Когда применяется sleep — значит пользователь не разобрался с инструментом.
                                  0
                                  В моем случае надо дописывать алгоритм — если pppoe-wan поднялся, ping пошел и.т.п., легче sleep на 5 мин дописать.
                                  И факт остается фактом, ../init.d/openvpn enable не работает. И в данном случае тоже можно было бы разобраться, но зачем?

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое