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

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

Рассмотрим схему более подробно:

В общем-то все просто до безобразия, DNS запросы у нас будут идти по не защищенному каналу, ведь доступ в интернет у нас все таки есть, мы будем пользоваться DNS сервером от Гугла, а вот содержимое того что запрашивается будет идти по защищенному каналу между клиентским ПК и OpeтVPN сервером, а сервер уже будет передавать данные наружи, получать ответ и возвращать их нам по VPN каналу. Также передаваемые между VPN клиентом и VPN сервером еще и сжимаются, правда это создает нагрузку на ЦПУ сервера, но не особо сильную. Для примера виртуальная машина с одним ядром и 1Гб ОЗУ имеет, при закачке торретов на скорости 30Мбит/с загрузку по ЦПУ в районе 32%, а по использованию ОЗУ +112Мб.
Установка OpenVPN
Повышаем права до rootsudo 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 комментариев
Вам нужен сервер снаружи, а изнутри в к нему коннектитесь и уже ходите туда куда вам нужно.
Технически ваш шлюз 2003 винде будет шлюзом по умолчанию, а на нем прописать уже нужную маршрутизацию для клиентов и пользоваться.
В вашей ситуации, городить огород смысла нет, купите доступ к VPN и пользуйтесь им, зато вам ничего поддерживать не придется, только платить.
Какается:
**************************************************************
No /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf file could be found
Further invocations will fail
**************************************************************
И все, занавес…
Теперь другая проблема, при создания пользователя получаю
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 занимаюсь, и без толку, не работает ни в какую. За сайт большое спасибо, все отлично у вас тут ;) много нового узнал, за что отдельное СПАСИБО!
При обновлении TXT_DB прав достаточно, запускаете под su?
Все под root выполняю, вот думаю в сторону ssl придеться копать
nano /etc/ssl/openssl.cnf
и снимаем коммент со строки unique_subject = no
добавляет пользователя заново, все ошибки нет, все подключается замечательно.
#Тип соединения TCP или UDP
proto tcp
может стоит использовать UDP? Скорость тунеля будет куда выше…
sites.inka.de/~W1011/devel/tcp-tcp.html
Все зависит от задач!
На VPN сервере поднимаете IPv6 тоннель, и прописываете маршрутизацию из tun в IPv6 (например в Teredo) думаю что копать нужно в iptables
А всего многообразия сложно предугадать…
Но ваш комментарий крайне полезен, нужно будет дополнить статью частью копающейся маршрутизации в локальную сеть!
Есть две виртуалки (на одной физической машине) терминальной ubuntu 12.04
Находятся в одной сети, один интернет канал, но попросили сделать так, чтобы одна ходила в интернет через другую, сделал все по инструкции, только вот в конце застрял, ибо у вас описано как это делается в паре Linux->Windows.
Так вот не могли бы немного помочь, а то два дня уже голову ломаю. (Я новичок, но хочу учиться)
для примера unix.yourmir.info/nastrojka-openvpn-linux-klienta/
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
Где добавьте интерфейс который торчит в интернет
Оч прошу.
а по pppoe куча статей в сети. Вы думаете-так легко, сел и написал статью…
вот тут вообще по другому непойму.
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 Честно говоря, коммент пишу для себя, знаю что не раз к этой статье обращусь, еще раз спасибо автору :)
Так как настраиваю VPN с использованием OpenVPN впервые, то есть пара вопросов:
1. У вас в конф.файле есть опция push «redirect-gateway» которая определяет OpenVPN сервер в качестве шлюза по умолчанию. Т. е. при задании такого параметра весь трафик будет идти через наш настроенный сервер, а если я подключаюсь из вне и мне не надо чтобы мой трафик шел обратно в интернет через мой сервер, то эту опцию просто закомментировать?
2. Как сделать чтобы при подключении с Win клиента при использовании сертификата запрашивался еще и пароль, т.е. при генерации установить пароль на клиентский сертификат? Кажется есть параметр, но так как с такими задачами сталкиваюсь не часто, не знаю точно.
openvpn.net/archive/openvpn-users/2004-10/msg00418.html
в пункте который касается настройки iptables