Настройка OpenVPN. Бридж между двумя локальными сетями

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

Задача стояла следующая – объеденить две локальные сети в разных городах в единую 192.168.0.0/24, так чтобы мог функционировать SMB. На обоих концах стояли ADSL-модемы D-Link в режиме роутера. С одной стороны (моего родного города) решено было установить сервер на базе Linux (CentOS), а в другом городе оставить компьютер на WinXP с двумя сетевыми картами, одна из которых подключена к локальной сети 192.168.0.0/24, а другая – к модему-роутеру, подсеть 192.168.1.0/24. IPSec в данном случае не подошел по нескольким причинам:

  • Ехать в другой город не хотелось, поэтому всю настройку там должен был сделать человек без особых навыков, пользуясь инструкцией и/или моими телефонными консультациями. Для настройки IPSec под WinXP надо основательно покопаться в дебрях mmc, и это могло вылиться в длительный сеанс секса по телефону. :)
  • IPSec не очень хорошо относится к NAT, и предугадывать, как он будет ходить через две Д-Линковские железяки было трудно.

В итоге решено было остановиться на OpenVPN. Вот некоторые плюсы этого решения:

  • Простая настройка. И под Windows в том числе. Все действия на уровне “setup.exe -> next -> next-> finish, скопировать конфиги и ключ с сертификатами, объеденить подключения в бридж, нажать на Connect и наслаждаться”
  • Бегать он может через чего угодно – UDP, TCP и даже проходить через прокси. Это вам не GRE, который наверняка большинство провайдеров зарежут нафиг.
  • Встроенная и безгеморройная поддержка бриджей. Нам это необходимо для объеденения сетей.

Настройка сервера

Итак, начнем мы с сервера. Он имеет интерфейсы eth0 с подсетью 192.168.0.0/24, и ppp0 внешнй с неким известным внешним адресом. В качестве операционной системы на нем работает CentOS 5.1. Необходимые для OpenVPN пакеты можно найти в репозитории rpmforge.

После этого устанавливаем OpenVPN:

#yum install openvpn

Сначала мы сгенерируем ключи и сертификаты для сервера и клиента. Для этого, кстати, у нас должен иметься OpenSSL. Проконтролируйте! Удобнее всего это делать с помощью скриптов easy-rsa, которые идут в составе OpenVPN. Найти их можно в /usr/share/doc/openvpn-2.0.9/easy-rsa/ и скопировать весь каталог easy-rsa куда-нибуть в укромное место. Потом стоит пометить там файлы build-ca, build-dh, build-key, build-key-server, clean-all, vars как исполнимые. Остального нам пока что не надо. При желании редактируем файл vars и подставляем туда свои параметры, которые будут использоваться при генерации ключей и сертификатов.

Приступаем к генерации. Выполняем:

#. ./vars
#./clean-all
#Осторожно, содержимое каталога keys исчезнет #./build-ca

Большинство значений скрипт автоматически подставит из файла vars, надо будет только указать Common Name.

Сгенерим ключ для сервера:

#./build-key-server server

В качестве Common Name указываем server. Положительно отвечаем на вопросы “Sign the certificate? [y/n]” и “1 out of 1 certificate requests certified, commit? [y/n]”.

Теперь очередь ключа клиента:

#./build-key client

В качестве Common Name указываем все тот же client. Помните, что если вы делаете ключи для нескольких клиентов, то все они должны иметь уникальные имена!

Осталось сгенерить файл с параметрами Diffie-Hellman.

#./build-dh

Эта процедура достаточно длительная.

Итак, у нас в каталоге keys имеется множество файлов. Запомните, что все файлы *.key весьма секретны, так что хранить и передавать их надо со всей ответсвенностью.

Теперь надо скопировать файлы ca.crt, dh1024.pem, server.crt, server.key в каталог /etc/openvpn. На всякий случай, надо им так же поставить права в 400.

Начинаем писать конфиг-файл для сервера OpenVPN.

/etc/openvpn/sample.conf

port 1194  #Стандартный порт OpenVPN, можно было бы и не писать   
proto udp  #Работать будем по протоколу UDP   
dev tap0    comp-lzo    tun-mtu 1500    server-bridge 192.168.0.1 255.255.255.0 192.168.0.33 192.168.0.254  #Характерно для соеденинения в режиме бриджа. 
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh1024.pem
persist-key
persist-tun

Итак, исходя из строчки server-bridge… сервер у нас будет иметь IP 192.168.0.1, маска подсети 255.255.255.0, а клиенты с 192.168.0.33 до 192.168.0.254.

