avatar Ubuntu Настройка OpenVPN сервера на базе Ubuntu

openvpn server howtoСоздание защищенных каналов является рутинной задачей в работе корпоративных сетей. Они могут применяться для защиты передаваемых данных между филиалами, чтобы объединить офисы в единую сеть, также для подключения удаленных пользователей к корпоративной сети с целью использования ее внутренних ресурсов или просто для обхода ограничений в локальной сети, которые создают «злые админы» которые, под давлением руководства, блокируют разные «чрезвычайно» полезные сайты с голыми барышнями и котиками. Вот как раз, для решения этих задач можно использовать OpenVPN.
ВНИМАНИЕ, эта статья устаревшая, ее обновленный и немного продвинутый вариант можно прочитать тут: howitmake.ru/blog/ubuntu/193.html
Естественно, сели ваз застукают за попыткой обойти корпоративный фаерволл, почетную грамоту вам точно не выпишут!
Мы с вами будем рассматривать сценарий подключения удаленных пользователей, которые смогут подключаться к нашей локальной сети снаружи, а также выходить в интернет через офисную сеть, а уж как эту возможность использовать-решать только вам.
Например, данный сценарий позволяет подключаться к своей домашней сети и обходить ограничение локальной сети в который вы находитесь.

Собственно схема работы сети:
схема работы openVPN

Рассмотрим схему более подробно:
подробная схема работы OpenVPN
В общем-то все просто до безобразия, DNS запросы у нас будут идти по не защищенному каналу, ведь доступ в интернет у нас все таки есть, мы будем пользоваться DNS сервером от Гугла, а вот содержимое того что запрашивается будет идти по защищенному каналу между клиентским ПК и OpeтVPN сервером, а сервер уже будет передавать данные наружи, получать ответ и возвращать их нам по VPN каналу. Также передаваемые между VPN клиентом и VPN сервером еще и сжимаются, правда это создает нагрузку на ЦПУ сервера, но не особо сильную. Для примера виртуальная машина с одним ядром и 1Гб ОЗУ имеет, при закачке торретов на скорости 30Мбит/с загрузку по ЦПУ в районе 32%, а по использованию ОЗУ +112Мб.

Установка OpenVPN
Повышаем права до root
sudo su


Устанавливаем необходимые пакеты:
apt-get install openvpn


Настройка аутентификации
Создадим директорию:
mkdir /etc/openvpn/easy-rsa/


Скопируем шаблон для создания ключей:
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa/


Редактируем шаблон
nano /etc/openvpn/easy-rsa/2.0/vars


Переходим в самый конец файла и оставляем только эти строчки остальные можно закомментировать, они нам не потребуются.
Содержиме пунктов меняем на те что ближе вам.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="MO"
export KEY_CITY="Moscow"
export KEY_ORG="test_org"
export KEY_EMAIL="admin@example.org"


Нам требуется создать ключи для сервера, для этого переходим в:
cd /etc/openvpn/easy-rsa/2.0/


В директории уже есть конфиг openssl, нам необходимо только его переименовать, т.к. при генерации ключей, его не находит, возьмем для примера файл openssl-1.0.0.cnf и переименуем его в openssl.cnf

mv ./openssl-1.0.0.cnf openssl.cnf


Теперь приступаем к генерации ключей, все довольно просто
source vars
./clean-all
./build-dh
./pkitool --initca
./pkitool --server server


Переходим директорию с ключами:
cd keys


копируем полученное в директорию /etc/openvpn/
cp server.crt server.key ca.crt dh1024.pem /etc/openvpn/


Можно считать половину дела сделанной, переходим к генерации ключей для подключения клиентов:
переходим директорию для генератором ключей
cd /etc/openvpn/easy-rsa/2.0/


source vars
./pkitool Логин_пользователя


Где: Логин_пользователя Указываем логин пользователя, чтобы в логах его можно было идентифицировать и легко выяснять, кто и когда подключался (на латинице!)

