Openvpn

Материал из SynologyWiki

Перейти к: навигация, поиск

Содержание

[править] Устанавливаем OpenVPN сервер на DiskStation

[править] Введение

VPN (сокр. от Virtual Private Network, Виртуальная частная сеть) - технология, изначально разработанная для того, чтобы позволить безопасно взаимодействовать компьютерам, расположенным в разных местах, так, как будто они расположены в одной частной сети. OpenVPN — свободная реализация этой технологии.

[править] Полезные ссылки

1. http://forum.ixbt.com/topic.cgi?id=14:40906#1

2. http://forum.ixbt.com/topic.cgi?id=14:49976

3. http://openvpn.net/

[править] Проверяем возможность установки

Последние версии прошивок Synology уже идут с необходимым модулем ядра. Модуль tun.ko находится в папке /lib/modules. Проверьте это в консоли [PuTTY]:

ls /lib/modules/tun.ko
/lib/modules/tun.ko

Если команда ls вернет

ls: /lib/modules/tun.ko: No such file or directory

установите свежую прошивку.

Примечание: Ядро Synology не поддерживает L2 мосты openvpn. Настройка OpenVPN возможна только в режиме L3 туннеля dev tun.

[править] Устанавливаем пакет OpenVPN

Для установки OpenVPN на DiskStation прежде всего нужно установить IPKG.

Дальнейшая установка крайне проста. Достаточно выполнить команду

ipkg install openvpn

[править] Генерация ключей (сертификатов)

Процесс генерации ключей openvpn многократно описан на многих ресурсах. На мой взгляд проще это сделать на windows машине или linux станции. После генерации ключей перенесем нужные ключи на synology и поместим в папку

/opt/etc/openvpn

[править] Создаем скрипт запуска OpenVPN

Скрипт запуска openvpn (Sxxopenvpn.sh, где xx - цифры определяющие порядок запуска скриптов) должен быть исполняемым и расположен в папке /opt/etc/init.d Содержимое скрипта приблизительно такое:

#!/bin/sh

MODULES_BASE="/lib/modules"
KERNEL_VERSION=`uname -r`

case "$KERNEL_VERSION" in
"2.6.24")
        KERNEL_MODULES_OPENVPN="tun.ko"
        ;;
esac

success() {
        [ -n $1 ] && echo "success" || echo "$1: success"
}

failure() {
        [ -n $1 ] && echo "failed" || echo "$1: failed"
}

insmod_syno() {
        local modules=$1
        local mod
        local err=0

        for mod in $modules; do
                echo -n "$mod: "
                /opt/sbin/insmod ${MODULES_BASE}/${mod} > /dev/null 2>&1
                ret=$?
                [ $ret -eq 0 ] && success $mod || failure $mod
                err=`expr $err + $ret`;
        done

        return $err
}

rmmod_syno() {
        local modules=$1
        local mod
        local err=0

        for mod in $modules; do
                echo -n "$mod: "
                /opt/sbin/rmmod ${MODULES_BASE}/${mod} > /dev/null 2>&1
                ret=$?
                [ $ret -eq 0 ] && success $mod || failure $mod
                err=`expr $err + $ret`;
        done

        return $err
}

start() {
        local ret=0;

        echo ""
        echo "Loading OpenVPN kernel modules:"
        insmod_syno "$KERNEL_MODULES_OPENVPN"

        # Make sure IP forwarding is enabled
        echo 1 > /proc/sys/net/ipv4/ip_forward
#        echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp

        # Make device if not present (not devfs)
        if ( [ ! -c /dev/net/tun ] ) then
                # Make /dev/net directory if needed
                if ( [ ! -d /dev/net ] ) then
                        mkdir -m 755 /dev/net
                fi
                mknod /dev/net/tun c 10 200
        fi

        echo ""
        echo -n "Starting OpenVPN in daemon mode...."
        /opt/sbin/openvpn --cd /opt/etc/openvpn --daemon --config /opt/etc/openvpn/myconf.ovpn --script-security 2 --log-append /opt/var/log/openvpn/openvpn.log > /dev/null 2>&1
        ret=$?
        [ $ret -eq 0 ] && success || failure
        err=`expr $err + $ret`;

        return $err
}

stop() {

        echo ""
        echo -n "Killing OpenVPN processes...."
        if [ -n "`pidof openvpn`" ]; then
                /usr/bin/killall openvpn 2>/dev/null
        fi
        ret=$?
        [ $ret -eq 0 ] && success || failure

        sleep 1

        echo ""
        echo "Unloading OpenVPN kernel modules... "
        rmmod_syno "$KERNEL_MODULES_OPENVPN"

        return $ret
}