Осталось разобраться непосредственно с бриджом. Для организации его нам понадобятся утилиты из пакета bridge-utils. Устанавливаем:

#yum install bridge-utils

Я решил совместить стандартные скрипты bridge-start и bridge-stop из документации OpenVPN со стартовыми скриптами системы. В итоге получились два файла openvpn-startup и openvpn-shutdown, которые надо пометить исполнимыми и засунуть в каталог /etc/openvpn. Сборка OpenVPN в rpmforge будет их запускать автоматически из инит-скриптов. За остальные сборки не знаю. В любом случае, желающие могут придумать альтернативные методы достижения результата.

openvpn-startup

#!/bin/bash
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################
# Define Bridge Interface
br=»br0″
# Define list of TAP interfaces to be bridged,
# for example tap=»tap0 tap1 tap2″.
tap=»tap0″
# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth=»eth0″
# eth_ip=»192.168.0.1″
# eth_netmask=»255.255.255.0″
#Не забываем поменять эти параметры,
eth_broadcast=»192.168.0.255″
#если они у вас не соответсвуют!
for t in $tap; do
openvpn —mktun —dev $t
done
brctl addbr $br
brctl addif $br $eth
for t in $tap; do
brctl addif $br $t
done
for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done
ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast

openvpn-shutdown

#!/bin/bash
####################################
# Tear Down Ethernet bridge on Linux
####################################
# Define Bridge Interface
br=»br0″
# Define list of TAP interfaces to be bridged together
tap=»tap0″
ifconfig $br down
brctl delbr $br
for t in $tap; do
openvpn —rmtun —dev $t
done

Осталось разрешить в брандмауэре весь обмен через интерфейсы tap0, br0 и открыть для входящих UDP-соеденений порт 1194 на внешнем интерфейсе.

Настройка windows-клиента
Сначала надо взять OpenVPN GUI for Windows с сайта http://openvpn.se. Скачать необходимо Installation Package (Both 32-bit and 64-bit TAP driver included). Установка проходит совершенно стандартно для этой операционной системы. В процессе будет установлен TAP-драйвер для виртуальной сетевой карты, так что надо ответить утвердительно на соотвествующий вопрос. После установки в списке сетевый подключений появится новое “Подключение по локальной сети”. Его лучше переименовать во что-то более понятное. Например, назвать его “openvpn”. Надо зайти в его “Свойства” – “Свойства TCP/IP” и убедится, что никакие адреса-DNS-ы не прописаны, и определяются автоматически. Теперь приступим к настройке непосредственно OpenVPN. Скопируем в папку C:\Program Files\OpenVPN\config (или куда вы там его поставили?) файлы ca.crt, client.crt, client.key. Там же создаем файл sample.conf следующего содержания.

sample.conf

client proto udp port 1194 remote my.openvpn.server.com #Внешний адрес вашего сервера dev tap nobind tun-mtu 1500 ping 10 persist-key persist-tun ca ca.crt cert client.crt key client.key comp-lzo

Далее заходим опять в сетевые подключения, выделяем с помощью клавиши Ctrl два соединения – openvpn и подключение по локальной сети. Из контекстного меню выбираем “Создать мост”. Обратите внимание на то, что в Win2k этого еще сделать нельзя. Все, теперь кликаем правой кнопкой на иконку OpenVPN GUI в трее, выбираем “Connect” и ждем. Должно все получиться :) Если что-либо пойдет не так, то открываем логи и думаем…

Случайные Статьи

Loading…


Количество просмотров :10391

One Comment

  1. Антон:

    И броадкаст замечательно в итоге ходит?
    Так а где какие адреса в результате стались?
    server-bridge 192.168.0.1 255.255.255.0 192.168.0.33 192.168.0.254
    то есть на центральном офисе были адреса с 1 до 32? А во второй сети, где XP? И
    вообще пока не могу толком понять зачем в такой конструкции назначаются эти айпишники,
    что прописаны в конфиге, если виртуальный интерфейс будет связан мостом с внутренним
    eth0 адаптером, где как я понял должен быть адрес 192.168.0.1 на стороне сервера и непонятно мне пока еще какой на XP… разьясните, если не сложно, никогда не объединял две сетки. где одинаковая адресация, тем более чем tap интерфейс. как правильно приходилось сталкиваться с более частой конструкцией вида:
    192.168.0.* — 10.8.*.* — 192.168.1.* к примеру, и tup-режимом.
    Заранее благодарен.

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