Пользователь
0,0
рейтинг
7 апреля 2009 в 18:50

Администрирование → OpenVPN, объединяем домашние сети

Данная статья посвящена объеденению нескольких домашних локальных сетей с предоставлением прозрачного общего доступа к ресурсам сетей с помощью VPN. За реализацию VPN взята openvpn. Клиенты и сервер openvpn установлены на роутерах домашних сетей, в конкретном случае роутеры семейства asus wl500, но данный мануал вполне применим и другим роутерам где есть досуп к OS и можно поставить openvpn.

Хотя подобных руководств в Интернете пруд пруди, они написаны больше для администраторов, которые имеют большой опыт общения с *nix системами, в то время как пользователями домашних роутеров являются в основном не хакеры, а обычные юзеры, может быть впервые увидевшие коммандную строку Linux на том самом роутере. Я постараюсь писать так чтобы было понятно всем.

Для тех кто не любит много букв, чтобы было понятно о чём речь под катом, привожу картинку



Итак, ещё раз формализую задачу. У нас есть несколько сетей имеющих выход в Интеренет через роутер, нам нужно предоставить доступ к ресурсам сетей друг друга через шифрованный интернет-тунель.

Что там понадобится


  1. Роутеры семейства asus wl500
  2. Очень желательно снабдить роутеры usb-флешками, так как в роутере очень мало флеш и оперативной памяти, подойдёт совершенно любая, ну кроме уж совсем раритеного старья, то есть меньше 9Mb. Чем не отличный повод порадовать себя новой флешкой? :)
  3. Хотя бы один из роутеров должен выходить в Интеренет с реальным IP адресом, либо все роутеры должны быть в одном сегменте локальной сети провайдера.
  4. Сети за роутерами должны иметь разный диапазон адресов
  5. Немного времени и мозга


Настраивать роутеры нужно будет вместе, поэтому желательно иметь к ним доступ одновременно. Бегать из одной квартиры в другую не особо удобно, поэтому можно либо обеспечить доступ из Интернета к компьютерам за роутерами (как это сделал я), либо просто собрать роутеры в одной квартире и прицепить клиентские (ой забежал вперёд) роутеры к сервеному, тогда на месте их постоянной работы нужно будет только изменить адрес openvpn сервера.

Теория



Рассмотрим кратко как будет работать система. Сеть состоит из сервера (на рисунке это роутер Mars) и клиентов Earth и Mercury. Сервер обеспечивает функционирование виртуальной сети, шифрование трафика и маршрутизацию пакетов из одной сети в другой.

Более подробно работа сервера показана на следующем рисунке (рисунок очень условный, он только для общего понимания и не отражает компоненты программы). В клиентском режиме openvpn работает точно также, только не осуществляет маршрутизацию.



Итак у нас есть сеть с диапазоном адресов 192.168.1.1-192.168.1.255 за первым роутером (Mars) и с диапазоном 192.168.2.1-192.168.2.255 за роутером Earth. OpenVPN создаёт специальную виртуальную сетевую карту tun0, и пакеты попавшие туда рашифровываются и отправляются на сервер (на серверном компьютере локально, на клинетском через интеренет), где они расшифровывются и отправляются по нужным тунелям до адресата.

Для примера рассмотрим прохождение пакета от компьютера Phobos до компьютера Moon. Пакет от Phobos отправлется на его гейтвей по умолчанию — Mars, там в таблице маршрутизации сказано, что его надо отправить в тунель tun0, там он попадает в openvpn, который уже знает, что пакеты для сети в которую входит Moon следует отправлять в тунель до Earth. Придя на Earth пакет благополучно будет отправлен на подключенную к лоаклке Moon.

Практика


Прошиваем роутеры прошивкой от Олега и ставим ikpg. Думаю многим пользователям wl500ых эта процедура известна. Она очень подробна написана тут: http://wl500g.info/showthread.php?t=3171. Нам необходимы шаги 1-4, собственно прошивка и 7, установка допонительных пакетов.

После того как всё готово ставим необходмы там пакеты командой ipkg install <имя пакета>
  • openvpn — ну это нетрудно догадаться :)
  • vim — текстовый редактор (тот который встроен в оболочку совершенно ни для чего не годится)
  • wget-ssl — понадобится для обновления записей в dns, если у сервера динамический внешний ip.


