Pull to refresh

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

Reading time 3 min
Views 82K
Доброго времени суток, Хабр!

Недавно у меня появилась необходимость обеспечить доступ в интернет всех пользователей домашней сети через 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 мегабайта.
Tags:
Hubs:
+4
Comments 31
Comments Comments 31

Articles