Нам выдаст нечто подобное:
Generating a 1024 bit RSA private key
.................................................++++++
.++++++
writing new private key to 'testpc.key'
— Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'RU'
stateOrProvinceName :PRINTABLE:'MO'
localityName :PRINTABLE:'Moscow'
organizationName :T61STRING:'test_org'
commonName :PRINTABLE:'testpc'
emailAddress :IA5STRING:'admin@example.org'
Certificate is to be certified until Jan 16 10:17:13 2023 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

Настройка конфигурации сервера:

Создадим конфигурационный файл, в директории
nano /etc/openvpn/server.conf


Следующего содержания:

#Порт для подключения, стандартный 1194, но вы можете выбрать тот который больше нравится
port 1194
#Тип соединения TCP или UDP
proto tcp
#Тин тоннеля
dev tun 
#Список сертификатов
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
# При подключении мы будем попадать в эту сеть
server 192.168.100.0 255.255.255.0
#Сохраняем выдаенные адреса клиентов в файл
ifconfig-pool-persist ipp.txt
#Проверяем состояние канала
keepalive 20 120 
#использовать сжатие
comp-lzo 
persist-key
persist-tun
#включаем логирование 
status openvpn-status.log 
#уровень логирования 
verb 3
#Определяем наш OpenVPN сервер в качестве шлюза по умолчанию
push "redirect-gateway" 
#Разрешаем соединения между клиентами
client-to-client
#добавляем маршруты
route 192.168.100.0 255.255.255.0
#Указываем DNS сервер
push "dhcp-option DNS 8.8.8.8"


Сохраняем изменения, перезапускаем OpenVPN сервер:
/etc/init.d/openvpn restart


нам также необходимо разрешить маршрутизацию на нашем сервере
Включаем форвардинг пакетов:
echo 1 > /proc/sys/net/ipv4/ip_forward


Добавим маршрутизацию, в файл rc.local, чтобы она работала и после перезагрузки системы
nano /etc/rc.local


iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE


В целом с настройкой сервера все.
Переходим к клиентам
как настроить подключение клиента под Linux вариантов навалом, а вот как сделать это под Windows информации довольно мало.

Предположим вы с генерировали сертификаты для пользователя testuser
source vars
./pkitool testuser


Клиенту нам необходимо передать 3 файла
testuser.crt
testuser.key
ca.crt

теперь нам необходимо скачать инсталятор под Windows, сделать это можно с сайта OpenVPN в самом низу инсталяторы под windows.
Теперь нам нужно создать конфигурационный файл для клиента.
Можете создать его сами, а можно воспользоваться моим файлом, в качестве основы, который можно скачать отсюда
От вас требуется только перекинуть ключи на клиентский ПК
C:\Program Files\OpenVPN\config

также, в этом каталоге, должен лежать конфигурационный файл клиента, далее все просто, устанавливаем подключение и пользуемся.
Естественно что конфигурационный файл придется подправить, указать правильные файлы ключей, и сервер для подключения, можно указывать DNS имя, а можно и просто IP адрес, это ни на что не влияет.

как можно проверить что маршрутизация пакетов идет именно через ваш сервер?
Это очень просто, с помощью команды tracert
Если первым в списке идет IP адрес вашего OpenVPN сервера, а уже потом провайдер, то значит все в порядке, примерно как на скриншоте:
трассировка маршрута

Есть вопросы, пишите в комментариях, нашли ошибку пишите в личку.

39 комментариев

avatar
Странно, у меня какой раз не получается настроить средствами windows — хотя инструкции были, а вот в ubuntu в два счёта… можно сказать что openvpn объединяет страны )))) Казахстан — Россия, как раз на днях кое-что попробую с помощью vpn
avatar
Не совсем понял, у вас не получилось по этой статье?
avatar
Я немного про другое — просто конфигурация чуть отличается, но результат тот же даёт )
avatar
Я новичок в этом деле, фирма маленькая и в конторе нет админа, все его функции выполняю я. Если провайдер блокирует некоторые сайты, установив сервер в своей сети мы сможем обходить блокировки? В сети всего пять ПК + Сервер 2003 шлюз с выходом в интернет. И ещё вопрос, мне нужно будет настроить только для одного пользователя выход на ОВПН сервер и сертификат для Сервера 2003? Так как все остальные клиенты в сети ходят через шлюз. Если нужно могу предоставить схему локальной сети. Спасибо.
avatar
Если провайдер блокирует куда-то доступ, то сервер в вашей сети поднимать смысла нет.
Вам нужен сервер снаружи, а изнутри в к нему коннектитесь и уже ходите туда куда вам нужно.
Технически ваш шлюз 2003 винде будет шлюзом по умолчанию, а на нем прописать уже нужную маршрутизацию для клиентов и пользоваться.
В вашей ситуации, городить огород смысла нет, купите доступ к VPN и пользуйтесь им, зато вам ничего поддерживать не придется, только платить.
avatar
Спасибо большое за ответ.
avatar
Не работает, собственно как и куча других туториалов
Какается:
**************************************************************
No /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf file could be found
Further invocations will fail
**************************************************************

