OpenVPN. Установка и настройка client-server соединения

OpenVPN_client_serverВ предыдущей статье мы познакомились с простой, быстрой, но не очень безопасной настройкой VPN соединения в режиме point-to-point используя OpenVPN. Предыдущая настройка имеет серьезный недостаток: к серверу может одновременно подключиться только один клиент, и если секретный ключ будет скомпрометирован, его нужно будет менять как на серверной стороне, так и на клиентской (т.е. опять передавать ключ по безопасному каналу и генерировать новый). Также, если шифрованный трафик был записан – с получением ключа злоумышленник может декодировать его.
В данной статье пойдет речь о настройке безопасного OpenVPN соединения в client/server режиме с использованием сертификатов и возможностью их отзыва (CRL). В роли OpenVPN клиентов будут выступать Ubuntu 14.04, Windows 8.1 и телефон c Android 5.1. В роли OpenVPN сервера будет выступать Ubuntu 14.04 с дополнительным сервером доступным только через локальную сети.
 
 
 

2. OpenVPN в режиме client-server

У нас будет локальная сеть за OpenVPN сервером к которой каждый OpenVPN клиент должен иметь доступ. Для подключения будут использоваться персональные сертификаты.

Таблица 2.1 – IP-адреса и название сертификатов/ключей удаленных узлов

 

WAN IP

LAN IP

Сертификат и ключ

Windows client

46.125.50.50

frodo-qa

Android client

87.125.80.50

jack-hr

Ubuntu client

82.30.5.50

alex-it

Ubuntu VPN server

62.90.120.200

192.168.100.100

vpn-server

Ubuntu LAN server

192.168.100.101

client-server_net
Рисунок 2.1 – Схема подключений

Все нужные данные у нас есть, приступаем к практике.

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

Для начала нужно настроить главный элемент любой VPN сети – VPN сервер. Логинимся и устанавливаем.

root@vpn-server:~# apt-get install openvpn

2.1.1 Создание конфигурационного файла

Теперь создаем главный конфигурационный файл.

root@vpn-server:~# cat /etc/openvpn/client_server.conf
# Протокол
proto udp
# На каком порту будет работать OpenVPN
port 1194
# Тип устройства
dev tun
# Автоматически присваиваем адреса всем клиентам в этом диапазоне
server 10.90.90.0 255.255.255.0
# Если будут Windows клиенты – нужно ставить subnet топологию
topology subnet
# Не перечитывать файлы ключей при перезапуске OpenVPN
persist-key
# Не перезапускать/пересоздавать tun/tap устройство и скрипты при перезапуске OpenVPN
persist-tun
# Каждые 10 сек пинговать удаленный хост и если через 60 сек нет ответа – перезапустить связанный туннель.
keepalive 10 60
# Добавить связь между OpenVPN клиентами
client-to-client
# Позволять подключение только тех клиентов, у которых сертификат X.509 EKU с атрибутом "TLS Web Client Authentication"
remote-cert-tls client
# Дополнительный уровень HMAC аутентификации против DDoS c direction=0 (в клиентов будет 1).
tls-auth        /etc/openvpn/certs/ta.key 0
# Diffie Hellman параметры для временных ключей
dh              /etc/openvpn/certs/dh2048.pem
# Рутовый сертификат
ca              /etc/openvpn/certs/ca.crt
# Подписанный сертификат VPN сервера
cert            /etc/openvpn/certs/vpn-server.crt
# Приватный ключ VPN сервера
key             /etc/openvpn/certs/vpn-server.key
# CRL (certificate revocation list) для отзыва цифровых сертификатов
crl-verify      /etc/openvpn/certs/crl.pem
# Юзер и група от имени которого запускать OpenVPN сервер
user nobody
group nogroup
# Уровень логирования
verb 5
# Режим запуска - демон
daemon
# Путь к лог файлу
log-append /var/log/openvpn-server.log
# Статус VPN подключений пишем каждые 3 сек
status /var/run/openvpn.status 3
# Маршрут, который должен добавит каждый клиент себе в таблицу маршрутизации для доступа к LAN сети за сервером
push "route 192.168.100.0 255.255.255.0"

Для вышенаписанного client_server.conf нужно создать все упомянутые ключи и сертификаты.
Инструкцию по их созданию можно почитать в этой статье.
Создадим файл параметров Diffie-Hellman и tls-auth ключ.

