openvpn на CentOS 8

Thank you for reading this post, don't forget to subscribe!

VPN - набор тех­но­ло­гий, кото­рые поз­во­ля­ют орга­ни­зо­вать логи­че­скую сеть поверх дру­гих. Чаще все­го в роли дру­гих сетей высту­па­ет Интер­нет. Если про­сты­ми сло­ва­ми, то с помо­щью VPN мож­но орга­ни­зо­вать еди­ную локаль­ную сеть раз­де­лен­ных интер­не­том сег­мен­тов сети. Так как Интер­нет - обще­до­ступ­ная сеть, то тра­фик внут­ри создан­ной логи­че­ской сети шиф­ру­ет­ся раз­лич­ны­ми сред­ства­ми для орга­ни­за­ции защи­ты пере­да­ва­е­мых данных.

OpenVPN - одна из реа­ли­за­ций тех­но­ло­гии VPN с откры­тым исход­ным кодом, а зна­чит бес­плат­ная. С ее помо­щью мож­но объ­еди­нять в еди­ную сеть ком­пью­те­ры в том чис­ле и нахо­дя­щи­е­ся за NAT, что очень удоб­но. Openvpn под­дер­жи­ва­ет все попу­ляр­ные на сего­дняш­ний день опе­ра­ци­он­ные систе­мы, в том чис­ле и Windows.

Сре­ди мало­го и сред­не­го биз­не­са сер­вер openvpn очень попу­ля­рен бла­го­да­ря сво­ей бес­плат­но­сти, крос­сплат­фор­мен­но­сти, быст­ро­те и гиб­ко­сти настро­ек. Лич­но я пред­по­чи­таю имен­но его для объ­еди­не­ния уда­лен­ных локаль­ных сетей. Его же пред­по­чи­та­ют исполь­зо­вать vpn-про­вай­де­ры для ока­за­ния сво­их услуг по орга­ни­за­ции ано­ним­но­го сер­фин­га в интернете.

Объединение офисов с помощью openvpn

У нас име­ет­ся офис с шлю­зом CentOS 8, на кото­рый мы будем уста­нав­ли­вать openvpn сер­вер. И есть фили­ал с таким же шлю­зом, где будет уста­нов­лен openvpn client для под­клю­че­ния сети фили­а­ла к офису:

Опи­са­ние схе­мы сети
Имя Centos-server PC1 Centos-client PC2
Внеш­ний ip 10.20.1.38 192.168.13.188
Локаль­ный ip 192.168.220.1 192.168.220.10 192.168.150.1 192.168.150.10
Ком­мен­та­рий Сер­вер openvp и шлюз в офисе Ком­пью­тер с Windows 10 в офисе Кли­ент openvp и шлюз в филиале Ком­пью­тер с Windows 10 в филиале

В дан­ном слу­чае сер­вер в фили­а­ле может быть без внеш­не­го бело­го IP адре­са, это не прин­ци­пи­аль­но, все будет рабо­тать и так. Нам необ­хо­дим толь­ко один внеш­ний IP адрес на сер­ве­ре. Все осталь­ные кли­ен­ты могут быть за NAT, это не поме­ша­ет успеш­но­му объ­еди­не­нию локаль­ных сетей.

Наша зада­ча в дан­ном слу­чае будет сво­дить­ся к тому, что­бы ком­пью­те­ры PC1 и PC2 уви­де­ли друг дру­га и мог­ли сов­мест­но исполь­зо­вать свои сете­вые ресур­сы в обе сто­ро­ны. То есть как за сер­ве­ром, так и за кли­ен­том openvpn мы долж­ны видеть сеть.

Хочу отме­тить, что кон­фи­гу­ра­ция openvpn крос­сплат­фор­мен­ная и отлич­но пере­но­сит­ся с одной систе­мы на дру­гую, необ­хо­ди­мо толь­ко пути про­ве­рить, так как в каж­дой систе­ме они свои. Моя инструк­ция подой­дет для настрой­ки openvpn сер­ве­ра на любой опе­ра­ци­он­ной систе­ме, отли­чать­ся будут толь­ко спе­ци­фич­ные для каж­дой систе­мы коман­ды уста­нов­ки и про­вер­ки, но сама суть настрой­ки vpn будет такой же.

У меня на стен­де 10.20.1.38 и 192.168.13.188 по сути внеш­ние IP адре­са, кото­рые смот­рят в интернет.

Где скачать openvpn

Преж­де чем при­сту­пить к уста­нов­ке и настрой­ке, давай­те посмот­рим, где мож­но ска­чать все, что нам пона­до­бит­ся в нашей рабо­те. Све­жие и акту­аль­ные вер­сии все­гда мож­но най­ти на стра­нич­ке downloads офи­ци­аль­но­го сайта.

