В предыдущей статье мы познакомились с простой, быстрой, но не очень безопасной настройкой 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 |
— |
Рисунок 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 от имени администратора. Справа снизу появиться значок с запущенным клиентом. Теперь нужно подключиться.
Рисунок 2.1 – Меню подключения к удаленному OpenVPN серверу
Далее нужно ввести пароль на секретный ключ.
Рисунок 2.2 – Запрос на ввод пароля на ключ
После ввода пароля мы получим уведомление о успешном подключении.
Рисунок 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 нам нужно закинуть все ключи, сертификаты и файлы на телефон.
Рисунок 2.4 – Ключи в папке на телефоне
Далее нужно установить OpenVPN клиент. К примеру OpenVPN for Android.
Рисунок 2.5 – OpenVPN for Android приложение
После установки, запускаем приложение и нажимаем кнопку импортирования конфигурации.
Рисунок 2.6 – Внешний вид OpenVPN for Android приложения
Далее ищем нашу папку и выбираем mobile-client.ovpn файл.
Рисунок 2.7 – OpenVPN конфигурация
После этого мы должны увидеть, что все файлы успешно импортировались, если нет – импортируйте вручную каждый файл, чтобы получить следующею картину. И нажмите значок сохранения.
Рисунок 2.8 – Успешная импортация OpenVPN конфигурации
После сохранения у нас появится новое подключение с названием mobile-client. Вы также можете пройтись по настройкам, чтобы убедиться, что все ок.
Рисунок 2.9 – Вид нового OpenVPN подключения
Далее нужно нажать на подключение и мы получим запрос на ввод пароля для секретного ключа.
Рисунок 2.10 – Вид запроса на ввод пароля для ключа
После ввода пароля и успешного подключения мы получим следующий вывод.
Рисунок 2.11 – Лог подключения
Как видно, мы успешно подключились. Теперь можно пингануть OpenVPN сервер.
Рисунок 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 сертификатов.
Прекрасная статя. Спосибо.
Застрял на IPTABLES. Оказывается что он несахроняетса. После перезагрузки надо заново ввести 🙂
А можно увидеть содержание файла mobile-client.ovpn ?
А как сделать чтобы с серверной части виделись клиенты?
Привет.
Сервер и так видит всех клиентов, если не видит одного — значит он не подключен.
Если имеется ввиду, чтобы клиенты видели друг друга, то нужна опция client-to-client
первая статья, после которой прописав маскарадинг всё взлетело, респект! даже днс-ы локальные пашут(многие с проблемами сталкиваются..) А тут прямо с полпинка
А как сделать что бы при запуске Windows, автоматически происходило подключение и ввод пароля?
Добавить в конфигурацию клиента строку:
auth-user-pass file_with_login_pass.txt
А в файл file_with_login_pass.txt вписать свой логин и пароль.
И добавить в автозагрузку клиент OpenVPN
Доброго времени суток. Есть одна трудность. На ПК клиента настроили openvpn подключение, но после каждого запуска ПК выскакивает окно с логином и паролем, по сути нужно нажать ок и соединение установиться. Но клиенты это зачастую игнорируют и подключение соответственно не активно. Можно ли как-то запилить автономную аутентификацию?
Добрый день. Да, логин и пароль можно прописать в файле, и потом добавить директиву auth-user-pass в конфигурации с указанием пути к файлу