root@vpnserver:~# openssl dhparam -out /etc/openvpn/certs/dh2048.pem 2048
root@vpnserver:~# openvpn --genkey --secret /etc/openvpn/certs/ta.key

Ключ ta.key – это тот же secret ключ из предыдущей статьи.
Будем полагать, что вы прочитали статью по созданию ключей или имеете свои клиентские и серверные ключи. Так же не забываем поставить права на папку с ключами и сменить владельца, так как у нас сервер запускается от имени nobody:nogroup.

root@vpnserver:~# chown -R nobody:nogroup /etc/openvpn/certs
root@vpnserver:~# chmod 700 /etc/openvpn/certs

2.1.2 Настройка обратной маршрутизации

Когда создается любой VPN туннель – всегда возникает вопрос маршрутизации. В нашем случаи VPN server должен маршрутизировать все пакеты от VPN клиентов в свою LAN сеть и обратно. Маршрут от клиентов к удаленной LAN сети через VPN туннель мы добавили (push директива в client_server.conf). Но нам также нужен обратный маршрут через LAN от каждого сервера в DATACENTER сети к VPN клиенту через VPN туннель. В данном случи мы можем прописать статические маршруты на каждом из DATACENTER серверов обратно к VPN клиенту, но это очень непрактичный и тугой вариант если количество серверов больше десятка. Мы просто добавим маскарадинг на VPN server-е, что позволит нам подменять IP каждого VPN клиента на IP VPN server-а.

root@vpnserver:~# iptables -t nat -I POSTROUTING -o eth1 -s 10.90.90.0/24 -j MASQUERADE

Теперь каждый пакет VPN клиента будет идти через VPN туннель, после этого на VPN сервере source IP подменяется на IP VPN сервера (192.168.100.100) и уходит в DATACENTER сеть. После чего каждый хоп думает, что пакет пришел от их собрата и отправляет ответ обратно на VPN сервер, а сам сервер при получении пакета – отправляет его через туннель к клиенту.
Также нужно добавить возможность проброса пакетов между интерфейсами.

root@vpnserver:~# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

root@vpnserver:~# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

В нашем случаи этого достаточно для маршрутизации.

2.1.3 Запуск VPN сервера

Осталось только запустить VPN сервер и посмотреть логи, все ли хорошо.

root@vpnserver:~# /etc/init.d/openvpn start
 * Starting virtual private network daemon(s)...
 * Autostarting VPN 'client_server'
Enter Private Key Password:

root@vpnserver:~# tail /var/log/openvpn-server.log
Mon Jan 11 21:36:00 2016 us=907493 /sbin/ip link set dev tun0 up mtu 1500
Mon Jan 11 21:36:00 2016 us=910880 /sbin/ip addr add dev tun0 10.90.90.1/24 broadcast 10.90.90.255
Mon Jan 11 21:36:00 2016 us=914641 Data Channel MTU parms [ L:1541 D:1450 EF:41 EB:4 ET:0 EL:0 ]
Mon Jan 11 21:36:00 2016 us=918214 GID set to nogroup
Mon Jan 11 21:36:00 2016 us=918266 UID set to nobody
Mon Jan 11 21:36:00 2016 us=918285 UDPv4 link local (bound): [undef]
Mon Jan 11 21:36:00 2016 us=918295 UDPv4 link remote: [undef]
Mon Jan 11 21:36:00 2016 us=918306 MULTI: multi_init called, r=256 v=256
Mon Jan 11 21:36:00 2016 us=918357 IFCONFIG POOL: base=10.90.90.2 size=252, ipv6=0
Mon Jan 11 21:36:00 2016 us=918383 Initialization Sequence Completed

Как видим, все гуд. Теперь можно, также, проверить статус подключений.

root@vpnserver:~# cat /var/run/openvpn.status
OpenVPN CLIENT LIST
Updated,Mon Jan 11 21:37:51 2016
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
GLOBAL STATS
Max bcast/mcast queue length,0
END

Как видим, пока у нас нет подключений.

2.2 Настройка Ubuntu VPN клиента

Для настройки Linux клиента нам нужен установленный клиент, конфигурационный файл и сертификаты.
Установка OpenVPN клиент под Ubuntu 14.04 очень проста.