Пока пакеты устанавливаются мы немного отвлечемся от Линукса и сгенерим ключи для vpn соединения. Как это сделать под Windows (линуксоиды, думаю, уже в теме :) ) уже подробно рассматривалось на хабре, повторятся тут нет смысла, следует только добавить что ca.key надо бы убрать куда нибудь подальше, например записать на ненужную флешку., а флешку положить в сундук под 33 замка, так как зная ca.crt и ca.key можно спокойно подключится к вашей домашней сети, что ясно не входит в наши планы.

Имея под рукой сертификаты их надо положить на роутер который будет сервером, так как это обычные текстовые файлы, то можно просто скопипастить их в текстовый редактор на роутере.
Подключаемся с помощью telnet к роутеру, например

C:\>telnet 192.168.1.1

далее:

$vim /opt/etc/openvpn/keys/ca.crt
Потом нажимаем кнопку i, вставляем содержимое файла ca.crt. Тоже самое делаем с файлами dh2048.pem, mars.crt и mars.key.

После этого нужно создать файл конфигурации openvpn, входящий в комплект можно выбросить и вставить этот:

$rm /opt/etc/openvpn/openvpn.conf
$vim /opt/etc/openvpn/openvpn.conf

dev tun

tls-server
server 192.168.255.0 255.255.255.0
ifconfig 192.168.255.1 192.168.255.2

client-config-dir ccd

route 192.168.255.0 255.255.255.0 #IP Range of VPN
route 192.168.2.0 255.255.255.0 #IP Range of Earth

push «route 192.168.1.0 255.255.255.0»
#Say to clients that Mars has 192.168.1.0/24 LAN

#keys

dh /opt/etc/openvpn/keys/dh1024.pem
ca /opt/etc/openvpn/keys/ca.crt
cert /opt/etc/openvpn/keys/home2.crt
key /opt/etc/openvpn/keys/home2.key

#Do not change unless know what you are doing

client-to-client

port 1194
proto udp

user nobody
group nobody

comp-lzo
persist-tun
persist-key
verb 3

log-append /opt/var/log/openvpn/openvpn.log
status /opt/var/log/openvpn/status.log

keepalive 10 60


Создадим директорию в которой будет находится конфигурация для клиентов

$mkdir /opt/etc/openvpn/ccd/

В это директории необходимо создать файлы для тех клиентов за которыми будут находится объединяемые сети. В нашем случае это клиент Earth, создаём файл Earth

$vim /opt/etc/openvpn/ccd/Earth

Он у нас будет состять всего из одной строчки
iroute 192.168.2.0 255.255.255.0


Эта строчка говорит openvpn куда отправлять пакеты для сети 192.168.2.0/24.

Итак, до запука openvpn осталось только подправить скрипт запуска /opt/etc/init.d/S20openvpn и убрать оттуда строчку return 0.

Всё, запускаем openvpn

/opt/etc/init.d/S20openvpn

Если всё ok, то вывод netstat -ul | grep 1194 дожен выдавать сторчку
udp 0 0 *:1194 *:*

а в файле /opt/var/log/openvpn/openvpn.log Появится запись об успешном запуске сервера.

Итак, сервер работает, надо дать возможность пакетам проходить через firewall.
Для этого:
$iptables -I INPUT -p udp --dport 1194 -j ACCEPT
$iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
$iptables -I FORWARD -i tun0 -o br0 -j ACCEPT
$iptables -I INPUT -i tun0 -p tcp --dport 80 -j ACCEPT


Чтобы правила применялись каждый раз их надо добавить в файл /usr/local/sbin/post-firewall, а строчку /opt/etc/init.d/S20openvpn дописать в post-mount, чтобы сервер стартовал каждый раз при запуске роутера ($ обозначает прилашение командной строки, в файлы его вносить не надо!).

(Вы не забыли записать изменения в flashfs?)