restart() {
        stop
        sleep 3
        start
}

case "$1" in
        start)
                start
                RETVAL=$?
                ;;
        stop)
                stop
                RETVAL=$?
                ;;
        restart)
                restart
                RETVAL=$?
                ;;
        *)
                echo $"Usage: ${0##*/} {start|stop|restart}"
                RETVAL=2
                ;;
esac

exit $RETVAL

Примечание: Если Вы собираетесь выделять для OpenVPN клиентов небольшой диапазон адресов из своей локальной-квартирной сети - раскоментируйте строку

echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp

Выделять диапазон адресов из своей сети имеет смысл для обхода spi файрвола на домашнем маршрутизаторе.

[править] Создаем файл конфигурации

Как видно из скрипта запуска, в данном случае используется файл конфигурации /opt/etc/openvpn/myconf.ovpn Создадим его и отредактируем. Мой файл конфигурации такой

port YYYY
proto udp
dev tun

ca ca.crt
cert NAS.crt
key NAS.key
dh dh1024.pem
topology subnet
local <тут локальный ip synology>
server <ip openvpn серевера> <маска подсети>
push "route <внутренний ip домашней сети> <маска домашней сети>"
client-to-client
keepalive 20 180
comp-lzo
max-clients 10
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log-append openvpn.log
verb 3
mute 20

Примечание 1: Использование строки "topology subnet" экономит ip адреса. На клиентах должна быть при этом установлена свежая версия openvpn (клиента).

Примечание 2: Если адреса для openvpn клиентов выделяются из диапазона квартирной сети, следует использовать маску с небольшим числом адресов, например, 255.255.255.240.

Примечание 3: ca.crt, NAS.crt, NAS.key,dh1024.pem - это файлы с сертификатами, созданные ранее.

Примечание 4: YYYY - это номер порта, который слушает сервер. Можно выбрать любой, стандартом является 1194. Он должен быть проброшен на Вашем роутере.

[править] Запускаем OpenVPN сервер

Для запуска OpenVPN сервера выполним команду

/opt/etc/init.d/Sxxopenvpn.sh start

где xx выбранные цифры. Проверяем, что в файле /opt/etc/openvpn/openvpn.log нет сообщение об ошибках. Если ошибки есть, останавливаем сервер

/opt/etc/init.d/Sxxopenvpn.sh stop

исправляем ошибки и запускаем заново.

Примечание При перезагрузке synology openvpn сервер будет запускаться автоматически.

[править] Настраиваем OpenVPN-клиент

[править] Скачиваем и устанавливаем клиента под Windows

Последние версии OpenVPN под Windows уже содержат GUI (графическую оболочку) для запуска OpenVPN. Скачайте и установите версию под Windows с сайта http://openvpn.net/, если Вы не сделали этого ранее для генерации ключей.

[править] Создаем файл конфигурации для клиента

В папке <X>:\Program Files\OpenVPN\config создадим файл nas_client.ovpn с таким содержанием

client
dev tun
proto udp
remote <внешний ip или ddns имя вашего сервера> YYYY
resolv-retry infinite

nobind


ca "<X>:\\Program Files\\OpenVPN\\config\\nas\\ca.crt"
cert "<X>:\\Program Files\\OpenVPN\\config\\nas\\work.crt"
key "<X>:\\Program Files\\OpenVPN\\config\\nas\\work.key"

comp-lzo
verb 3

Тут .crt и .key - файлы с сертификатами клиента, созданные ранее. YYYY - номер порта.

[править] Соединение с сервером

Если клиент установлен под Windows, запускаем утилиту "OpenVPN GUI". В трее появится соответсвующий значок. Выберем правой кнопкой мыши файл конфигурации (nas_client). Файлов конфигурации может быть много. Если файл один - то выбирать не нужно. Далее выберем connect. Если соединение будет успешным - иконка OpenVPN GUI позеленеет. Вы успешно установили зашифрованный канал в свою домашнюю сеть.

Если соединения не произойдет - анализируем логи.

Теперь мы можем управлять DS по адресу <локальный ip в вашей домашней сети>:5000. Доступ к расшаренным папкам DS и домашних компов может быть осуществлен по внутренним ip (не по именам).

Использованы материалы форума http://forum.synology.com/enu/index.php и скрипт dino.

--Zyxmon 10:08, 23 июля 2010 (UTC)