Pull to refresh

Развертывание VPN сети на основе OpenVPN от А до Я

Введение


В этой статье рассматривается развертывание сети на базе OpenVPN.
Это пошаговое руководство для получения работоспособной сети и базируется на моем опыте развертывания OpenVPN.
Я решил статью поскольку, существующие в сети руководства имеют пробелы, затрудняющие быстрый запуск OpenVPN.

Задача


Наверно нет смысла рассказывать для чего используются VPN. Я приведу реальную задачу и расскажу как ее достичь.
Основная задача — это безопасное и простое решение доступа к внутренним ресурсам моих серверов.
Первый сервер является «домашним» серверов, подключенный к широкополосному соединению в городе под управлением CentOS 5.5, выполняющий различные функции, в том числе шлюза для квартирной сети. Назовем его CITY. Квартирная сеть использует адреса 192.168.22.0/24 и 192.168.21.0/24.
Второй сервер установлен на дальнем объекте, например, за городом на даче. Сервер работает под управлением CentOS 5.5 и выполняет функции шлюза для дачной сети и тоже выполняет другие задачи. Доступ в сеть осуществляется с помощью недорогого доступа по технологии 3G — в сервер воткнут USB 3g-модем и настроено устойчивое соединение. Назовем его CAMP. Дачная сеть использует адреса 192.168.23.0/24 и адреса 192.168.24.0/24.
А еще у меня есть ноутбук под управлением Windows XP, который вместе с владельцем попадает в разные сети, в том числе из дома, с работы и прочих гостевых мест, где есть доступ в Интернет. Назовем его NOTEBOOK.
Я хочу иметь доступ с ноутбука на мой домашний сервер CITY, в том числе к файлопомойке по NetBIOS и пр. А еще я хочу иметь доступ на сервер CAMP.
В случае CITY некоторые проблемы доступа можно решить публичным IP адресом. Но для CAMP публичный IP адрес у мобильных операторов практически недоступен или стоит неоправданно дорого для частного использования. А обычные клиенты работают через NAT. На ноутбуке проблемы сходные — как правило, везде NAT, бывают публичные открытые сети, где весь трафик виден всем пользователям.
Решением этих проблем является использование OpenVPN для связи всех компьютеров в единую сеть, заодно, защищенную от посторонних глаз.

Эскиз сети


CITY всегда включен и имеет внешний IP адрес, допустим 22.33.44.55, находится на широком и устойчивом канале, поэтому он будет сервером VPN.
А CAMP и NOTEBOOK клиентами VPN.
Сеть с адресами 192.168.25.0/24 выделяем под VPN.
Мы разрешим роутинг, чтобы видить все нужные сети.

Настраиваем сервер


Итак шаги для настройки сервера на базе СentOS, впрочем они легко применимы и для FedoraProject и собственно RedHat Enterprise Linux и прочим RPM based дистрибутивам, ну а с небольшими изменениями вполне должны работать по Debian/Ubuntu.
На всякий случай, выключите репозиторий rpmforge, т.к. в нем openvpn собран с неверными путями. Я использую репозиторий epel для установки OpenVPN.
Ставим openvpn:
yum install openvpn

переходим в рабочий каталог
cd /usr/share/openvpn/easy-rsa/2.0/

Настраиваем параметры сервера (необязательно):
vi vars

Инициализируем переменные окружения, для последующего запуска скриптов:
source ./vars

Очищаем все на всякий случай:
./clean-all

Создаем сертификат CA
./build-ca

Создаем сертификат X.509
./build-key-server server

Создаем ключ Диффи-Хеллмана
./build-dh

Создаем ta.key (TLS сертификат)
openvpn --genkey --secret /usr/share/openvpn/easy-rsa/2.0/keys/ta.key

Настраиваем конфигурацию сервера:
vi /etc/openvpn/openvpn.conf

