Доброго времени суток!
Недавно у меня появилась необходимость обеспечить доступ в интернет всех пользователей домашней сети через 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. Это можно выполнить с помощью веб интерфейса. Примеры на скриншотах ниже:
Данное решение успешно протестировано работает на роутере TP-Link WR841N, так же оно подойдет для других поддерживаемых OpenWRT устройств, имеющих ROM 4 мегабайта.
Автор: cyreex