spvd.ru
spvd.ru
Павел Селиванов. Статьи, обзоры, заметки

OpenVPN туннель между двумя роутерами с прошивкой DD-WRT

Для построения распределённых VPN-сетей существует специально предназначенное оборудование, но иногда стоит обратить внимание и на другие возможности. В этой статье речь пойдёт о построении между двумя сетями туннеля на базе OpenVPN со статическим ключом с помощью двух недорогих роутеров и известной альтернативной прошивки DD-WRT.

Соединять VPN-туннелем я буду два устройства разных производителей. Первое из них это уже довольно давно выпускаемый Wi-Fi маршрутизатор Linksys WRT54GL (тремя годами ранее я уже посвящал ему обзор).

Linksys WRT54GL базируется на чипе Broadcom 5352, работающем на частоте 200 МГц, имеет на борту 4 Мб флэш-памяти и 16 Мб оперативной. Построен по классической схеме 1 WAN + 4 LAN + Wi-Fi (802.11g).

Собственно говоря, когда-то именно выпуск этой модели очень поспособствовал расцвету альтернативных прошивок для роутеров. При разработке встроенного ПО маршрутизатора WRT54G ревизии 4.0, прародителя модели WRT54GL, в дело пошёл код, распространяемый по лицензии GPL, что, в свою очередь, обязывало разработчика опубликовать исходные коды получившейся прошивки, что и было сделано. Публикация исходных кодов дала старт многим альтернативным проектам.

Второй маршрутизатор, Asus RT-N10, намного моложе первого.

Asus RT-N10 относится к классу недорогих домашних Wi-Fi маршрутизаторов с ограниченной поддержкой стандарта беспроводных сетей 802.11n. С маршрутизатором от Linksys его роднит всё та же классическая схема 1 WAN + 4 LAN + Wi-Fi и выбор Asus в качестве основы для него чипа от Broadcom (не путать с RT-N10+, он же ревизия B, на базе Ralink RT3050F). Под корпусом Asus RT-N10 скрывается чип Broadcom 5356, работающий на частоте 300 МГц, 4 Мб флэш-памяти и 16 Мб RAM.

Для построения туннеля в оба устройства была установлена прошивка DD-WRT, и все дальнейшие описанные действия стали возможны благодаря ей, поэтому для построения аналогичного туннеля подойдут и любые другие устройства, для которых существует прошивка DD-WRT с OpenVPN.

Linksys WRT54GL был перепрошит версией v24 preSP2 Build 13064 VPN Generic.

Asus RT-N10 – v24 preSP2 Build 14896 K2.6 OpenVPN Small.

В дальнейшем, говоря об основном устройстве, я буду иметь ввиду маршрутизатор от Linksys, а о клиентском – от Asus. Поскольку подготовка обоих устройств к установке VPN-туннеля выполняется аналогично, скриншоты приведу только для одного из них.

VPN версия прошивки DD-WRT предлагает веб-интерфейс к конфигурации демона OpenVPN с полным набором сертификатов и ключей.

Будем иметь ввиду на будущее, но для начала я предлагаю воспользоваться более простым вариантом с единственным статическим ключом. Сделать это можно благодаря функции прошивки DD-WRT, позволяющей написать собственный набор скриптов, исполняемых во время загрузки устройства.

Начнём с клиентского маршрутизатора, в качестве которого здесь выступает Asus RT-N10. Нам потребуется два скрипта, Startup и Firewall.

Примеры скриптов для клиентского устройства:

# Startup скрипт
# Переход в каталог с разрешением на запись
cd /tmp
# Запись файла конфигурации для OpenVPN
echo "
remote 10.10.10.10
proto udp          
port 1194
dev tun0
secret /tmp/static.key
verb 3
comp-lzo
keepalive 15 60
daemon
" > client1-main.conf
# Запись файла секретного ключа
echo "
-----BEGIN OpenVPN Static key V1-----
72284f697134abab6e03c4e51f3496c2
fb1c23fc6c610d02b10d3645499e94d0
33b1c9aa9d2ba504936e5c07fe34e6d7
d9116a7297ac1a07109a8026ed84820c
934a3502073a0fc48b77a1cc306ca2fd
100204cedf60b2f226381e472e6ffcdf
dd227bdabac70dbea5f42336b3ff6aac
56804c7bb65f187ccac5ea04dacfded1
87a1e6c88cdf34b865c32f45bc62302a
7e7f606ef67b6ba6e8f327f374107cb7
b05bcf754d14ad2fdcdabf6c5d4ff575
e92dd17a844872706536226146095d40
0a447916430f2e93bd4f16b8a76ff712
1769a3f2419b5cc55e1b6da95e1157fc
2d4db4581a50a66fa3bcabf38dc18779
9f11829ee35d14ffab1279742aebd031
-----END OpenVPN Static key V1-----
" > static.key
# Линк на запускаемый файл демона OpenVPN
ln -s /usr/sbin/openvpn /tmp/myvpn
# Создание туннельного интерфейса и его настройка
/tmp/myvpn --mktun --dev tun0
ifconfig tun0 10.0.1.2 netmask 255.255.255.0 promisc up
# Маршрут в сеть за основным роутером через его туннельный интерфейс
route add -net 192.168.0.0 netmask 255.255.255.0 gw 10.0.1.1
# Ждем несколько секунд
sleep 5
# Инициализация туннеля в соответствии с настройками из файла конфигурации 
/tmp/myvpn --config client1-main.conf
# Firewall скрипт, разрешение на приём пакетов
# и их перенаправление через соответствующие интерфейсы
iptables -I INPUT 2 -p udp --dport 1194 -j ACCEPT
iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -o br0 -j ACCEPT

Вот так выглядит страница интерфейса настройки DD-WRT с сохранёнными скриптами:

Настройка другого, основного в нашем примере, маршрутизатора аналогична, с минимальными отличиями в скриптах. Пример:

cd /tmp
echo "
proto udp          
port 1194
dev tun0
secret /tmp/static.key
verb 3
comp-lzo
keepalive 15 60
daemon
" > main-client1.conf
echo "
-----BEGIN OpenVPN Static key V1-----
72284f697134abab6e03c4e51f3496c2
fb1c23fc6c610d02b10d3645499e94d0
33b1c9aa9d2ba504936e5c07fe34e6d7
d9116a7297ac1a07109a8026ed84820c
934a3502073a0fc48b77a1cc306ca2fd
100204cedf60b2f226381e472e6ffcdf
dd227bdabac70dbea5f42336b3ff6aac
56804c7bb65f187ccac5ea04dacfded1
87a1e6c88cdf34b865c32f45bc62302a
7e7f606ef67b6ba6e8f327f374107cb7
b05bcf754d14ad2fdcdabf6c5d4ff575
e92dd17a844872706536226146095d40
0a447916430f2e93bd4f16b8a76ff712
1769a3f2419b5cc55e1b6da95e1157fc
2d4db4581a50a66fa3bcabf38dc18779
9f11829ee35d14ffab1279742aebd031
-----END OpenVPN Static key V1-----
" > static.key
ln -s /usr/sbin/openvpn /tmp/myvpn
/tmp/myvpn --mktun --dev tun0
ifconfig tun0 10.0.1.1 netmask 255.255.255.0 promisc up
route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.0.1.2
sleep 5
/tmp/myvpn --config main-client1.conf
iptables -I INPUT 2 -p udp --dport 1194 -j ACCEPT
iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -o br0 -j ACCEPT

В примерах у основного маршрутизатора внутренний интерфейс 192.168.0.1/24, внешний 10.10.10.10, адрес туннельного интерфейса 10.0.1.1, у клиентского 192.168.1.1/24, 10.10.10.20 и 10.0.1.2 соответственно. В качестве транспорта выбран протокол UDP, включена компрессия и каждые 15 секунд проверяется, отвечает ли маршрутизатор на другом конце туннеля.

Остаётся вопрос, где же взять секретный ключ? Ответ прост – сгенерировать с помощью OpenVPN. Не используйте ключ, приведённый в примерах выше! Поскольку у меня всегда под рукой есть работающая система с ОС FreeBSD, я просто установил OpenVPN из коллекции портов. Если же вы пользователь Windows, скачайте и установите соответствующий пакет OpenVPN с официального сайта.

Для генерации статического ключа полная установка не требуется, достаточно только компонентов OpenVPN User-Space и библиотек OpenSSL и PKCS#11. Затем надо зайти в каталог, куда установился openvpn.exe, выполнить команду