Вот такой конфиг файл я использую:
port     1194
proto    udp
dev      tun
ca       /usr/share/openvpn/easy-rsa/2.0/keys/ca.crt
cert     /usr/share/openvpn/easy-rsa/2.0/keys/server.crt
key      /usr/share/openvpn/easy-rsa/2.0/keys/server.key
dh       /usr/share/openvpn/easy-rsa/2.0/keys/dh1024.pem
tls-auth /usr/share/openvpn/easy-rsa/2.0/keys/ta.key 0
push     "route-method exe"
push     "route-delay 2"
user     nobody
group    nobody
comp-lzo
persist-key
persist-tun
client-config-dir 	/etc/openvpn/ccd/
log-append  		/var/log/openvpn.log
verb 5
server   192.168.25.0 255.255.255.0
client-to-client

В этом варианте я использую файлы ключей и сертификатов по тем путям, где они реально находятся.
На время отладки оставляем уровень детализации журналов verb 5, затем его можно переключить на verb 1. Это надо сделать обязательно. Максимальный размер журнала — 2 Гб. При достижении этого лимита OpenVPN прекратит работу. Поэтому нужно уменьшить детализацию журналирования и настроить ротацию журнала средствами ОС — logrotate.
log-append перенастроен на нормальное место для записи логов сервера.
client-to-client разрешает трафик между клиентами.
Параметр client-config-dir указывает, где хранятся настройки подключения для каждого клиента. Создаем каталог /etc/openvpn/ccd
mkdir /etc/openvpn/ccd

В принципе сервер настроен, можно его перезапустить:
service openvpn restart

Не забудьте прописать автоматический запуск сервиса при перезагрузке системы.

А еще надо настроить firewall для разрешения трафика OpenVPN. Я использую исторически скрипт /etc/rc.d/rc.firewall, который настраивает все цепочки, так как мне надо. Поэтому команды мои выглядят примерно так:
iptables -A INPUT  -p udp --dport 1194 -j ACCEPT
iptables -A OUTPUT -p udp --sport 1194 -j ACCEPT

для идеологически правильного /etc/sysconfig/iptables строчка будут выглядить примерно так:
-A RH-Firewall-1-INPUT -p udp --dport 1194 -j ACCEPT

Через интерфейс настройки firewall команды setup нужно добавить в список портов через пробел строчку:
1194:udp

Для разрешения трафика между клиентами я использую команду:
iptables -A FORWARD     -s 192.168.25.0/24 -d 192.168.25.0/24 -j ACCEPT

а для разрешения трафика между подсетями:
iptables -A FORWARD     -s 192.168.25.0/24 -d 192.168.21.0/24 -j ACCEPT
iptables -A FORWARD     -s 192.168.25.0/24 -d 192.168.22.0/24 -j ACCEPT
iptables -A FORWARD     -s 192.168.21.0/24 -d 192.168.25.0/24 -j ACCEPT
iptables -A FORWARD     -s 192.168.22.0/24 -d 192.168.25.0/24 -j ACCEPT

В общем, у нас сервер окончательно настроен. Проверяем.
Наличие процесса:
ps -ef |grep openvpn
nobody    3605     1  0 14:45 ?        00:00:00 /usr/sbin/openvpn --daemon --writepid /var/run/openvpn/openvpn.pid --config openvpn.conf --cd /etc/openvpn --script-security 2

проверяем порты:
netstat -a -n -p |grep 1194
udp        0      0 0.0.0.0:1194     0.0.0.0:*  3605/openvpn

и обязательно должен присутствовать интерфейс tun0, если других VPN не запущено.
ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:192.168.25.1  P-t-P:192.168.25.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Все в порядке.

Настройка учетных записей клиентов


Для генерации и подписывания сертификатов используются два скрипта:
./build-key-pass <имя пользователя> 

— для создания сертификата с паролем и
./build-key <имя пользователя>

— для сертификата без пароля.
В первом случае для использования сертификата придется каждый раз вводить пароль, для пользователей, такой способ обеспечивает снижение рисков в случае попадания ноутбука в чужие руки. Для автоматического входа в сеть, сертификат нужно создавать без пароля.
Создаем аккаунт для ноутбука:
заходим в каталог
cd /usr/share/openvpn/easy-rsa/2.0/