На этом настройка сервера практически закончена. Единственное, если сервер имеет динамический ip, то надо позаботится чтобы клиенты знали какой IP сейчас имеет сервер. Для этого есть такая штука как DDNS, то есть динамический DNS. Asus имеет встроенную поддержку некоторых DDNS провайдеров, но не всех, например моего нет. Поэтому я написал простенький скрипт, который обновляет IP на DNS, если IP роутера изменился:
#!/bin/sh
IFACE="ppp0"
TMPFILE="/tmp/oldip.txt"

/sbin/ifconfig $IFACE > /dev/null 2>&1
if [ "$?" -ne "0" ]
then
logger "update_ip.sh: Interface $IFACE is down, exiting..."
exit 1
fi

new=`/sbin/ifconfig $IFACE|grep inet\ addr|sed -e 's/.*\ addr:\([0-9\.]*\).*/\1/'`

if [ -f $TMPFILE ]
then
old=`cat $TMPFILE`
else
touch $TMPFILE
old=" "
fi

if [ "$new" != "$old" ]
then
/opt/bin/wget --no-check-certificate "https://dynamicdns.park-your-domain.com/update?host=mars&domain=yourdomain&password=PASSWORD" > /dev/null 2>&1
logger "update_ip.sh: New ip $new detected"
echo $new > $TMPFILE
fi



Как поставить и настроить cron очень подробно написано тут: wl500g.info/showpost.php?p=52524&postcount=1

И так, теперь переходим к клиенту. Установка клиента абсолютно такая же как и сервера, единственное надо перегнать ключи клиента (нам понадобятся ca.crt, Earth.crt, Earth.key) и нменого другом конфиге. Не забудьте подправить скрипт запуска.

Конфиг клиента, в поле remote нужно вставить адрес сервера
client
dev tun
proto udp
remote mars.yourdomain 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /opt/etc/openvpn/keys/ca.crt
cert /opt/etc/openvpn/keys/Earth.crt
key /opt/etc/openvpn/keys/Eartth.key
ns-cert-type server
comp-lzo
verb 3
log-append /opt/var/log/openvpn/openvpn.log
status /opt/var/log/openvpn/status.log



Аналогично применяем правила iptables:
$iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
$iptables -I FORWARD -i tun0 -o br0 -j ACCEPT
$iptables -I INPUT -i tun0 -p tcp --dport 80 -j ACCEPT


Запускаем openvpn на клиенте, он соединеятся с сервером и радуемся жизни. Можно смотреть фильмы, фотографии и рубится в игры как по локалке.

Единственное что я не смог сделать это синхронизировать внутренние DNS сервера, поэтому обращатся к компьютерам между сетями надо по их ip.

Ну, надеюсь это будет кому-то полезно, я что-то устал писать этот эпический мануал.

В качестве домашнего задания подключите компьютер Mercury, чтобы он имел доступ к локальным ресурам из любого места, например по gprs или публичного wifi.

В качестве advanced домашнего задания, отнимите у mercury возможность подсоединятся к сети, изменив только конфигурацию Mars.