root@vpnclient~# apt-get install openvpn

Как генерировать клиентские сертификаты и ключе можно познать в этой статье.
Осталось создать конфигурационный файл.

root@vpnclient:~# cat /etc/openvpn/vpnclient.conf
# Режим клиента
client
# Протокол
proto udp
# Порт к которому будет подключаться OpenVPN клиент
port 1194
# Тип устройства
dev tun
# Адрес OpenVPN сервера
remote 62.90.120.200
# Использовать динамический порт для обратной связи
nobind
# Позволять подключение только серверу у которого сертификат X.509 EKU с атрибутом “TLS Web Server Authentication”
remote-cert-tls server
# Это я уже описал в серверной части 
persist-key
persist-tun
tls-auth        /etc/openvpn/certs/ta.key 1
ca              /etc/openvpn/certs/ca.crt
cert            /etc/openvpn/certs/alex-it.crt
key             /etc/openvpn/certs/alex-it.key
user nobody
group nogroup
verb 5
daemon
log-append /var/log/openvpn-client.log

Осталось запустит клиент.

root@vpnclient:~# /etc/init.d/openvpn start
* Starting virtual private network daemon(s)...
* Autostarting VPN 'vpnclient'
Enter Private Key Password:

root@vpnclient:~# tail /var/log/openvpn-client.log
Mon Jan 11 22:13:13 2016 us=29323 TUN/TAP device tun0 opened
Mon Jan 11 22:13:13 2016 us=29426 TUN/TAP TX queue length set to 100
Mon Jan 11 22:13:13 2016 us=29478 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Mon Jan 11 22:13:13 2016 us=29538 /sbin/ip link set dev tun0 up mtu 1500
Mon Jan 11 22:13:13 2016 us=47265 /sbin/ip addr add dev tun0 10.90.90.2/24 broadcast 10.90.90.255
Mon Jan 11 22:13:13 2016 us=55086 /sbin/ip route add 192.168.100.0/24 via 10.90.90.1
Mon Jan 11 22:13:13 2016 us=61943 GID set to nogroup
Mon Jan 11 22:13:13 2016 us=62002 UID set to nobody
Mon Jan 11 22:13:13 2016 us=62023 Initialization Sequence Completed

Как видим, мы успешно подключились к OpenVPN серверу. Теперь нужно проверить доступ к LAN серверу, которой доступен только по локальному IP в DATACENTER сети.

root@vpnclient:~# ping -c 4 192.168.100.101
PING 192.168.100.101 (192.168.100.101) 56(84) bytes of data.
64 bytes from 192.168.100.101: icmp_seq=1 ttl=52 time=111 ms
64 bytes from 192.168.100.101: icmp_seq=2 ttl=52 time=117 ms
64 bytes from 192.168.100.101: icmp_seq=3 ttl=52 time=113 ms
64 bytes from 192.168.100.101: icmp_seq=4 ttl=52 time=111 ms

Как видим, все работает как положено. Также можно проверить статус сервера.

root@vpnserver:~# cat /var/run/openvpn.status
OpenVPN CLIENT LIST
Updated,Mon Jan 11 22:13:45 2016
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
alex-it,82.30.5.50:42271,6634,7728,Mon Jan 11 22:13:15 2016
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.90.90.2,alex-it,82.30.5.50:42271,Mon Jan 11 22:14:45 2016
GLOBAL STATS
Max bcast/mcast queue length,0
END

Как видим, у нас есть первый подключенный клиент.

2.3 Настройка Windows VPN клиента

Windows OpenVPN клиент можно скачать здесь. Установка стандартная. После установки можно создать отдельную папку со всеми нужными файлами/конфигурациями и закинуть в папку config (Путь — c:\Program Files\OpenVPN\config\).

PS C:\Program Files\OpenVPN\config> ls DATACENTER

    Directory: C:\Program Files\OpenVPN\config\DATACENTER

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         1/13/2016  10:22 PM       1155 ca.crt
-a---         1/13/2016  10:22 PM       4346 frodo-qa.crt
-a---         1/13/2016  10:22 PM       1834 frodo-qa.key
-a---         1/13/2016  10:22 PM        636 ta.key

Теперь добавим конфигурационный файл с расширением *.ovpn (формат конфигурационных файлов для OpenVPN Windows клиентов).