Где мож­но ска­чать openvpn
Исход­ни­ки openvpn-2.5.0.tar.gz
Openvpn client Windows 32 bit OpenVPN-2.5.0-I601-x86.msi
Openvpn client Windows 64 bit OpenVPN-2.5.0-I601-amd64.msi
Openvpn Portable openvpn-portable-win64-setup.exe

Сра­зу же про­ком­мен­ти­рую по пово­ду portable вер­сии openvpn. На теку­щий момент офи­ци­аль­ной пор­ти­ро­ван­ной вер­сии openvpn не суще­ству­ет. Та вер­сия, на кото­рую я дал ссыл­ку, най­де­на мной в гуг­ле и сде­ла­на отдель­ной коман­дой Portapps. Это наи­бо­лее акту­аль­ная и све­жая вер­сия. До нее я исполь­зо­вал OpenVPN Portable с sourceforge, но она силь­но уста­ре­ла, хотя кое-где может и рабо­тать. Я спе­ци­аль­но по это­му пово­ду почи­тал форум Community Openvpn и нашел там неуте­ши­тель­ные отве­ты. Раз­ра­бот­чи­ки гово­рят, что portable вер­сия openvpn не под­дер­жи­ва­ет­ся и выпус­кать ее они даже не соби­ра­ют­ся. А жаль, было бы удоб­но полу­чить пор­ти­ро­ван­ную вер­сию от них.

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

Установка openvpn на CentOS 8

Теперь вер­нем­ся к нашей зада­че. Я под­ра­зу­ме­ваю, что у вас уже есть уста­нов­лен­ный и настро­ен­ный сер­вер CentOS. Если еще нет, то може­те вос­поль­зо­вать­ся мои­ми мате­ри­а­ла­ми. В них рас­кры­ты сле­ду­ю­щие темы:

Уста­нав­ли­ва­ем openvpn на оба наших сер­ве­ра, кото­рые явля­ют­ся шлю­за­ми в сво­их сег­мен­тах сети. Пер­вым делом под­клю­ча­ем репо­зи­то­рий epel к centos:

Выпол­ня­ем непо­сред­ствен­но установку:

Создание сертификатов

Для рабо­ты сер­ве­ра openvpn необ­хо­ди­мо создать соот­вет­ству­ю­щие сер­ти­фи­ка­ты. Для это­го вос­поль­зу­ем­ся про­грам­мой Easy-RSA, кото­рая гене­ри­ру­ет сер­ти­фи­ка­ты с помо­щью ути­ли­ты openssl. Все рабо­ты в этом раз­де­ле выпол­ня­ем толь­ко на centos-server.

Созда­ем дирек­то­рию для ключей:

Ска­чи­ва­ем и уста­нав­ли­ва­ем ути­ли­ту Easy-RSA. Ссыл­ку на послед­нюю вер­сию мож­но посмот­реть на github.

Если полу­ча­е­те сообщение:

То уста­нав­ли­ва­е­те wget:

Про­дол­жа­ем:

Созда­ем струк­ту­ру пуб­лич­ных PKI ключей:

Создай­те удо­сто­ве­ря­ю­щий центр CA:

 

 

 

Не забудь­те ука­зан­ный пароль. Его нуж­но будет вво­дить каж­дый раз при созда­нии ново­го сер­ти­фи­ка­та openvpn.

Мы полу­чи­ли 2 файла:

  • /etc/openvpn/keys/easyrsa/pki/private/ca.key
  • /etc/openvpn/keys/easyrsa/pki/ca.crt

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

Созда­ем запрос сер­ти­фи­ка­та для сер­ве­ра без паро­ля с помо­щью опции nopass, ина­че при­дет­ся вво­дить пароль с кон­со­ли при каж­дом запус­ке сервера:

 

 

 

Под­пи­сы­ва­ем запрос на полу­че­ние сер­ти­фи­ка­та у наше­го CA:

 

 

 

В про­цес­се рабо­ты скрип­та вво­дим пароль от CA, кото­рый ука­зы­ва­ли рань­ше и отве­ча­ем на вопрос yes. Мы полу­чи­ли под­пи­сан­ный удо­сто­ве­ря­ю­щим цен­тром сер­ти­фи­кат для сер­ве­ра - /etc/openvpn/keys/easyrsa/pki/issued/server.crt

Нам еще при­го­дит­ся ключ Диф­фи-Хел­ма­на, гене­ри­ру­ем его:

По завер­ше­нию рабо­ты скрип­та полу­ча­ем файл dh сер­ти­фи­ка­та - /etc/openvpn/keys/easy-rsa/pki/dh.pem.

Копи­ру­ем в пап­ку /etc/openvpn/server/ все необ­хо­ди­мые для рабо­ты openvpn сер­ве­ра файлы:

Так же сге­не­ри­ру­ем еще один ключ, кото­рый на при­го­дит­ся для шиф­ро­ва­ния TLS control channel, что повы­ша­ет безопасность.

Созда­дим ключ для кли­ен­та openvpn:

Про­це­ду­ра ана­ло­гич­на созда­нию сер­ти­фи­ка­та для сер­ве­ра. Так же вво­дим пароль, отве­ча­ем yes. В резуль­та­те полу­ча­ем под­пи­сан­ный сер­ти­фи­кат клиента:

  •  /etc/openvpn/keys/easy-rsa/pki/issued/client01.crt
  • /etc/openvpn/keys/easy-rsa/pki/private/client01.key

Коман­ды gen-req и sign-req мож­но объ­еди­нить в одну с помо­щью build-client-full при­мер­но так:

Кли­ен­ту, кото­рым у нас явля­ет­ся шлюз фили­а­ла, нуж­но будет пере­дать сле­ду­ю­щий набор фай­лов - client01.crt, client01.key, ca.crt, tc.key. Либо исполь­зо­вать еди­ный файл кон­фи­гу­ра­ции кли­ен­та, кото­рый вклю­ча­ет в себя в том чис­ле и сер­ти­фи­ка­ты. Я отдель­но пока­жу как это сделать.

Настройка openvpn на CentOS 8

Теперь при­сту­па­ем к настрой­ке. Созда­ем файл кон­фи­гу­ра­ции openvpn:

 

 

 

Подроб­ное опи­са­ние всех пара­мет­ров мож­но посмот­реть в офи­ци­аль­ной wiki.

Созда­ем необ­хо­ди­мые директории:

Созда­ем файл кон­фи­гу­ра­ции кли­ен­та в пап­ке, ука­зан­ной в пара­мет­ре client-config-dir :

Здесь client01 - имя сер­ти­фи­ка­та поль­зо­ва­те­ля. Пара­метр iroute озна­ча­ет, что за под­сеть 192.168.150.0/24 отве­ча­ет имен­но этот кли­ент. Если в openvpn не пере­дать эту настрой­ку, то сеть, нахо­дя­щу­ю­ся за кли­ен­том, будет не вид­но, при этом сам кли­ент будет видеть всю сеть, кото­рую обслу­жи­ва­ет сер­вер. Такой вари­ант под­хо­дит для под­клю­че­ния уда­лен­ных сотрудников.

Выбор устройства openvpn - TAP или TUN

Чуть подроб­нее оста­нов­люсь на этом момен­те. В моей кон­фи­гу­ра­ции я исполь­зую tun интер­фейс. В чем отли­чие tun от tap мож­но про­чи­тать на вики­пе­дии. Про­ком­мен­ти­рую сво­и­ми сло­ва­ми. Если вам нуж­но объ­еди­нить две раз­ные локаль­ные сети в одну услов­но общую, но с раз­ной адре­са­ци­ей, то вам нужен tun. То есть в нашем слу­чае мы объ­еди­ня­ем две сети 192.168.220.0/24 и 192.168.150.0/24 для вза­им­но­го сов­мест­но­го доступа.

Если же у вас сто­ит зада­ча объ­еди­нить 2 уда­лен­ные сети в еди­ное адрес­ное про­стран­ство, напри­мер сде­лать и в офи­се, и в фили­а­ле еди­ную сеть 192.168.220.0/24, то тогда бы мы исполь­зо­ва­ли tap интер­фейс и ука­зы­ва­ли бы на ком­пью­те­рах в обо­их сетях не пере­се­ка­ю­щи­е­ся адре­са из одной под­се­ти. То есть оба офи­са ока­жут­ся в одном широ­ко­ве­ща­тель­ном домене и смо­гут пере­да­вать дан­ные с помо­щью широ­ко­ве­ща­ния на каналь­ном уровне сете­вой моде­ли OSI. В таком состо­я­нии openvpn рабо­та­ет в режи­ме моста. По мне так удоб­нее пер­вый вари­ант. Я еще не стал­ки­вал­ся с зада­чей, где бы мне нужен был tap. Вер­нем­ся к настройке.

Запус­ка­ем сервер:

Если сер­вер не запу­стил­ся, а в логе ошибка:

Зна­чит вам нуж­но либо пра­виль­но настро­ить, либо отклю­чить SELinux. В дан­ном мате­ри­а­ле я не хочу касать­ся настрой­ки SELinux, поэто­му про­сто отклю­ча­ем его:

меня­ем значение

Что­бы изме­не­ния всту­пи­ли в силу, выполняет:

Про­бу­ем сно­ва запу­стить openvpn сервер:

Если опять види­те какие-то ошиб­ки, то про­ве­ряй­те лог фай­лы /var/log/openvpn/openvpn.log и /var/log/messages. Там почти навер­ня­ка будет ука­за­но, в чем про­бле­ма. Про­ве­ря­ем, запу­стил­ся сер­вер или нет:

Отлич­но, запу­стил­ся на ука­зан­ном порту.

Добав­ля­ем сер­вер openvpn в автозагрузку:

Теперь вни­ма­тель­но про­ве­рим кор­рект­ность всех настро­ек на сер­ве­ре. Сна­ча­ла посмот­рим инфор­ма­цию о сете­вых интерфейсах:

Обра­ща­ем вни­ма­ние на адре­са тун­не­ля vpn. Теперь про­ве­ря­ем ста­ти­че­ские маршруты:

Тут тоже все в поряд­ке. Траф­фик для под­се­ти фили­а­ла 192.168.150.0/24 будет марш­ру­ти­зи­ро­вать­ся в тон­нель. С настрой­кой сер­ве­ра закон­чи­ли, идем теперь на клиент.

Настройка firewall (iptables) для openvpn

Рас­смот­рю отдель­но вопрос настрой­ки iptables для рабо­ты openvpn. В целом, там нет ника­ких нюан­сов в самих пра­ви­лах. Нам необ­хо­ди­мо открыть вхо­дя­щий порт для под­клю­че­ния к сер­ве­ру, раз­ре­шить тран­зит­ный тра­фик и вклю­чить nat для openvpn интер­фей­сов. Про­бле­мы обыч­но быва­ют в реа­ли­за­ции настро­ек само­го firewall.

Если вы исполь­зу­е­те натив­ные iptables, то нуж­ны будут сле­ду­ю­щие пра­ви­ла, раз­ре­ша­ю­щие весь тра­фик в и из vpn туннелей.

Не забудь­те раз­ме­стить их выше пра­вил бло­ки­ров­ки, если тако­вые у вас име­ют­ся. Если вы исполь­зу­е­те firewalld для настрой­ки фаер­во­ла, то набор пра­вил для openvpn будет следующий:

Если нуж­но как-то сег­мен­ти­ро­вать доступ в vpn сети, то настра­и­вай­те более точеч­но с исполь­зо­ва­ни­ем кон­крет­ных адре­сов и под­се­тей. Тон­кая настрой­ка пра­вил iptables не тема дан­ной ста­тьи, поэто­му я не буду на этом подроб­но останавливаться.

Сам я обыч­но исполь­зую натив­ные iptables и управ­ляю ими с помо­щью скрип­та.  я исполь­зую сле­ду­ю­щий ито­го­вый набор пра­вил все­го сер­ве­ра для iptables.

 

 

 

 

Это мини­маль­ный набор пра­вил для шлю­за локаль­ной сети с openvpn на бор­ту. . Для сер­ве­ра кли­ен­та openvpn набор пра­вил будет точ­но такой же, толь­ко ip адре­са, под­се­ти и интер­фей­сы будут другие.

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

На centos-client не забы­ва­ем настро­ить или отклю­чить SELinux. Уста­нав­ли­ва­ем openvpn:

Созда­ем в дирек­то­рии /etc/openvpn/client/ файл кон­фи­гу­ра­ции client.conf:

 

 

 

Не забы­ва­ем ско­пи­ро­вать в /etc/openvpn/client/ сохра­нен­ные ранее клю­чи ca.crt, client01.crt, client01.key и tc.key.

Обра­щаю вни­ма­ние на пара­метр route в дан­ном кон­фи­ге. Его мож­но здесь не ука­зы­вать, сде­лав кон­фиг более уни­фи­ци­ро­ван­ным для мно­же­ства кли­ен­тов. Вме­сто это­го дан­ную настрой­ку мож­но пере­да­вать с сер­ве­ра openvpn, ука­зав в фай­ле настро­ек кли­ен­та пара­метр push route сле­ду­ю­щим образом:

Созда­ем ката­лог для логов:

Запус­ка­ем openvpn client:

Добав­ля­ем в автозагрузку:

Теперь смот­рим кар­ти­ну сете­вых настро­ек на клиенте:

Ну и марш­ру­ты гля­нем заодно:

Все в поряд­ке, под­клю­че­ние к vpn сер­ве­ру есть, марш­ру­ты про­пи­са­ны вер­но. Как вы види­те, тра­фик к уда­лен­ной сети 192.168.220.0.24 пой­дет через vpn тун­нель. Марш­рут для него openvpn под­нял авто­ма­ти­че­ски в соот­вет­свии со сво­и­ми настрой­ка­ми на кли­ен­те или сервере.

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

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

в файл /etc/sysctl.conf и при­ме­нить настройку:

Если у вас это­го не сде­ла­но, то тра­фик меж­ду интер­фей­са­ми ходить не будет.

Если ваш openvpn кли­ент не под­клю­ча­ет­ся, то в первую оче­редь про­ве­ряй­те настрой­ки firewall - вхо­дя­щие под­клю­че­ния к сер­ве­ру и исхо­дя­щие кли­ен­та. Обра­ти­те вни­ма­ние на номер пор­та и тип (TCP или UDP) если вы их меня­ли. У меня были зату­пы, когда никак не мог разо­брать­ся, поче­му нет соеди­не­ния. Ока­зы­ва­лось, что я менял порт c UDP на TCP, но по при­выч­ке на фаер­во­ле остав­лял UDP.

Теперь давай­те про­ве­рим, как бега­ют паке­ты в нашей vpn сети. Захо­дим на centos-client (192.168.150.1) и пин­гу­ем centos-server (192.168.220.1) и pc1 (192.168.220.10):

Захо­дим на pc2 (192.168.150.10) и пин­гу­ем centos-server и pc1:

Теперь в обрат­ную сто­ро­ну. Захо­дим на pc1 (192.168.220.10) и пин­гу­ем centos-client (192.168.150.1) и pc2 (192.168.150.10):

Как види­те, связь настро­е­на в обе сто­ро­ны. Если у вас что-то где-то не пин­гу­ет­ся, то смот­ри­те в первую оче­редь на нали­чие марш­ру­тов на самих сер­ве­рах с openvpn, а так же на настрой­ки firewall. Про­бле­мы могут быть толь­ко здесь. Ну и не забудь­те настро­ить windows firewall на самих вин­до­вых маши­нах. И помни­те про анти­ви­ру­сы на них. А то быва­ет кучу вре­ме­ни потра­тишь на поиск про­бле­мы, а ее на самом деле не было. Пин­ги не рабо­та­ли, пото­му что тупо запре­ще­ны на вин­до­вых машинах.

В завер­ше­ние темы объ­еди­не­ния уда­лен­ных офи­сов, про­ве­рим доступ к общим сете­вым ресур­сам. Рас­ша­рим пап­ку на PC1 и зай­дем на нее с PC2:

Все полу­чи­лось. Мы реаль­но объ­еди­ни­ли уда­лен­ные офи­сы в еди­ную связ­ную сеть с помо­щью openvpn сер­ве­ра. Даль­ше поверх vpn мож­но настра­и­вать рабо­ту осталь­ных сер­ви­сов. Напри­мер, объ­еди­нить 2 сер­ве­ра asterisk или кон­трол­ле­ры домена.

Настройка openvpn client в windows

Теперь рас­смот­рим вари­ант под­клю­че­ния к нашей логи­че­ской сети уда­лен­но­го сотруд­ни­ка с рабо­чей стан­ци­ей windows. Допу­стим, мы объ­еди­ни­ли наши офи­сы в еди­ную сеть, доступ рабо­та­ет в обе сто­ро­ны. Нам необ­хо­ди­мо, что­бы уда­лен­ный поль­зо­ва­тель смог под­клю­чить­ся либо к обо­им сетям, либо выбо­роч­но толь­ко к основ­но­му офи­су, либо толь­ко к филиалу.

Пер­вым делом нам надо выпу­стить для кли­ен­та сер­ти­фи­ка­ты и под­го­то­вить файл кон­фи­гу­ра­ции. Для того, что­бы упро­стить эти про­цес­сы, я под­го­то­вил неболь­шой скрипт, кото­рый выпус­ка­ет сер­ти­фи­кат по задан­но­му име­ни и сра­зу добав­ля­ет его в файл кон­фи­гу­ра­ции. Таким обра­зом нам надо будет пере­дать кли­ен­ту толь­ко конфиг.

Скрипт по гене­ра­ции сер­ти­фи­ка­та и кон­фи­га add_vpn_user.sh:

 

 

 