И все, занавес…
avatar
А файл в папке есть?
avatar
Про другие туториалы, вы имели в виду на этом сайте, или вообще в интернете?
avatar
Конечно, в интернете, да фаил openssl.cnf есть, но он его не ел. Переименовал на openssl-1.0.0.cnf заработало О_о.
Теперь другая проблема, при создания пользователя получаю
failed to update database
TXT_DB error number 2
И ничего не коннектится, в логе на клиенте вижу не содержательную хрень:
May 03 19:37:07: Viscosity Mac 1.4.3 (1114)
May 03 19:37:07: Viscosity OpenVPN Engine Started
May 03 19:37:07: Running on Mac OS X 10.8.4
May 03 19:37:07: — May 03 19:37:07: Проверка доступоности соединения…
May 03 19:37:07: Соединение доступно. Подключаюсь.
May 03 19:37:09: OpenVPN 2.2.1 x86_64-apple-darwin10.8.0 [SSL] [LZO2] [PKCS11] [eurephia] built on Aug 1 2011
P/S Который раз сексом с этим OpenVPN занимаюсь, и без толку, не работает ни в какую. За сайт большое спасибо, все отлично у вас тут ;) много нового узнал, за что отдельное СПАСИБО!
avatar
Вы это на MacOS запускаете?
При обновлении TXT_DB прав достаточно, запускаете под su?
avatar
Да клиент MacBookPro, отличий клиетнской части с Windows здесь нет (потому как есть у меня доступ к hotsplots.de и мак подключается в win конфигом)
Все под root выполняю, вот думаю в сторону ssl придеться копать
avatar
По MacOS не смогу подсказать, мало практики
avatar
Так сервер то на Ubuntu 12.10 :) мак простой клиент с ним я сам разберусь, без проблем
avatar
А ларчик просто открывался:
nano /etc/ssl/openssl.cnf
и снимаем коммент со строки unique_subject = no
добавляет пользователя заново, все ошибки нет, все подключается замечательно.
avatar
классно!
avatar
Хммм
#Тип соединения TCP или UDP
proto tcp