инициализируем окружение командой:
source ./vars

генерируем ключ для пользователя notebook с паролем:
./build-key-pass notebook

в подкаталоге ./keys появится комплект файлов для авторизации.
А еще для клиента нужно настроить параметры сети, которые находятся в файлах с именем клиента /etc/openvpn/ccd/, в данном случае нужно редактировать файл notebook:
vi /etc/openvpn/ccd/notebook

В этом файле мы указываем адрес и другие сетевые параметры.
Самое главное — назначим адрес для клиента в нашей VPN подсети.
Дла совместимости со стеком TCP/IP Windows адреса клиентам назначаются с интервалом 4, фактически на каждого клиента выделяется подсеть с маской /30: адрес сети, адрес клиента, адрес шлюза, широковещательный адрес.
Вот здесь указан список возможных адресов
http://openvpn.net/index.php/open-source/documentation/howto.html#policy
Первая пара у нас занята адресом самого сервера. Выделяем адреса .5 и .6:
ifconfig-push 192.168.25.5 192.168.25.6

В моем случае, у меня есть свой DNS сервер по адресу 192.168.22.1, он обслуживает локальную DNS зону mynetwork, для настройки я добавлю в файл две строки:
push "dhcp-option DNS 192.168.22.1"

— укажем клиенту какой использовать DNS сервер
push "dhcp-option DOMAIN mynetwork"

— укажем зону по умолчанию для поиска имен DNS.
Поскольку мой сервер CITY имеет две подсети 192.168.22.0/24 и 192.168.21.0/24 и я хочу чтобы клиент мог их видеть, то нужно настроить маршруты, добавляем две строчки:
push "route 192.168.21.0 255.255.255.0"
push "route 192.168.22.0 255.255.255.0"

Теперь тоже самое делаю для клиента CAMP:
заходим в каталог
cd /usr/share/openvpn/easy-rsa/2.0/

инициализируем окружение командой:
source ./vars

генерируем ключ для пользователя camp с паролем:
./build-key camp

Настраиваем параметры сетевого доступа:
vi /etc/openvpn/ccd/camp

пишем:
ifconfig-push 192.168.25.9 192.168.25.10
push "dhcp-option DNS 192.168.22.1"
push "dhcp-option DOMAIN mynetwork"
push "route 192.168.21.0 255.255.255.0"
push "route 192.168.22.0 255.255.255.0"

Итак, настроен сервер, созданы две учетные записи для клиентов camp и notebook.
При подключении camp получит адрес 192.168.25.9, а notebook 192.168.25.5
Теперь дело за настройкой клиентов.

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


Для работы клиентов из каталога
/usr/share/openvpn/easy-rsa/2.0/keys/
забираем следующие файлы:
ca.crt — сертификат сервера
ta.key — tls сертификат
%username%.crt — персональный сертификат
%username%.key — персональный ключ

Настройка клиента под Windows XP на NOTEBOOK

Ставим openvpn вместе с GUI:
http://www.openvpn.net/index.php/open-source/downloads.html
например:
http://swupdate.openvpn.net/community/releases/openvpn-2.2-beta5-install.exe
Надо перегрузить систему, чтобы завершить установку VPN интерфейса.
Копируем клиентские файлы в каталог "C:\Program Files\OpenVPN\config\"
В данном случае, это:
ca.crt
ta.key
notebook.crt
notebook.key

Создаем файл конфигурации клиента notebook.ovpn:
client
dev tun
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
float
verb 1
ca              ca.crt
tls-auth        ta.key 1
remote          22.33.44.55 1194
cert            notebook.crt
key             notebook.key

В этом файл выключена запись в файл журнала, в противном случае OpenVPN-GUI не сможет контролировать работу клиента.
Если мы создали сертификат с паролем — нам придется устанавливать соединение всегда руками, т.к. потребуется ввод пароля:
1. Запускаем GUI.
2. В контекстном меню увидим пункт notebook, выбираем connect. Появляется окно журнал работы и запрос пароля на сертификат.
Если используем сертификат без пароля, можно использовать службу OpenVPN:
1. Запускаем services.msc
2. Находим OpenVPN service и ставим автоматический запуск и запускаем службу.
В обоих случаях при успехе — соединение установится, красные цвета иконки OpenVPN-GUI поменяют на зеленые. Будет присвоен адрес 192.168.25.5