Скрипт дела­ет сле­ду­ю­щие операции:

  1. Про­ве­ря­ет, есть ли уже поль­зо­ва­тель с ука­зан­ным име­нем. Если есть, то завер­ша­ет работу.
  2. Выпус­ка­ет и под­пи­сы­ва­ет сер­ти­фи­кат поль­зо­ва­те­ля, давая воз­мож­ность выбрать, ука­зы­вать пароль для защи­ты при­ват­но­го клю­ча или нет.
  3. Созда­ет пустой файл для сер­вер­ных настро­ек поль­зо­ва­те­ля в ccd дирек­то­рии. Пара­мет­ры туда нуж­но будет доба­вить вруч­ную, если они нужны.
  4. Созда­ет гото­вый кон­фиг .ovpn, куда вклю­че­ны пара­мет­ры под­клю­че­ния и все необ­хо­ди­мые сер­ти­фи­ка­ты и ключи.

Даль­ше редак­ти­ру­ем файл кон­фи­гу­ра­ции на сер­ве­ре openvpn для это­го клиента:

Эти­ми пара­мет­ра­ми мы пере­да­ем кли­ен­ту марш­ру­ты к обо­им сетям офи­сов. Если нуж­но под­клю­чать кли­ен­та толь­ко к какой-то одной сети, то остав­ляй­те одну сеть, вто­рую уда­ляй­те. Обра­щаю вни­ма­ние на еще один факт. В кон­фи­гу­ра­ции openvpn сер­ве­ра у нас уже добав­лен марш­рут для 192.168.220.0, так что он в любом слу­чае будет добав­лен всем кли­ен­там, кото­рые будут под­клю­чать­ся к это­му серверу.

Если вы хоти­те, что­бы весь тра­фик кли­ен­та заво­ра­чи­вал­ся авто­ма­ти­че­ски в vpn тун­нель, по сути под­ме­няя его внеш­ний ip адрес адре­сом vpn сер­ве­ра, то добавь­те сле­ду­ю­щий пара­метр в кон­фиг клиента:

Теперь нуж­но ска­чать openvpn client под нашу вер­сию windows. Ссыл­ки для ска­чи­ва­ния я давал в самом нача­ле ста­тьи. Даль­ше выпол­ня­ем уста­нов­ку кли­ен­та. Обра­щаю вни­ма­ние, что для пол­ной уста­нов­ки пона­до­бят­ся пра­ва администратора:

При­сту­па­ем к настрой­ке кли­ен­та openvpn в windows. Для это­го нам пона­до­бит­ся файл кон­фи­гу­ра­ции, кото­рый мы созда­ли ранее. Забе­ри­те его любым под­хо­дя­щим спо­со­бом. Напри­мер, с помо­щью WinSCP.  Файл кон­фи­гу­ра­ции openvpn кли­ен­та будет выгля­деть при­мер­но так:

 

 

 

У нас нет зада­чи видеть сеть за кли­ен­том, да и он ско­рее все­го не будет являть­ся шлю­зом, поэто­му пара­мет­ра iroute для это­го кли­ен­та нет. Плюс убра­ны пути для логов - openvpn будет созда­вать их в пап­ке по умол­ча­нию - C:\users\username\OpenVPN\log. Туда же, рядом, кла­дем кон­фиг в пап­ку  C:\users\username\OpenVPN\config.

Для под­клю­че­ния openvpn кли­ен­та в windows запус­ка­ем OpenVPN GUI от име­ни адми­ни­стра­то­ра!

Это важ­но, без прав адми­ни­стра­то­ра openvpn client для пра­виль­ной марш­ру­ти­за­ции не смо­жет про­пи­сать необ­хо­ди­мые  марш­ру­ты автоматически.

Ищем мони­тор­чик в трее, нажи­ма­ем пра­вой кноп­кой мыши на него и выби­ра­ем "Под­клю­чить­ся".

Если в дирек­то­рии с кон­фи­га­ми несколь­ко фай­лов кон­фи­гу­ра­ций, то будет выбор, к како­му сер­ве­ру под­клю­чить­ся. Что­бы одно­вре­мен­но под­клю­чать­ся к раз­ным сер­ве­рам, необ­хо­ди­мо доба­вить несколь­ко TAP-Windows Adapter для openvpn.

Во вре­мя под­клю­че­ния мони­тор­чик будут гореть жел­тым цве­том. Как толь­ко под­клю­че­ние будет уста­нов­ле­но, цвет сме­нит­ся на зеле­ный. Это озна­ча­ет, что openvpn кли­ент успеш­но создал тун­нель и мож­но начи­нать рабо­тать по vpn.

Для того, что­бы openvpn client авто­ма­ти­че­ски под­клю­чал­ся при запус­ке, нуж­но создать для него ярлык с параметрами:

Для это­го выби­ра­ем ярлык на рабо­чем сто­ле OpenVPN GUI и нажи­ма­ем пра­вой кноп­кой мыши, откры­ва­ем "Свой­ства".  На вклад­ке "Ярлык" в поле "Объ­ект" в самом кон­це допи­сы­ва­ем ука­зан­ные пара­мет­ры. Вся стро­ка долж­на выгля­деть сле­ду­ю­щим образом:

Теперь при запус­ке ярлы­ка, openvpn будет авто­ма­ти­че­ски под­клю­чать­ся к сер­ве­ру и уста­нав­ли­вать vpn соединение.

Мы под­клю­чи­лись к кор­по­ра­тив­ной vpn сети, объ­еди­ня­ю­щей 2 офи­са. Давай­те попро­бу­ем полу­чить доступ к ком­пью­те­рам внут­ри этой сети.  Пин­гу­ем все маши­ны из нашей схемы:

192.168.220.1 192.168.220.10 192.168.150.1 192.168.150.10

Отлич­но, связь есть. Теперь попро­бу­ем зай­ти на сете­вой ресурс, кото­рый мы созда­ли ранее на ком­пью­те­ре сети фили­а­ла PC2:

Доступ есть, все в поряд­ке. Если у вас какие-то про­бле­мы с досту­пом к ресур­сам по vpn, в первую оче­редь смот­ри­те марш­ру­ты на кли­ен­те. Они долж­ны быть про­пи­са­ны до всех необ­хо­ди­мых под­се­тей филиалов.

Если запу­стить openvpn gui без прав адми­ни­стра­то­ра, то он не смо­жет доба­вить марш­ру­ты в систе­му. Соот­вет­ствен­но и досту­па нику­да не будет.

Автоматическое подключение Openvpn при загрузке системы

Если вы хоти­те, что­бы ваш openvpn кли­ент в Windows авто­ма­ти­че­ски под­клю­чал­ся к сер­ве­ру при стар­те систе­мы, необ­хо­ди­мо во вре­мя уста­нов­ки кли­ен­та доба­вить уста­нов­ку OpenVPN Service. По умол­ча­нию она отключена.

Когда кли­ент будет уста­нов­лен, убе­ди­тесь, что ука­зан­ная служ­ба име­ет авто­ма­ти­че­ский запуск.

Выше вы може­те наблю­дать еще одну служ­бу, кото­рая добав­ля­ет­ся авто­ма­ти­че­ски во вре­мя уста­нов­ки openvpn client в windows. Она отве­ча­ет за воз­мож­ность запус­кать с пра­ва­ми адми­ни­стра­то­ра openvpn-gui у поль­зо­ва­те­ля, кото­рый адми­ни­стра­то­ром не является.

Для того, что­бы после загруз­ки Winows OpenVPN под­клю­чи­лась авто­ма­ти­че­ски к сер­ве­ру, необ­хо­ди­мо доба­вить кон­фи­гу­ра­ци­он­ный файл в дирек­то­рию C:\Program Files\OpenVPN\config-auto.

Теперь про­ве­ряй­те. Пере­за­гру­зи­те ком­пью­тер и смот­ри­те настрой­ки сете­вых интер­фей­сов Openvpn TAP-Windows.

Под­клю­че­ние к openvpn сер­ве­ру выпол­не­но авто­ма­ти­че­ски после загруз­ки опе­ра­ци­он­ной систе­мы. Через GUI инфор­ма­ции об этом под­клю­че­нии вы не уви­ди­те. Если что-то пой­дет не так, то лог авто­ма­ти­че­ско­го под­клю­че­ния будет в дирек­то­рии C:\Program Files\OpenVPN\log. Если вам нуж­но будет под­клю­чить­ся к еще одно­му vpn сер­ве­ру, то вы може­те сде­лать это через openvpn-gui, если в систе­ме есть еще сете­вые интер­фей­сы openvpn.

Подключение по Openvpn в Android

Для того, что­бы настро­ить openvpn под­клю­че­ние в Android, я обыч­но исполь­зую при­ло­же­ние OpenVPN Connect. Каких-то про­блем с ним я не испы­ты­вал. К тому же настра­и­ва­ет­ся очень про­сто. В при­ло­же­ние доста­точ­но импор­ти­ро­вать кон­фи­гу­ра­ци­он­ный файл с инте­гри­ро­ван­ны­ми сер­ти­фи­ка­та­ми, типа того, что мы исполь­зо­ва­ли ранее. Его мож­но пере­дать через любой мес­сен­джер со сквоз­ным шиф­ро­ва­ни­ем, если пере­жи­ва­е­те за безопасность

При этом при­ло­же­ние нор­маль­но под­дер­жи­ва­ет и tls-crypt, и сжа­тие. Если у вас будут какие-то про­бле­мы с этой про­грам­мой на android, попро­буй­те еще OpenVPN for Android. Оно тоже нор­маль­но рабо­та­ет, но настрой­ки более замороченные.

