Пользователь
0,0
рейтинг
16 августа 2009 в 22:40

Администрирование → OpenVPN: создание полноценного openVPN gateway

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

Основные плюсы такой модели:

  • Просто: настройка занимает менее часа и не требует специальных знаний.
  • Экономно: трафик сжимается lzo.
  • Безопасно: весь трафик шифруется, а клиенты разделены между собой.
  • Иногда по-другому просто никак. :)


Несмотря на эти пункты, нормальной статьи о настройке OpenVPN на Хабрахабре я не нашел. Чтож, попытаюсь исправить это своими силами.

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

За основу возьмем OpenVPN-2.0.9 и Gentoo Linux в качестве сервера и Linux либо Windows в качестве клиента.



Определися с желаемым.



Примем за основу то, что наш сервер распологается в удаленном датацентре. Т.е. попадать на него мы будет через интернет.

После установки шифрованного туннеля между клиентом и сервером, сервер будет NAT-ить все наши пакеты в Интернет. Также, сервер будет обслуживать DNS и являться firewall-ом для виртуальной локальной сети.

Внешний IP нашего сервера (того, который будет openVPN): 212.212.212.212
Внутренний IP сервера (видимый из туннеля): 10.10.0.1
Пул внутренних адресов openVPN: 10.10.0.2 — 10.10.0.128
Название нашей сети: vpnet
Имя сервера: vpsrv
Имя клиента: vpclient

Зачем нужен внешний IP, думаю, понятно. Внутренний IP нужен для соединения с сервером после поднятия туннеля. Пул адресов — это адреса, которые сервер выдает подключившимся клиентам.
Название сети — это имена конф. файлов и имя сервера в этих конф. файлах. Имена клиента и сервера = имена файлов ключей.

На сервере установлен Gentoo Linux 2008.0, обновленный до последних версий. Ядро — 2.6.29. Вся настройка будет выполняться по SSH.

Настройка ядра.



Замечу сразу, на этом этапе нужно быть крайне осторожным и внимательным. Если кто забыл.

Ядро должно содержать опции ниже на сервере. На клиенте нужны только TUN и ipv4.

В ядре нам понадобится следующий функционал, привожу выдержку из конфига:

CONFIG_NF_NAT=m
CONFIG_NF_NAT_PPTP=m
CONFIG_NETFILTER=y
CONFIG_TUN=m


Ну и разумеется поддержка ipv4, сетевой карты и прочего железа. Собираем и устанавливаем ядро. Можно воспользоваться genkernel. Перезагружаемся.

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



Установка ПО.

Если :) сервер вернулся из ребута, перейдем к установке ПО.

emerge --sync
emerge openvpn bind bind-tools iptables


Ждем, иногда долго. После установки переходим в /etc/init.d/ и выполняем:

ln -s openvpn openvpn.vpnet
rc-update add openvpn.vpnet default
rc-update add named default
rc-update iptables default
./iptables save


Создав symlink на самого себя, мы указали openvpn, что нужно использовать конфигурацию vpnet. В будущем запускаем его только так:

/etc/init.d/openvpn.vpnet start


Сейчас запускать не нужно, ибо запускать пока нечего. :)
Помимо этого мы добавили iptables, named и openvpn в автозагрузку.

Создадим нужные каталоги и файлы:

mkdir /etc/openvpn/vpnet/
mkdir /etc/openvpn/vpnet/keys
touch /var/log/openvpn.log
touch /etc/openvpn/vpnet.conf


Генерация ключей.


Перейдем в /usr/share/openvpn/easy-rsa/. Откроем файл vars и впишем настроим параметры:

export EASY_RSA="/usr/share/openvpn/easy-rsa/" #Путь к easy-rsa.
export KEY_CONFIG="$EASY_RSA/openssl.cnf" #Конфиг OpenSSL
export KEY_DIR="/etc/openvpn/vpnet/keys" #Каталог, в котором мы будем держать ключи.
export KEY_SIZE=1024 # Размер ключа
export CA_EXPIRE=3650 # Срок действия CA
export KEY_EXPIRE=3650 # Срок действия ключа
export KEY_COUNTRY="RU" # Двухбуквенный код страны
export KEY_PROVINCE="XX" # Province, не актуально
export KEY_CITY="Town" # Город
export KEY_ORG="Companyname" # Компания
export KEY_EMAIL="test@mail.ru" # Email


Естественно, значения (компания, путь к ключам и easy-rsa, email) нужно поменять на подходящие вам.

Имопртируем переменные: source ./vars

Теперь создадим ключи.

./clean-all # Убиваем старые ключи, если они были.
openvpn --genkey --secret ta.key # Ключ TLS-auth
./build-dh #Ключ Диффи-Хеллмана.
./pkitool --initca # Certificate Authority для сервера.
./pkitool --server vpsrv # Сертификат сервера.
./pkitool vpclient # Сертификат клиента.


И перенесем остатки в нужное место:

mv ./ta.key /etc/openvpn/vpnet/keys


Все, ключи готовы.

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


Переходим в /etc/openvpn/, открываем vpnet.conf и пишем туда:

mode server
tls-server
proto tcp-server
dev tap
port 5555 # Порт
daemon
tls-auth /etc/openvpn/vpnet/keys/ta.key 0
ca /etc/openvpn/vpnet/keys/ca.crt
cert /etc/openvpn/vpnet/keys/vpsrv.crt
key /etc/openvpn/vpnet/keys/vpsrv.key
dh /etc/openvpn/vpnet/keys/dh1024.pem
ifconfig 10.10.0.1 255.255.255.0 # Внутренний IP сервера
ifconfig-pool 10.10.0.2 10.10.0.128 # Пул адресов.
push "redirect-gateway def1" # Перенаправлять default gateway на vpn-сервер. Если не нужно - закомментировать.
push "route-gateway 10.10.0.1"
duplicate-cn
verb 3
cipher DES-EDE3-CBC # Тип шифрования.
persist-key
log-append /var/log/openvpn.log # Лог-файл.
persist-tun
comp-lzo


Все опции, в принципе, понятны. Особо важные я отметил комментариями. Пути и названия, адреса — нужно подправить под себя.

Теперь сервер можно запустить командой /etc/init.d/openvpn.vpnet start
Если возникнут проблемы, подробности можно прочитать в log-файле.

NAT


Чтобы сервер выпускал наши пакеты во внешнюю сеть нам нужно настроить NAT. Это просто.

Готовим и запускаем iptables:

/etc/init.d/iptables save
/etc/init.d/iptables start


Включаем поддержку IP forwarding:

sysctl net.ipv4.ip_forward=1
echo "sysctl net.ipv4.ip_forward = 1" >> /etc/sysctl.conf


Добавляем правило firewall:

iptables -v -t nat -A POSTROUTING -o EXTERNAL_IF -s VPN_NET/24 -j SNAT --to-source SERVER_IP


EXTERNAL_IF, VPN_NET и SERVER_IP заменить на внешний интерфейс, сеть VPN и внешний (!) IP сервера соответственно.

Снова делаем /etc/init.d/iptables save, чтобы правило применялось при загрузке системы.

Все, можно работать.

Настройка клиента.



Устанавливаем ПО, создаем пути:

emerge openvpn
cd /etc/init.d/
ln -s openvpn openvpn.vpnet-client
rc-update add openvpn.vpnet-client default

mkdir /etc/openvpn/vpnet
mkdir /etc/openvpn/vpnet/client_keys
touch /etc/openvpn/vpnet-client.conf


Берем с сервера файлы:

ca.crt
vpclient.crt
vpclient.key
ta.key


и закидываем их в /etc/openvpn/vpnet/client_keys/ на клиенте.

