MyCloud EX2 Ultra: OpenVPN

Собственно решили у одного из сотрудников временно расположить его. Теперь необходимо поднять OpenVPN Client и задачка оказалась не из простых.

ФИРМЕННЫЙ ВАРЬ

Дело в том, что какие бы изменения не внес все это похерится после ребута. Потому писать скрипт в файловой системе смысла нет. Покопавшись обнаружил cron. Погуляв по форумам узнал, что можно оказывается задавать задачи для cron в /usr/local/config/config.xml и настройки переживают ребут. Есть также вариант с пересборкой ядра во время которого и надо все необходимое воткнуть прямо в прошивку, но я решил не утруждаться.

Пришла в голову идея расположить скрипт и конфигурацию OpenVPN клиента на веб-сервере одного из виртуальных машин. Благо в системе присутствует wget.

НАСТРОЙКА СИСТЕМЫ

Открываем /usr/local/config/config.xml, ищем строку cron и вносим следующие изменения:

<list>
	...
	# id лучше поставить последний
	<name id="10">openvpn</name>
	...
</list>
<openvpn>
	<item id="1">
		<method>3</method>
		<1>*</1>
		<2>*</2>
		<3>*</3>
		<4>*</4>
		<5>*</5>
		<run>[[ ! -e  /tmp/bootscript-run ]] && wget http://vm_ip/neaZee8Z -O /tmp/openvpn.sh && sh /tmp/openvpn.sh</run>
	</item>
</openvpn>

Как видим задача стоит на ежеминутное выполнение с той ремаркой, что если не существует файл bootscript-run, то wget пойдет качать файл с названием neaZee8Z, который будет сохранен как openvpn.sh и далее происходит его запуск. Иначе ничего не произойдет.

Теперь накидаем скрипт запуска OpenVPN. Его я создал на виртуальной машине в /var/www/html в виде файла neaZee8Z (сгенерировано на pwgen) на который по дефолту настроен nginx в ubuntu:

#!/bin/bash

BOOTRUN=/tmp/bootscript-run

if [ -f $BOOTRUN ]; then exit 0
fi
touch $BOOTRUN

ifconfig egiga0:1 192.168.38.6 netmask 255.255.252.0
wget http://vm_ip/Haelo6di -O /tmp/client.ovpn
openvpn.bin --config /tmp/client.ovpn &

В этом скрипте видно, что wget скачивает файл Haelo6di, который является конфигурационным файлом клиента OpenVPN. После загрузки он переименовывается в файл client.ovpn и происходит запуск клиента. Также скрипт нацепляет в качестве alias старый адрес сервера, чтобы программисты не переписывали свои скрипты для сборки проектов.

Предположим, что туннельная сеть 172.37.0.1, офисная сеть 192.168.37.0/22, сеть удаленщиков 192.168.4.0/22. Удаленщики у нас подключаются через другой инстанс OpenVPN (peer to peer) с Active Directory аутентификацией. Конфигурация клиента OpenVPN:

dev tun
verb 1
script-security 3
daemon
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
proto udp
cipher AES-128-CBC
auth SHA256
remote vpn_server_ip server_port
# ifconfig указываем в формате ip -> gateway
ifconfig 172.37.0.2 172.37.0.1
# маршрут до офисной сети
route 192.168.37.0 255.255.252.0
# маршрут до сети удаленщиков
route 192.168.4.0 255.255.252.0
<secret>
#
# 2048 bit OpenVPN static key
#
# здесь ключ
</secret>
comp-lzo adaptive
resolv-retry infinite
fast-io
sndbuf 524288
rcvbuf 524288

На сервере OpenVPN в Remote Network (у нас pfSense) указываем адреса сервера: 192.168.0.106/32, 192.168.38.6/32. В роутере за которым находится EX2 Ultra в настройках DHCP сервера резервируем ему адрес.

Перезагружаем сервер и после того, как поднимется ждем еще одну минуту пока отработает скрипт и проверяем. Все работает.