может стоит использовать UDP? Скорость тунеля будет куда выше…
sites.inka.de/~W1011/devel/tcp-tcp.html
avatar
Скорость будет выше, но не будет коррекции ошибок, а если этот момент критичен, то нужно ставить TCP, если нет, то UDP.
Все зависит от задач!
avatar
Почти все торгаши VPN используют UPD, онлайн игры тоже. Даже на linux.org тему поднимали и сошлись на UDP ;)
avatar
Добрый вечер, вот тут вопрос возник, а как кинуть в tun туннель ipv6. Т.е я подключаюсь по ipv4 из работы к своему openvpn серверу, а уже в туннеле появляется доступ к ipv4 и ipv6. Очень было бы удобно для скачки файликов с nnm-club, а то бывает на раздаче 1-2 человека с ipv4 и 6-7 с ipv6. Вообще реально ли это?
avatar
Вполне.
На VPN сервере поднимаете IPv6 тоннель, и прописываете маршрутизацию из tun в IPv6 (например в Teredo) думаю что копать нужно в iptables
avatar
Исходя из статьи не совсем понятные начальные условия. Сколько интерфейсов у vpn server? и если 2, как быть в случае одного интерфейса. к примеру сеть находится за роутером. все станции находтся в одной сети. на роутере я пробрасываю порты для доступа к vpn server. как настроить впн так, что я просто к нему подключаюсь и имею доступ в локальную сеть? интернет не нуженн. мне нужны ресурсы сети.
avatar
Я писал, изначально, исходя из ситуации, что на VPN сервере 1 сетевой интерфейс, через который я выхожу в интернет.
А всего многообразия сложно предугадать…
Но ваш комментарий крайне полезен, нужно будет дополнить статью частью копающейся маршрутизации в локальную сеть!
avatar
Добрый день, у меня вопрос весьма экзотический…
Есть две виртуалки (на одной физической машине) терминальной ubuntu 12.04
Находятся в одной сети, один интернет канал, но попросили сделать так, чтобы одна ходила в интернет через другую, сделал все по инструкции, только вот в конце застрял, ибо у вас описано как это делается в паре Linux->Windows.
Так вот не могли бы немного помочь, а то два дня уже голову ломаю. (Я новичок, но хочу учиться)
avatar
загуглите на тему openvpn client linux
avatar
гуглил, вроде даже настроил, но как заставить клиент видеть сервер понять не могу, думал вы подскажете
avatar
у меня убунту сервер на нем DHCP 2 сетевухи все как обычно интернет через eth0 дает роутер. Но мне нужно чтобы интернет в локалку давал только PPPoE при етом DHCP чтоб раздавало айпи клиенту без интернета.Очень прошу помощи и ищу мануал по настройке.С линуксом знаком неделю. Сижу сутками напролет не могу никак настройить такой вариант.
avatar
А чего там сложного, маршрутизация не снаружи вовнутрь, а изнутри наружу…
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
Где добавьте интерфейс который торчит в интернет
avatar
вы не могли бы написать шаг за шагом настройка dhcp + pppoe?
Оч прошу.
avatar
7 раз переустанавливаю сервер из за неправильных настроек.ничего не работает.
avatar
Статья по настройке DHCP есть на этом сайте, используйте поиск.
а по pppoe куча статей в сети. Вы думаете-так легко, сел и написал статью…
avatar
Сегодня решил поднять openvpn на ubuntu 12.04, столкнулся опять с ошибкой
failed to update database
TXT_DB error number 2
В этот раз правка openssl.cnf не помогла, оказывается в папке keys по каким то не ведомым причинам не очищается index.txt и из-за этого новый пользователь не добавляется, посему нужно выполнить
rm /etc/openvpn/easy-rsa/2.0/keys/index.txt
touch /etc/openvpn/easy-rsa/2.0/keys/index.txt
Использовать touch нужно обязательно, иначе получим ошибку из-за отсутствия файла.

P/S Честно говоря, коммент пишу для себя, знаю что не раз к этой статье обращусь, еще раз спасибо автору :)
avatar
Файлик конфигурации клиента у вас отсутствует на сервере. Можете переложить куда нибудь?
avatar
Файл выкладывать не нужно. Там оказалось все тривиально просто :)
Так как настраиваю VPN с использованием OpenVPN впервые, то есть пара вопросов:
1. У вас в конф.файле есть опция push «redirect-gateway» которая определяет OpenVPN сервер в качестве шлюза по умолчанию. Т. е. при задании такого параметра весь трафик будет идти через наш настроенный сервер, а если я подключаюсь из вне и мне не надо чтобы мой трафик шел обратно в интернет через мой сервер, то эту опцию просто закомментировать?
2. Как сделать чтобы при подключении с Win клиента при использовании сертификата запрашивался еще и пароль, т.е. при генерации установить пароль на клиентский сертификат? Кажется есть параметр, но так как с такими задачами сталкиваюсь не часто, не знаю точно.
avatar
Подскажите пожалуйста, у меня есть компьютер-сервер у него имеется 2 сетевые карты: етх0(10,10,10,100) и етх1(192,168,1,200). С помощью опенВПН создаю подсеть 10.8.0.0/24. Какие мне правила для файрвола надо прописать, при том что у меня через сеть 192,168,0,0 уходит в инет( на роутер), к которому нет доступа.
avatar
посмотрите в тут howitmake.ru/blog/ubuntu/86.html
в пункте который касается настройки iptables
Есть что добавить? Регистрируйся и оставляй комментарии!