PS C:\Program Files\OpenVPN\config> cat .\DATACENTER\windows-client.ovpn
# Режим клиента
client
# Протокол
proto udp
# Порт к которому будет подключаться OpenVPN клиент
port 1194
# Тип устройства
dev tun
# Адрес OpenVPN сервера
remote 62.90.120.200
# Использовать динамический порт для обратной связи
nobind
# Позволять подключение только серверу у которого сертификат X.509 EKU с атрибутом "TLS Web Server Authentication"
remote-cert-tls server
# Это я уже описал в серверной части 🙂
persist-key
persist-tun
tls-auth           ta.key 1
ca                 ca.crt
cert               frodo-qa.crt
key                frodo-qa.key
verb 5

Далее, нужно запустить OpenVPN GUI от имени администратора. Справа снизу появиться значок с запущенным клиентом. Теперь нужно подключиться.
wincli1
Рисунок 2.1 – Меню подключения к удаленному OpenVPN серверу

Далее нужно ввести пароль на секретный ключ.

wincli2
Рисунок 2.2 – Запрос на ввод пароля на ключ

После ввода пароля мы получим уведомление о успешном подключении.

wincli3
Рисунок 2.3 – Успешное подключение

Теперь осталось пропинговать VPN сервер и LAN сервер.

PS C:\Program Files\OpenVPN\config> ping 10.90.90.1

Pinging 10.90.90.1 with 32 bytes of data:
Reply from 10.90.90.1: bytes=32 time=124ms TTL=46
Reply from 10.90.90.1: bytes=32 time=127ms TTL=46
Reply from 10.90.90.1: bytes=32 time=120ms TTL=46
Reply from 10.90.90.1: bytes=32 time=138ms TTL=46

PS C:\Program Files\OpenVPN\config> ping 192.168.100.101

Pinging 192.168.100.101 with 32 bytes of data:
Reply from 192.168.100.101: bytes=32 time=127ms TTL=45
Reply from 192.168.100.101: bytes=32 time=129ms TTL=45
Reply from 192.168.100.101: bytes=32 time=122ms TTL=45
Reply from 192.168.100.101: bytes=32 time=131ms TTL=45

Все ок. Теперь смотрим статус сервера.

root@vpnserver:~# cat /var/run/openvpn.status
OpenVPN CLIENT LIST
Updated,Wed Jan 13 23:06:10 2016
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
frodo-qa,46.125.50.50:56778,31143,13286,Wed Jan 13 22:46:15 2016
alex-it,82.30.5.50:42271,25323,26470,Wed Jan 13 22:06:39 2016
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.90.90.2,alex-it,82.30.5.50:42271,Wed Jan 13 22:55:09 2016
10.90.90.3,frodo-qa,46.125.50.50:56778,Wed Jan 13 22:55:44 2016
GLOBAL STATS
Max bcast/mcast queue length,1
END

Как видим, у нас теперь подключено два клиента. Осталось проверить подключение с мобильного устройства.

2.4 Настройка Android VPN клиента

Для настройки мобильного OpenVPN нам нужно закинуть все ключи, сертификаты и файлы на телефон.

android1
Рисунок 2.4 – Ключи в папке на телефоне

Далее нужно установить OpenVPN клиент. К примеру OpenVPN for Android.

android2
Рисунок 2.5 – OpenVPN for Android приложение

После установки, запускаем приложение и нажимаем кнопку импортирования конфигурации.

android3
Рисунок 2.6 – Внешний вид OpenVPN for Android приложения

Далее ищем нашу папку и выбираем mobile-client.ovpn файл.

android4
Рисунок 2.7 – OpenVPN конфигурация

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

android5
Рисунок 2.8 – Успешная импортация OpenVPN конфигурации

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

android6
Рисунок 2.9 – Вид нового OpenVPN подключения

Далее нужно нажать на подключение и мы получим запрос на ввод пароля для секретного ключа.

android7
Рисунок 2.10 – Вид запроса на ввод пароля для ключа

После ввода пароля и успешного подключения мы получим следующий вывод.

android8
Рисунок 2.11 – Лог подключения

Как видно, мы успешно подключились. Теперь можно пингануть OpenVPN сервер.

android9
Рисунок 2.12 – Пинг удаленного OpenVPN сервера

Сервер доступен. На остаток проверим статус подключений на серверной стороне.