Настройка клиента под CentOS на сервере CAMP

Выполняем
yum install openvpn

забираем клиентские файлы в каталог /etc/openvpn/:
ca.crt<br>
ta.key<br>
camp.crt<br>
camp.key<br>

создаем конфигурацию:
vi /etc/openvpn/openvpn.conf

конфигурация:
client
dev tun
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
float
verb 1
log-append      /var/log/openvpn.log
ca              ca.crt
tls-auth        ta.key 1
remote          22.33.44.55 1194
cert            camp.crt
key             camp.key

Разрешаем соединение в firewall. Само главное — обратные пакеты UDP пустить:
Я делаю так в своем любимом /etc/rc.d/rc.firewall:
echo OPENVPN client
iptables -A INPUT  -s 22.33.44.55 -p udp --sport 1194 -j ACCEPT
iptables -A OUTPUT -d 22.33.44.55 -p udp --dport 1194 -j ACCEPT

В принципе, клиент настроен, можно его перезапустить:
service openvpn restart

Не забываем обеспечить автостарт сервиса при перезагрузке.
Если все в порядке — появится интерфейс tun0, ему будет присвоен адрес 192.168.25.9

Наша VPN сеть запущена. Командой ping и доступом к известным сервисам проверяем работоспособность сети.

Диагностика и устранение неполадок


Основные средства проверки работы — это ping и tcpdump. Большинство ошибок выявляются этими командами.
Например, командой
tcpdump -i eth0 -l src port 1194 or dst port 1194

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

Судя по ошибкам — Адаптер VPN не работает под Windows.

Если установлен OpenVPN для Windows, но систему еще не перегружали — Перегрузите систему после установки OpenVPN.

При установке соединения выводится ошибка про журнал.

Если включено ведение журнала в файл, то OpenVPN-GUI может иметь проблемы при поднятии соединения, особенно на этапе запроса пароля. Помогает выключение ведения журнала и высокой детализации, нужно открыть *.ovpn файл и закомментировать две строчки (они в конце) вот так:
#log openvpn.log
#verb 5

Нет соединения.

Со стороны клиента нужно сделать пинг на адрес сервера — ping 22.33.44.55. Если не отвечает — устранить причину.
Под Windows убедиться, что openvpn.exe, openvpn-gui.exe и openvpnserv.exe не заблокирован персональным фаерволом или антивирусом.
Просмотреть ошибки в консоли и логе openvpn.log и погуглить их

Соединение не устанавливается — пакет пришел не «с того адреса».

Сопровождается ошибками:
Incoming packet rejected from ..., expected peer address…
Такое возможно если клиент находится «рядом» с сервером — пакеты посылаются на один адрес (внешний), а ответы приходят со внутреннего адреса. По умолчанию OpenVPN считает такую конфигурацию небезопасной и блокирует работу. Опция float устраняет проблему.

Соединение есть, но туннель не работает.

1. Убедиться, что персональный firewall не блокирует трафик для подсети 192.168.25.*
2. Что присутствуют маршруты во внутренние подсети — команда в Windows: route print.
3. В случае Vista/W7 не забыть запускать клиента с правами Администратора, иначе не поднимаются маршруты!
В остальных случаях помогает увеличение детализации вывода опцией verb и внимательное штудирование openvpn.log

Послесловие


Показанный пример годится для приготовления OpenVPN не только в домашних условиях, но и для офисной среды. Одно важное НО. Мы не рассмотрели механизм списков отзывов сертификатов в случае прекращения доступа отдельным пользователям. Для большого количества пользователей автоматизация предоставления доступа, мониторинг активности и прекращение доступа являются весьма важными моментами. Надеюсь рассмотреть эти аспекты в будущем.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.