Редактируем /etc/openvpn/vpnet-client.conf:

tls-client
proto tcp-client
remote 212.212.212.212
dev tap
port 5555
cd /etc/openvpn/vpnet
pull
tls-auth /etc/openvpn/vpnet/client_keys/ta.key 1
ca /etc/openvpn/vpnet/client_keys/ca.crt
cert /etc/openvpn/vpnet/client_keys/vpclient.crt
key /etc/openvpn/vpnet/client_keys/vpclient.key
cipher DES-EDE3-CBC
log-append /var/log/openvpn.log
comp-lzo


Опции шифрования и компрессии на клиенте и сервере должны совпадать.

Запускаем клиент. Автоматически установится соединение с сервером, создастся туннель, default gateway — сервер VPN. Если все сделано правильно, то можно ходить в интернет.

Настройка закончена.

Могу ответить на вопросы в комментариях.
Никита @differentlocal
карма
54,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

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

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

  • 0
    А clientless VPN поддерживается, например SSL через browser? Не SSL VPN сегодня уже не интересен.
    • 0
      Нашол вот:
      + OpenVPN is a full-featured open source SSL VPN solution…

      — Can I use a web browser as an OpenVPN client?

      No. While OpenVPN uses the SSL/TLS protocol for security, OpenVPN is not a web application proxy. It is an OSI layer 2 or 3 full-mesh internetwork tunneling solution and requires that OpenVPN be installed on both client and server. :(
    • +3
      OpenVPN это не прокси и задачи у него другие. Помимо серфинга есть куча других задач, где обычный VPN очень даже интересен — выход в сеть через удаленный сервер, соединение сетей (офисов например), безопасный доступ к оборудованию в удаленном ДЦ, туннели компьютер-компьютер…
      • 0
        SSL VPN через https очень даже не помешал бы. Был раньше SSL Explorer, но их Баракуда выкупила. Сущетвуют конечно платные решения, прчёи очень дорогие, такие как Checkpoint, FortiGate, Juniper, Baracuda… или M$ Win08:

        www.isaserver.org/tutorials/Publishing-Windows-Server-2008-SSL-VPN-Server-Using-ISA-2006-Firewalls-Part1.html

        Но хочется чего то абсолютно free и встроенного как демон в FreeBSDу или Генту и чтоб без установки клиента. Дело в том что многие VPN клиенты не поддерживают x64 (вроде и OpenVPN), а надо. Потом иногда сидя у заказчика надо подключить его временно к нашей лицензии из нашей локалки, выполнить некоторые действия и отключиться… здесь clientless был бы не заменим
        • 0
          У меня все машины x86_64 никаких проблем с openvpn наблюдал.
      • 0
        SSL VPN это когда ты браузером заходишь на VPN-сервер и он загружает и запускает на твоей машине VPN-клиент, инкапсулирующий траффик в SSL.

        Очень удобно для мобильных пользователей, которым вдруг захочется поработать с машины, которая умеет Java, но на нее не может быть установлен OpenVPN (интернет-кафе какое-нибудь, например)
        • 0
          Да, а на машине в интернет-кафе разрешат встраиваться в стек IP, или создавать виртуальные сетевые адаптеры? (Ну, это непременно требуется для подключения VPN.)

    • 0
      Есть OpenVPN Access Server. Вы про это?
  • +1
    OpenVPN очень хорошая система. Используем ее для доступа к серверу, который глубоко внутри сети небольшого провайдера и не имеет внешнего адреса. Когда нужно подключиться — запускаем сервер у нас (на внешнем адресе) — а там клиент постоянно пытается подключиться, соответственно — подключается.

    Единственно чего-то не удалось подружить сервер OpenVPN и файрволл windows server 2008 при умолчательных запрещениях.
    • 0
      Не только Windows server 2008, а еще и Windows Vista. Постоянно сеть становится неопределенной. И все настройки слетают, до тех пор пока не выставишь ее как частной.

      Самое обидное что сразу после установки туннеля к компьютеру подключится удаленно не удастся. Все эта пресловутая частная сеть.
  • 0
    Хм… а можно как-то идентифицировать пользователей, подключаюихся к серверу?
    • 0
      можно каждому ключик индивидуальный выдать. и запретить несколько подключений с одним ключиком (чтобы не делились). и заодно настройки индивидуальные для каждого подключения (ключика-логина) создавать можно… в общем много чего можно :)
  • 0
    Опция «dev tap» что означает?
    • 0
      На сколько я помню этой опцией мы указываем имя виртуального устройства. Типа ppp0 при создании VPN через PPTP.
      • 0
        это создает виртуальную сетевую карту. тоесть сеть будет как бы почти настоящая, можно бридж даже сделать между tap0, eth0 например без всяких проблем с маршрутизацией.
        P.S.
        ИМХО лучше UDP юзать, вместо TCP…
        • 0
          Всяко бывает: если нужна возможность работы через HTTP-прокси, то только tcp…
      • 0
        Нет. Конкренто это — указать ТИП устройства: создать устройство такого типа и использовать его.

        Если бы вы номер указали, напр. tap0, то можно было бы заранее создать это устройство (программой tunctl), а OpenVPN подвязать к нему командой dev tap0.
    • 0
      Означает что в тунеле будут летать эзернет фреймы, а не ip пакеты как это былобы при dev tun
  • 0
    Ээээ, а в генте ядро по дефолту без поддержки tun и nat? Или это рекомендация для тех, у кого ядро было допилено до состояния маразматического минимализма?
    • +1
      Там нет понятия «ядро по дефолту». Там по дефолту ядро конфигурируешь сам с нуля из практически ванильного.
  • 0
    Добавьте пожалуйста, как настроить auth-pass verification.
    Т.е. чтобы можно было обычным vpn коннектиться к этому серверу.
    • 0
      эм… обычный это который pptp/l2tp ?! а разве можно !? o_0
      • +1
        Конечно нельзя, OpenVPN это другой протокол.
        • 0
          собственно потому и удивляюсь, что не должно бы :)
          но мало-ли, человек так построил свой вопрос что он выглядел как рекомендация-утверждение, вот я и задумался а не пропустил ли я что-то :D
      • 0
        Нет, нельзя, конечно, у OpenVPN свой протокол.

        Но по паролю в принципе сделать можно. Но зачем?!
    • +1
      Это pptpd нужен. Я про него тоже однажды напишу. OpenVPN обычным виндовым клиентом, ествественно, не поддерживается.
      • 0
        Поскорее бы :-)
  • –2
    Гы! Как пить дать, комментарии в итоге сведутся к обсуждению «нужен вообще OpenVPN или не нужен?». ;-)
    Не могу не высказать в этой связи своего мнения: на Линуксе, может, и нужен, а на FreeBSD (которой пользуюсь как серверной системой) — уже нет. :-) Раньше использовал несколько раз OpenVPN — действительно, в настройке по сравнению с остальными решениями было достаточно несложно (особенно, при наличии мануалов на ОпенНете ;-) ). Но ведь уже достаточно давно вышел MPD5 (это не Music Player Daemon, о чем сразу думают Линуксоиды, а Multi-link PPP daemon for FreeBSD), в котором решены все проблемы его молодости, который настравается одной левой и который может буквально все, связанное с VPN и к тому же — использует не свои несовместимые ни с кем протоколы/клиентов, а все стандартное, так что может быть клиентом/сервером хоть для Винды, хоть для Линукса, хоть для кого угодно… Спрашивается — зачем искать добра от добра? :-) Раньше у OpenVPN была своя ниша. Сейча ее «зажевали» более функциональные и мощные конкуренты. ИМХО, конечно.
    • 0
      Thanks за инфу про MDP5. Будем разбираться.
    • 0
      custom routes разве что у опенвпна гибкие
      • 0
        Гм. Может мы о разном, но в скриптах на опускание/поднятие интерфейса в mpd маршрутами тоже как угодно манипулировать можно… Или в openvpn что-то специфическое? Извиняюсь — не помню на память…
    • +4
      GRE не всюду проходит…
      • 0
        А вас никто не заставляет его использовать. :-) Используйте L2TP — он не PPTP, там GRE нету…
        • 0
          Там вообще защиты нет. А если делать с защитой — то только IPsec, который тоже не везде пролезает.
          • 0
            Да, это верно. :-)
            ОК, соглашусь, что в условиях жесткой «зарезки» всего чего только можно openvpn пригодится. Наверное, дело в том, что я всегда работал в телекомах и сам для себя задавал эти самые условия, поэтому не заморачивался такими вопросами.
            Респект! :-)
    • +1
      А оно по udp умеет работать?
      У некоторых провайдеров udp трафик приоритетный и очень здорово работают тунели даже в час наибольшей нагрузки.
      • 0
        Да, умеет. Я ссылку выше писал — там прямо на главной странице написано, что оно умеет. :-)
        Вообще, чем прекрасен mpd — тем что он на netgraph, а значит возможности расширения ограничены только фантазией. Можно указывать какие ноды создавать и какие и куда хуки цеплять при создании туннеля, а для наиболее популярного (отдача статистики в netflow, зеркалирование трафика, nat на туннеле) — есть готовые опции.
        Производительность же за счет того, что это все в ядре, а не userland'е — просто супер. :-)
        • 0
          mpd хорош, не спорим. но только в случае BSD<->BSD

          в openvpn прелесть в том что он есть везде.
          • 0
            Да нет же… Я же написал выше — mpd работает по стандартным протоколам, типа PTPP, и если не требуется как-то где-то хитро через зафильтрованный enviroment прокинуть туннель (см. комментарии выше), то лучше уж предпочитать его. OpenVPN требует на каждом конце свою сборку, т.к. никто другой его туннели не проддерживает. А к серверу mpd можно подключаться хоть с Линукса, хоть с винды, и к тому же — средства для того же PPTP есть у всех в стандартной поставке и не нужно ничего ставить отдельно.
            Но, повторяюсь, смотря какие задачи стоят. Для кого-то это будет минус. Для меня всегда был плюс. :-) На OpenVPN можно соединить два филиала организации, чтобы был перманентный линк. А сотрудников во внутреннюю сеть я бы лучше через MPD + PPTP запускал — мало ли с чего сотрудник зайти захочет? Не каждый же раз ему у себя OpenVPN собирать?
    • 0
      Multipoint GRE отлично работает в Linux, я сам проверял.

      Лучше Cisco DMVPN пока ничего не придумали. И протоколы все открытые (IPsec IKE, mGRE, NHRP и OSPF).
  • 0
    А DNS?
    кто днс будет прятать?

    при таком подходе ДНС резолвинг будет через вашего местного провайдера
  • 0
    Кто-нибудь в курсе, какого чёрта могут не работать UDP broadcast-ы? Очень долго мучался, так и не вышло. Старые игры любят их использовать.
    • 0
      Вероятно, потому, что автор забыл добавить опцию client-to-client. Без этого, клиенты видят только сервер и не видят друг друга.

      Просто допишите в конфиг сервера и перезапустите его.
      • 0
        Не забыл, разделение клиентов сделано специально и про это написано в статье. :)
  • +1
    Есть отличный плагин который может авторизовать клиентов по логину-паролю а на сервере они в базе mysql
  • –3
    Очередной боян на хабре. Достаточно погуглить по теме и всплывёт не менее десятка статей (как минимум, помню про это было где-то в «Хакере», Античате, Злом.Орг и пр.). То, что объявлено плюсами модели — просто Ваш конфиг под определённые задачи (например, скрыть трафик от посторонних лиц [от органов?]).

    Технология VPN предназначена для решения более обширных задач, но жаль, статья ограничилась опять только простыми вещами.
    • 0
      а можно читать мануалы, и ничего не постить в инет.
      • 0
        Справедливости ради, именно с OpenVPN мануала более чем достаточно.
      • 0
        Можно и полезно. Мой коммент о том, что именно по этой теме уже немало статей в инете. Пошаговых, подробных, на любой вкус. :)
    • 0
      Вполне осознанно закончена простыми вещами. Сложные вещи раздули бы ее до размеров маленькой книги :)
  • 0
    для более гибкой работы в конфиге сервера:
    #директория с индивидуальными данными
    client-config-dir /etc/openvpn/ccd
    #индивидуальный файл /etc/openvpn/ccd/client
    ifconfig-push 192.168.0.2 255.255.255.0
    push «dhcp-option DNS 192.168.0.1»
    push «route-gateway 192.168.0.1»
    push «redirect-gateway local def1»

    В этот случае создаются ключи для каждого пользователя.
  • 0
    А чем ОпенВПН выгодно отличается от poptop? И почему выбор пал именно на него?
    • 0
      OpenVPN умеет работать через HTTP-Proxy, например.
    • 0
      Очень гибкий. Можно, например, некую команду выполнить при подключении клиента, другую — при отключении. У меня так устроен DDNS в VPNе.
      • 0
        То же самое элементарно делается в poptop.
    • 0
      Выгодно отличается тем, что легче ходит через NAT'ы.
    • 0
      У каждого свои причины, но вот лично у меня poptop всегда тормозит так, что просто ужас. Для клиентских целей его еще можно использовать, но шифрованный трафик гонять — на фиг, на фиг… А если еще и туннелей энное количество…
  • 0
    А зачем CONFIG_NF_NAT_PPTP=m?
  • 0
    а зачем это на клиенте
    vpclient.csr vpdh1024.pem
    ta.key
    • 0
      dh не нужны

      csr — certificate sign request — тоже не нужен
  • 0
    Автор, действительно, клиенту нужно всего три файла — ca.crt, client.crt и client.key, всё.
    • 0
      Да, погорячился. Убрал лишние. Не выяснял специально, без каких работает, скинул все, которые относятся к клиенту.
  • 0
    Надо ещё написать про .p12
  • 0
    У меня вот про OpenVPN вопрос. Насколько сложно его настроить так, чтобы он работал по принципу программы hamachi. У нас просто такой провайдер в городе, у него много подсетей, и в играх, где нет прямого коннекта по IP — поиграть нельзя. А Hamachi не всегда работает адекватно. Т.е. сделать виртуальную сеть такую. Если кто-то ответ, заранее спасибо.
    З.Ы. Я не очень сильно разбираюсь в этом всём, но мне интересно возможно ли это, и может какие зацепки кто-то подскажет.
    • 0
      hamachi — это p2p full mesh VPN — есть проект gvpe. Но насчёт запуска его в винде — очень сомневаюсь.
      • 0
        А доспустим просто поднять сервер отдельный с линуксом и там поставить этот «gvpe» и через него. Сложная ли настройка получится?
        • 0
          Не очень сложная, но вы не будете принадлежать тому же самому сегменту сети — виртуальный интерфейс GVPE нельзя поставить в мост, так что широковещательные рассыки всё равно работать не будут. А некоторые игры именно их и требуют.

          OpenVPN позволяет решение full mesh, но не p2p, весь трафик у него проходит через сервер. Если есть возможность поставить сервер на толстом канале, игры заработают (но лаги будут ощутимы).
  • 0
    Есть пару вопросов. Зачем нужно: «cd /etc/openvpn/vpnet». Появилась такая проблема «NOTE: unable to redirect default gateway — Cannot read current default gateway from system»

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