root@vpnserver:~# cat /var/run/openvpn.status
OpenVPN CLIENT LIST
Updated,Wed Jan 13 23:06:10 2016
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
frodo-qa,46.125.50.50:56778,31143,13286,Wed Jan 13 22:46:15 2016
jack-hr,87.125.80.50:52070,5037,4777,Wed Jan 13 23:51:03 2016
alex-it,82.30.5.50:42271,25323,26470,Wed Jan 13 22:06:39 2016
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.90.90.4,jack-hr,87.125.80.50:52070,Wed Jan 13 23:51:04 2016
10.90.90.2,alex-it,82.30.5.50:42271,Wed Jan 13 22:55:09 2016
10.90.90.3,frodo-qa,46.125.50.50:56778,Wed Jan 13 22:55:44 2016
GLOBAL STATS
Max bcast/mcast queue length,1
END

Как видим, все три клиента подключены к серверу и работают в штатном режиме. На этом все. В следующей статье пойдет речь о созданию и отзывах OpenVPN сертификатов.

Автор: admin, 16 января 2016
Рубрики: Безопасность
Метки:
10 комментариев к сообщению: “OpenVPN. Установка и настройка client-server соединения”
  1. Tomas:

    Прекрасная статя. Спосибо.
    Застрял на IPTABLES. Оказывается что он несахроняетса. После перезагрузки надо заново ввести 🙂

  2. Евгений:

    А можно увидеть содержание файла mobile-client.ovpn ?

    • PS D:\Site\Articles\OpenVPN1\Android-client> ls
      
      
          Каталог: D:\Site\Articles\OpenVPN1\Android-client
      
      
      Mode                LastWriteTime         Length Name
      ----                -------------         ------ ----
      -a----       13.01.2016     22:22           1155 ca.crt
      -a----       13.01.2016     22:22           4345 jack-hr.crt
      -a----       13.01.2016     22:22           1834 jack-hr.key
      -a----       13.01.2016     23:34            790 mobile-client.ovpn
      -a----       13.01.2016     22:22            636 ta.key
      
      
      PS D:\Site\Articles\OpenVPN1\Android-client> cat .\mobile-client.ovpn
      # Режим клиента
      client
      # Протокол
      proto udp
      # Порт к которому будет подключаться OpenVPN клиент
      port 1194
      # Тип устройства
      dev tun
      # Адрес OpenVPN сервера
      remote 62.90.120.200
      # Использовать динамический порт для обратной связи
      nobind
      # Позволять подключение только серверу у которого сертификат X.509 EKU с атрибутом “TLS Web Server Authentication”
      remote-cert-tls server
      # Это я уже описал в серверной части
      persist-key
      persist-tun
      tls-auth        ta.key 1
      ca              ca.crt
      cert            jeck-hr.crt
      key             jeck-hr.key
      verb 5
      
      PS D:\Site\Articles\OpenVPN1\Android-client>
      
  3. Асылбек:

    А как сделать чтобы с серверной части виделись клиенты?

    • Привет.
      Сервер и так видит всех клиентов, если не видит одного — значит он не подключен.
      Если имеется ввиду, чтобы клиенты видели друг друга, то нужна опция client-to-client

  4. Serg:

    первая статья, после которой прописав маскарадинг всё взлетело, респект! даже днс-ы локальные пашут(многие с проблемами сталкиваются..) А тут прямо с полпинка

  5. Dangas:

    А как сделать что бы при запуске Windows, автоматически происходило подключение и ввод пароля?

    • Добавить в конфигурацию клиента строку:
      auth-user-pass file_with_login_pass.txt
      А в файл file_with_login_pass.txt вписать свой логин и пароль.
      И добавить в автозагрузку клиент OpenVPN

  6. Роман:

    Доброго времени суток. Есть одна трудность. На ПК клиента настроили openvpn подключение, но после каждого запуска ПК выскакивает окно с логином и паролем, по сути нужно нажать ок и соединение установиться. Но клиенты это зачастую игнорируют и подключение соответственно не активно. Можно ли как-то запилить автономную аутентификацию?

    • Добрый день. Да, логин и пароль можно прописать в файле, и потом добавить директиву auth-user-pass в конфигурации с указанием пути к файлу

Написать комментарий

Последние статьи

Яндекс.Метрика
?>