openvpn --genkey --secret static.key

и скопировать ключ из свежесозданного текстового файла static.key.

И напоследок неплохо было бы оценить потенциальные скоростные характеристики созданного туннеля. Для быстрой оценки скорости передачи данных я традиционно пользуюсь кроссплатформенной утилитой NETIO версии 1.26.

Практический предел скорости передачи данных по туннелю между маршрутизаторами Linksys WRT54GL и Asus RT-N10 оказался чуть более 450 КБ/с (около 3,5 Мбит/с), что немного, но достаточно для не очень скоростных подключений к интернету.

Отдельная благодарность Сергею Жидкову, г. Новосибирск, за предоставленный маршрутизатор Linksys WRT54GL.

Во второй части рассказано, как тем же способом создать несколько туннелей между более, чем двумя маршрутизаторами.

Оцените материал: 
twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com blogger.com liveinternet.ru livejournal.ru memori.ru google.com yandex.ru
Комментариев: 4
  1. Виктор Семёнович | 2011-08-16 в 19:06:41

    Спасибо за статью на днях достану второй WRT54GL буду пробовать. А то в гараже нужен интернет, так вот надо выкручиваться, гараж метров за 300. Сколько я понял здесь схема такая:

    ISP-->(WAN1-->Wi-Fi1)(Wi-Fi2-->LAN).

    Если у меня всё получится огромное Вам человеческое спасибо.

  2. Виктор, вы неправильно поняли, то, что описано в этой статье, к Wi-Fi не имеет отношения.

    Вам нужно установить беспроводной мост, а это совсем другое.

    Мне кажется, лучшим (наименее затратным) решением будет докупить к имеющемуся роутеру в пару Wi-Fi точку доступа, умеющую работать в режиме клиента, и для 300 метров придумать что-то с антеннами, купить или попробовать сделать, например, как у меня в этой статье:

    spvd.ru/page/biquad-wifi-antenna

    Прошивка в DD-WRT совсем не обязательна, просто настроить WRT54GL как обычно, точку доступа в режиме клиента по Wi-Fi подключить к нему, а в Ethernet порт точки доступа подключить компьютер, или что там у Вас в гараже.

  3. Для подключения гаража можешь воспользоваться подобным TP-LINK TL-WA5210G и мощность передатчика хорошая и цена разумная.

    Но не забудь, что для уверенного сигнала и клиент и база должны быть одинаково мощные. Если дома поставишь передатчик с мощностью 1ватт, а в гараже обычный роутер с мощностью передатчика 50мВатт, не будет ни чего хорошего.

  4. Здравствуйте!

    С Линуксом (особенно урезаной версией) у меня туго, а задача стоит настроить OpenVPN (клиент) на dir-320(A2) для офиса. Сервер на win 2008 есть. Есть и без замечаний работают клиенты Windows. Перепрошил прошивкой (dd-wrt.v24_vpn_generic.bin 2010-08-09 3,63 MB) с официального сайта. Заполнил имеемые поля в Веб-морде роутра. С удивлением отметил отсутствие поля для применяемого мной ta.key. Убрал его временно из конфигурации сервера. Клиент openvpn от роутера коннектится, но не фиксирует соединения и в логах обозначается не данным ему, как у других клиентов названием, а UNDEF только в первой секции openvpn-status.log. Т.е. он бесконечно пытается установить окончательное соединение, что логах отражается. По моему наивному убеждению, если я заполнил данные для vpn-клиента в веб-морде, то дальше умный Пингвин должон переварить и выдать положительный результат. Ан нет. Упорно ищу внятное объяснение этой ситуации, но пока безрезультатно. Просматривая вашу статью обратил внимание, что у вас правила для пакетного фильтра одинаковы и для клиента и для сервера.

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

Отправка комментария без регистрации. Комментарий публикуется после проверки.

Имя и сайт используются только при регистрации

Комментарий с авторизацией. Также можно сразу зарегистрироваться одновременно с первым комментарием. Для регистрации потребуется указать адрес электронной почты и придумать пароль, на электронную почту придет письмо с дальнейшей инструкцией по завершению регистрации. Комментарий публикуется после проверки.

(обязательно)