Под­клю­чив­шись к локаль­ной сети в Android с помо­щью openvpn, мож­но поль­зо­вать­ся локаль­ны­ми ресур­са­ми. Напри­мер, я ино­гда под­клю­ча­юсь по RDP с помо­щью Microsoft Remote Desktop.

Отзыв сертификата клиента

В завер­ше­нии рас­ска­жу об еще одной важ­ной функ­ци­о­наль­но­сти openvpn сер­ве­ра - отзыв сер­ти­фи­ка­тов поль­зо­ва­те­лей. Дела­ет­ся это для того, что­бы запре­тить под­клю­че­ние кон­крет­но­го поль­зо­ва­те­ля к вашей vpn сети. Выпол­нить отзыв сер­ти­фи­ка­та мож­но с помо­щью easyrsa сле­ду­ю­щим образом:

 

 

После отзы­ва необ­хо­ди­мо сфор­ми­ро­вать файл со спис­ком ото­зван­ных сер­ти­фи­ка­тов. Это нуж­но будет делать каж­дый раз после отзыва.

Ско­пи­ру­ем теперь этот файл в дирек­то­рию с кон­фи­гом openvpn server.

Если ранее у вас там уже был файл ото­зван­ных сер­ти­фи­ка­тов, его надо будет либо уда­лить, либо пере­за­пи­сать. Для того, что­бы сер­вер про­ве­рял ото­зван­ные сер­ти­фи­ка­ты, в файл настро­ек server.conf нуж­но доба­вить соот­вет­ству­ю­щий параметр.

Для при­ме­не­ния настро­ек openvpn, сер­вер надо пере­за­пу­стить. Если же у вас там уже был этот пара­метр и вы толь­ко обно­ви­ли файл ото­зван­ных сер­ти­фи­ка­тов, пере­за­пус­кать сам сер­вер не обя­за­тель­но. Но имей­те вви­ду, что про­вер­ка сер­ти­фи­ка­та про­ис­хо­дит при под­клю­че­нии кли­ен­та. Таким обра­зом, если кли­ент уже под­клю­чен, а вы ото­зва­ли сер­ти­фи­кат, под­клю­че­ние не будет сбро­ше­но и кли­ент не будет отклю­чен до тех пор, пока он сам не завер­шит теку­щее соеди­не­ние, либо пока сер­вер openvpn не будет перезапущен.

Так же после отзы­ва не лиш­ним будет уда­лить файл настро­ек и кон­фи­гу­ра­ции кли­ен­та, а так же сохра­нен­ный ip адрес. Что­бы все это не делать вруч­ную, я напи­сал про­стень­кий скрипт revoke-user.sh, кото­рый вклю­ча­ет все необ­хо­ди­мые действия.

 

 

Ото­зван­ные сер­ти­фи­ка­ты в спис­ке index.txt поме­ча­ют­ся бук­вой R.

На этом все основ­ное по настрой­ке openvpn сервера.

Заключение

Теперь под­ве­дем ито­ги того, что мы сделали:

  1. В первую оче­редь настро­и­ли сер­вер openvpn на CentOS. Для это­го созда­ли инфра­струк­ту­ру для удо­сто­ве­ря­ю­ще­го цен­тра СА, с помо­щью кото­ро­го мы созда­ем сертификаты.
  2. Затем с помо­щью это­го цен­тра сфор­ми­ро­ва­ли сер­ти­фи­ка­ты для сер­ве­ра и кли­ен­та, в роли кото­рых высту­па­ет голов­ной офис ком­па­нии и его филиал.
  3. Потом мы настро­и­ли openvpn сер­вер в офи­се ком­па­нии и под­клю­чи­ли к нему в каче­стве кли­ен­та сер­вер фили­а­ла. Про­ве­ри­ли это соеди­не­ние, вза­им­ную доступ­ность узлов обо­их сетей.
  4. В завер­ше­нии сфор­ми­ро­ва­ли сер­ти­фи­кат для уда­лен­но­го сотруд­ни­ка и настро­и­ли ему под­клю­че­ние openvpn кли­ен­та в windows. Про­ве­ри­ли доступ­ность всех узлов обо­их сетей.

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

Если вам кажет­ся, что ско­рость тон­не­ля недо­ста­точ­ная и при этом нет жест­ких тре­бо­ва­ний по без­опас­но­сти, може­те сме­нить шифр на BF-CBC. С ним, навскид­ку, раза в 2-3 про­из­во­ди­тель­ность долж­на вырасти.