11 июня 2015 г. Linux VPN OpenVPN Zyxel

Настройка OpenVPN с форвардингом на роутере Zyxel Keenetic Giga II

Хотите получить из роутера практически полноценный Linux сервер с некоторым набором базовых программ на базе NDMS? В свое время, мой выбор пал на "Zyxel Keenetic Giga", он бюджетный и простой в настройке, да и в целом я в нем не разочаровался.

Однако, два года назад я так и не написал статью о том как получить из него полноценный Linux. Теперь же, мы купили себе вторую версию этого роутера "Zyxel Keenetic Giga II" и я всетаки заставил себя написать о настройке статью, поехали!

О прошивке

Сразу скажу, я усердно пробовал работать с прошивкой V2 (конкретно 2.04), но как бы я не пытался, так и не смог завести dropbear.

Почитав в интернетах о прошивке "V2", я понял что она сырая и не годится для расширения. В итоге я наткнулся на комментарий на 4pda и установил себе на Giga II прошивку "V1.11" (брал от сюда, ставил "Firmware-KEENETIC_GIGA_II-V1.11.RU.NDMS_140108210221.bin"), если файл уже не доступен, то пишите и я расшарю. Некоторые подробности о работе V1 на Giga II можно подчерпунть тут. Прошивку можно поменять в разделе "Система > Конфигурация", подробнее можно ознакомится тут.

Из-за того что мы установили прошивку V1.11 — дальнейшие инструкции также корректны и для первой версии Giga.

Расширяем Keenetic, добавляем sshd и opkg

Берем флешку от 1Гб, форматируем её в ext3 (например в GParted). Можете ознакомится с официальными требованиями к USB носителю.

Далее, идем на страницу документации о системе opkg, действуем по их инструкциям и скачиваем нужный архив тут, у меня это был "ext_init.sh-r2.tar.gz".

Теперь создаем каталоги и копируем содержимое архива:

cd </path/to/you/flash/drive>
mkdir -p system/bin
cd system/bin
wget https://zyxel-keenetic-packages.googlecode.com/files/ext_init.sh-r2.tar.gz
tar -xzf ext_init.sh-r2.tar.gz
chmod +x ext_init.sh

Проверяем права на файл "ext_init.sh", главное чтобы он был исполняемым (это мы сделали в последней строчке).

Теперь вставляем флешку в первый USB-слот (определится как "DISK_A1"), на главной странице панели администрирования Zyxel, в разделе "USB-накопитель" должна появится наша флешка. Переходим в раздел "Система > Журнал" и ожидаем примерно такую запись:

root    Starting opkg/linux install
root    All errors are logged in a file /media/DISK_A1/tmpinstall/err.log
root    Extracting busybox
root    Unpacking busybox
root    Extracting system
root    Unpacking system
root    Generating rsa/dss keys for dropbear
root    Starting dropbear
dropbear[2428]  Running in background
root    Connect to keenetic using ssh and run finish_install.sh to finish installation

Теперь вы можете подключится по SSH.

Завершаем установку

Подключаемся по ssh:

ssh root@192.168.1.1
пароль "zyxel"

Теперь перво-наперво сменим пароль:

# passwd
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

Запускаем finish_install.sh для завершения установки:

# finish_install.sh
Creating swap file. Please wait...
128+0 records in
128+0 records out
Setting up swapspace version 1, size = 134213633 bytes
Loading current packages list
Downloading http://zyxel-keenetic-packages.googlecode.com/svn/binary-packages-r2/Packages.gz.
Inflating http://zyxel-keenetic-packages.googlecode.com/svn/binary-packages-r2/Packages.gz.
Updated list of available packages in /media/DISK_A1/system/var/opkg-lists/packages.

Обновление системы и установка нужных приложений

Обновляем установленные пакеты:

# opkg update
# opkg upgrade

И доустановливаем нужные:

# opkg list | grep <нужный пакет>
# opkg install mc screen nano htop openvpn-openssl

Теперь настроим OpenVPN

Создадим файл /media/DISK_A1/system/etc/firewall.d/fw.sh с правилами для iptables со следующим содержимым:

#!/bin/sh
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -j ACCEPT
iptables -A INPUT -p udp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -t nat -F
iptables -I FORWARD 1 -i br0 -o tun0 -j ACCEPT
iptables -I FORWARD 2 -i tun0 -o br0 -j ACCEPT
iptables -I FORWARD 3 -s 192.168.1.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

Чтобы вы могли зайти на свой сервер из под VPN, добавьте перед последней строчкой:

iptables -t nat -A POSTROUTING -o eth2.2 -d "АДРЕС_VPN_СЕРВЕРА" -j MASQUERADE

Сделаем этот файл исполняемым:

# chmod +x /media/DISK_A1/system/etc/firewall.d/fw.sh

В каталоге /media/DISK_A1/system/etc/openvpn надо создать конфиг клиента openvpn.conf и положить туда предварительно сгенерированные (или полученные от какого-либо сервиса) ключи. Вот пример возможного конфига:

client
remote <IP-адрес OpenVPN-сервера>
port 1194
dev tun
proto udp
resolv-retry infinite
nobind
pull
user nobody
group nogroup
persist-key
persist-tun
ca /media/DISK_A1/system/etc/openvpn/ca.crt
cert /media/DISK_A1/system/etc/openvpn/example.crt
key /media/DISK_A1/system/etc/openvpn/example.key
tls-client
tls-auth /media/DISK_A1/system/etc/openvpn/ta.key 1
cipher DES-EDE3-CBC
comp-lzo
mute 10
verb 0
log openvpn.log

Подробности опций и как сгенерировать нужные ключи можно почитать в моей статье о OpenVPN.

Если вы захотите запустить openvpn без init-скрипта, то столнетесь с проблемой с устройством tun:
Wed Jun 10 12:41:09 2015 ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)
Эту проблему я быстро решил при помощи этой статьи, для этого надо создать каталог /dev/net и создать там файл устройства:
# mkdir /dev/net
# mknod /dev/net/tun c 10 200
Но после этого произошла новая проблема:
Wed Jun 10 12:41:50 2015 ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such device (errno=19)
Я проверил через lsmod наличие модуля "tun" и не обнаружил его:
# lsmod | grep tun
Значит надо его подгрузить, т.к. modprobe не идет в поставку с нашим Linux, то я воспользовался insmod. Я нашел подходящий модуль и загрузил его:
# find / -name "*tun*.ko"
/lib/modules/2.6.22-tc/tun.ko
/media/DISK_A1/system/lib/modules/2.6.23-rt/tun.ko
# insmod /lib/modules/2.6.22-tc/tun.ko
Теперь все впорядке, lsmod говорит что модуль подгружен.

Запускаем OpenVPN

Для того, чтобы после перезапуска системы у нас запускался демон OpenVPN самостоятельно, надо переименовать его init-скрипт из K11openvpn в S11openvpn:

# cd /media/DISK_A1/system/etc/init.d/
# mv K11openvpn S11openvpn

Добавлять вызов /media/DISK_A1/system/etc/firewall.d/fw.sh никуда не надо, он запустится автоматически.

Я столкнулся с проблемой запуска модуля tun.ko в init-скрипте. Тот что был там указан выдавал следующее:
insmod: cannot insert '/media/DISK_A1/system/lib/modules/2.6.23-rt/tun.ko': invalid module format (-1): Exec format error
в результате я нашел альтернативный и он корретно заработал:
# find / -name "*tun*.ko"
/lib/modules/2.6.22-tc/tun.ko
/media/DISK_A1/system/lib/modules/2.6.23-rt/tun.ko
# insmod /lib/modules/2.6.22-tc/tun.ko
после чего я поменял в файле S11openvpn на альтернативный модуль:
#insmod $MOUNT/lib/modules/2.6.23-rt/tun.ko
insmod /lib/modules/2.6.22-tc/tun.ko
...
#rmmod $MOUNT/lib/modules/2.6.23-rt/tun.ko
rmmod /lib/modules/2.6.22-tc/tun.ko

Впринципе всё, перезапустите роутер и должно все заработать как надо!

Обновление с zyxware на entware

Не особо рекомендую обновляться до entware, т.к. при запуске OpenVPN через init-скрипт я получал Segmentation Fault (правда если просто запускать openvpn openvpn.conf, то проблемы не наблюдалось), разбираться с этим мне не хотелось, т.к. для себя особого смысла обновляться я не видел. Главное отличие entware это большее количество пакетов чем в zyxware, так что если хочется, то попробовать всетаки можно. Ниже расскажу как это сделать:

Для этого вынем нашу флешку из роутера и запишем туда архив, который можно взять отсюда. Снова подключите флешку в первый USB-слот. В сети рекомендуют обновлятся через telnet, но я обновлялся по ssh:

# cd /media/DISK_A1
# wget http://keenetic.zyxmon.org/entware/entware_keenetic.tgz
# tar -xzf entware_keenetic.tgz
# chmod +x ./entware_keenetic_install.sh
# ./entware_keenetic_install.sh

После чего перезапустите роутер из веб-панели Zyxel. На вашей флешке, помимо каталога /system появится еще /opt. Все, теперь вы счастливый обладатель entware!

Комментарии

Дополнение: у меня были проблемы с качеством работы wifi, я грешил на многое, в том числе аппартаные проблемы (перегрев, флюс проводящий эл-во и т.д.). В итоге все было проще, в БЦ мешали друг-другу сети, а авто-режим выбирал всегда 1-ый канал. Но с помощью программы wifi-radar я выявил какой канал мне использовать (рекомендую выбирать из "неперекрывающихся" каналов 1/6/11):

sudo apt-get install wifi-radar

А также оставил только 802.11n, выбрал короткую преамбулу и уменьшил мощность сигнала до 12%. После чего исчезли коллизии.

Ещё полезно почитать http://habrahabr.ru/post/117761/ и http://habrahabr.ru/post/149447/

Вы не могли бы мне скинуть tun.ko ?
У меня ошибка
insmod: cannot insert '/media/DISK_A1/system/lib/modules/2.6.23-rt/tun.ko': invalid module format (-1): Exec format error

Но альтернативных модулей нет!

Помогите разобраться. Кинетик белый, при запуске демона пишет : Starting OpenVPN in daemon mode....failed. Где посмотреть в чем ошибка чего не хватает? Тунель не поднимает, модуль tun загружен.

Оставьте свой комментарий

Markdown