(С) Иван Лисенков 2009
ivlis @ivlis
карма
10,1
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (57)

  • +9
    Сделал всё как Вы сказали. Между Марсом и Землёй задержка пинга до 3 минут. Меркурий ещё не подключал. Что делать???
    • +5
      Изобретать квантовую телепортацию :)
    • 0
      так у Вас хоть что-то получилось, а у меня не выходит,
      видимо 5-го пункта не хватаем мне.
    • 0
      Вообще-то от 3 до 22 минут. ;)
  • 0
    Вот так к вечеру представишь себе LAN между землей и луной и спать больше не хочется :D
    • +1
      А одном из примеров я видел названия созвездий, что уж там :)
  • +2
    Ура! Теперь я смогу поделиться вирусами и с друзьями! :)
  • +2
    Отличная статья, то, что нужно для самого начала.
    • 0
      Спасибо :)
  • 0
    Делал примерно то же самое — на OpenSuSE infostart.ru/blogs/932/
    • 0
      Отличие состоит в том, что вы использовали tap устройства, а не tun. А тут если нюансы (tm). tun лучше в том отношении что не эмулируют ethernet, поэтому жрут меньше трафика. Однако и недостаки есть, естественно.
      • 0
        через tap большое количество сетей соединять проще (у меня сейчас их 6 + отдельностоящие клиенты)
        • 0
          Да тут тож не особо сложно, файлик один создать только. Кстати у вас bridged или routed?
          • 0
            routed — каждая подсеть в своем диапазоне 192.168.x.0/24, а vpn 10.8.0.0/24 — чтобы широковещательные вещи не кушали трафик.
            • 0
              Ну тут tun как раз самое милое дело, а то ethernet frames ходят просто так, а 3 байта то не лишние :)
  • 0
    Даже самым сильным моделям из семейства wl500 будет не хватать процессора для openvpn, а за статью спасибо…
    • 0
      А вы пробовали? У меня между wl500gP и wl500W скорость держится порядка 0.5MBps при перекачке файлов по NFS. При этом у меня канал 8000Kbps, так что может быть ещё не предел.
      • 0
        именно openvpn не пробовал… Зато пробовал много других вещей на wl500gP V2… поэтому могу скачать что фраза «Данная статья посвящена объеденение нескольких домашних локальных сетей» сильно преувеличена…
        • 0
          V2 это совершенно другое железо, более слабое, это раз.

          Во-вторых, один товарищь утверждал что у него объедены 4 сети, причём болье извратным способом (на каждую сеть своя пара клиент сервер).

          В-третьих, я подчёркиваю, что сети домашине, я ж не говорил, что я держу 100 офисов по тысяче человек на асусах :)
          • 0
            А с чего вы взяли что V2 слабее?)
              • 0
                1) У процессоров разные не только частоты, но и модели… Возможно у них производительность не только от частоты зависит )
                2) В V2 всё на одном чипе, и по идеи должно работать быстрее…
                3) На днях надо будет попробовать и уже тогда делать достоверные выводы…
                • 0
                  Наоборот должно медленне, потому что многие специфичные вещи переложены на CPU, а не выполняются на «железе».
            • 0
              Посмотрите спецификации. Вкратце — у V2 все на одном чипе, проц слабее. В общем народ говорит первая версия реально лучше. Я специально, когда осенью себе брал искал первую.
              • 0
                Ананлоигично, еле нашёл тогда. Сейчас из нормального часто встечается только 500W, который дорогой :(
                • 0
                  Их тогда раскупали, как горячие пирожки. Звоню в магазин, спрашиваю: «Есть?» Мне: «Есть». Приезжаю через три часа уже нету.
            • 0
              v1 — процессор BCM4704/BCM4780 264MHz(можно разогнать до 300MHz) RAM 32MB DDR 32bit,
              v2 — процессор BCM5354 240MHz, RAM 32MB DDR 16bit
              • 0
                Еще память можно перепаять на 128Mb.
                • 0
                  Еще знаю человека, который внутрь винт засунул и у него теперь на этом деле сайтик хостится. Как раз про асусы эти. Ссылку давать не буду, а то человека без инета оставите =)
                  • 0
                    Но это всё уже извращенство imho :)
                  • 0
                    А у меня dc++ хаб стоит и socks прокси.
    • 0
      Не согласен, через OpenVPN на tap'е, между WL500GP и WRT54GL прогонял 6 мегабит, может и больше могло бы, но у стрима потолок 6 мегабит.
  • 0
    >Единственное что я не смог сделать это синхронизировать внутренние DNS сервера, поэтому обращатся к компьютерам между сетями надо по их ip.

    А что на счет pushing DHCP options to clients?
    • 0
      Дело в том, что DNS сервер асуса не хочет отвечать на запросы от левых ip и видимо это hard coded, правда особо глубого я не вникал.
  • 0
    Пару недель назад «развлекались» так со знакомым объеденяя 4 офиса по впн в один. 1 vpn сервер на windows server 2003 и 5 десятков клиентов…
    • 0
      И как оно там?
  • 0
    а где и как генерировали сертификаты?
    вот эти:
    ca /opt/etc/openvpn/keys/ca.crt
    cert /opt/etc/openvpn/keys/Earth.crt
    key /opt/etc/openvpn/keys/Eartth.key
    • 0
      Для облегчения работы с сертификатами вместе с OpenVPN поставляется набор скриптов easyrca (лежит в /usr/share/openvpn/easyrca), почитайте тут: infostart.ru/blogs/932/
      • 0
        Естественно на роутере самом генерить сертификаты дело не благодарное, один dh будет генерится полчаса наверное :)
        • –1
          А зачем их генерить на роутере? можно ему их просто подложить…
    • 0
      Читайте внимательнее, я дал ссылку где написано как что делать.
      gtbear.habrahabr.ru/blog/36845/
      • 0
        спасибо, пропустил в тексте:)
  • 0
    а можно как ни будь попроще? типа hamachi но на своем сервере?
    • 0
      Я вот не понимаю, а что тут сложного? Выполнить по инструкции несколько шагов и скопипастить файлы. Это же не системы интегральных уравнений решать :)

      У хамача много недостатков
      1. Протокол закрыт, а версия не-для-венды остановилась где-то в районе 0.9 и никогда не выкарапкается оттуда
      2. По той же причине появление версии для mispel стремится к нулю, а дрежать большой i386 комп для какой-то ерудны как-то не логично
      3. Бесплатные версии крайне урезаны

      Единственным достоинством хамача является p2p, на что разработчикам openvpn надо обратить пристальное внимание.
      • 0
        ну вот в том то и дело, что для хамача ничего держать, кроме клиентов и не нужно

        • 0
          ну я и не говорил, что идея плохая. Но вот реализация подвела.

          Кстати, я не уверен что он поддерживает форвардинг.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    а чем принципиально отличаются OpenVPN, IPSec, PPPoE и L2TP/PPTP
    • 0
      Итак, давайте котелты отдельно, мухи отдельно :)

      openvpn, IPSec и L2TP/PPTP это реализация виртуальных сетей поверх уже существующих, то есть инкапсуляция IP пакетов в другие IP пакеты. Смысл один и тот, только производства разных компаний, соответсвенно, OpenVPN Technologies (сам код под GPL), Cisco (входит в IPv6) и Microsoft/Cisco.

      А PPPoE это эмуляция «звонков модема», то есть инкапсуляция фремов PPP в пакеты ethernet.
      • 0
        это я всё знаю

        у меня просто с женой один провайдер (Ethernet), а места жительства разные.
        и у этого провайдера дорогой трафик(PPTP), зато много бесплатных, внутренних ресурсов

        вот я и думаю как ей раздать дешевый трафик другого провайдера, который есть только у меня (ADSL, PPPoE)

        прозрачный прокси с p2p наверное сложнее подружить, чем VPN
        • 0
          Перевезти жену к себе домой: идеа: :)

          дык соединяекте две свои сети openvpn, если они у одного провайдера, и прописываете желе дефолтгетвей на себя.
  • +1
    Так-же можно обновлять DNS записи с помощью CURL
    curl --insecure "https://имя_пользователя:пароль@updates.dnsomatic.com/nic/update?wildcard=YESG&mx=YES&backmx=NOCHG"

    Для wget строка будет выглядеть так:
    wget -O - --no-check-certificate "https://имя_пользователя:пароль@updates.dnsomatic.com/nic/update?wildcard=YESG&mx=YES&backmx=NOCHG"

    В данном примере я использовал сервис dnsomatic.com
    В кратце:
    Он синхронизирует Ваш IP c DynDNS,OpenDNS,NO-IP
    • 0
      Да, система там примерно одна и тоже везде.
  • +1
    Огромнейшее спасибо! Как раз делаю описание подобной системы. Just in time… :)
    • 0
      Рад что смог помочь :)
  • 0
    Большое спасибо! Неоднократно пытался собрать такую схему, но получилось только по Вашему мануалу :)
    Завелось почти с пол-пинка.
    Но есть вопрос не совсем по теме. Роутер непосредственно после загрузки отказывается запускать openvpn, ругаясь на то, что не может открыть сертификат, т.к. не знает функцию fopen (библиотеку с ней, видимо, не находит). Через минуту-две, проблема исчезает. У меня единственная мысль — дохнет флешка. Никто не сталкивался?
    • 0
      Таки-нашёл ответ сам. В конфиге, оказывается, нужно указывать полный путь к сертам, иначе он в текущей директории смотрит.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.