openvpn

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

Настрой­ка при­ват­но­го VPN сер­ве­ра на базе OpenVPN

Про­ве­ря­ем нали­чие устрой­ства tun

file /dev/net/tun
/dev/net/tun: character special

Уста­нов­ка EPEL-репозитория
yum install epel-release
Уста­нав­ли­ва­ем OpenVPN
yum -y install openvpn easy-rsa
Добав­ля­ем в автозапуск

centos6:

chkconfig openvpn on

centos7:
systemctl enable openvpn@service
Созда­ем файл конфигурации
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
Кон­фи­гу­ра­ция OpenVPN
nano /etc/openvpn/server.conf
Ука­зы­ва­ем на каком IP будет рабо­тать OpenVPN сер­вер (тут 192.168.1.100 – внеш­ний IP сервера):

local 192.168.1.100

Зада­ём OpenVPN сеть

server 10.0.0.0 255.255.255.0

Пере­да­ём пара­метр кли­ен­там, бла­го­да­ря кото­ро­му весь их тра­фик будет направ­лять­ся через OpenVPN

push "redirect-gateway def1 bypass-dhcp"

Теперь зада­дим DNS-сер­ве­ра для клиентов:

push "dhcp-option DNS 10.0.0.1"
push "dhcp-option DNS 8.8.8.8"
Изме­ним поль­зо­ва­те­ля, под кото­рым будет рабо­тать OpenVPN демон:
user nobody
group nobody
Меня­ем настрой­ки логирования:
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log

поз­во­ля­ет кли­ен­там openvpn под­клю­чать­ся друг к другу

client-to-client
сохра­ня­ем  /etc/openvpn/server.conf

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

Для нача­ла созда­дим дирек­то­рию для сертификатов:

mkdir -p /etc/openvpn/easy-rsa/keys
Ско­пи­ру­ем необ­хо­ди­мые файлы:

cp -r /usr/share/easy-rsa/3.0.3/* /etc/openvpn/easy-rsa/

Для удоб­ства отре­дак­ти­ру­ем пара­мет­ры, что­бы не вво­дить их при гене­ра­ции сер­ти­фи­ка­тов /etc/openvpn/easy-rsa/vars:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="NW"
export KEY_CITY="Moscow"
export KEY_ORG="OrgName"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
# X509 Subject Field
export KEY_NAME="EasyRSA"

опи­са­ние параметров:
[codesyntax lang="php"]

[/codesyntax]

Гене­ри­ру­ем сертификаты
Пере­хо­дим в создан­ную нами дирек­то­рию для сертификатов

cd /etc/openvpn/easy-rsa

Ини­ци­а­ли­зи­ру­ем PKI:

./easyrsa init-pki

Созда­ем кор­не­вой сертификат:

./easyrsa build-ca

* после вво­дим два­жды пароль и имя сервера.

Фор­ми­ру­ем ключ Диффи-Хелмана:

./easyrsa gen-dh

Пере­име­но­вы­ва­ем его:

mv /etc/openvpn/dh.pem /etc/openvpn/dh2048.pem

Созда­ем запрос на сер­ти­фи­кат для сер­ве­ра и после гене­ри­ру­ем сам сертификат:

./easyrsa gen-req vpn-server nopass

./easyrsa sign-req server vpn-server

* после вво­да коман­ды под­твер­жда­ем пра­виль­ность дан­ных, вве­дя yes и вво­дим пароль, кото­рый ука­зы­ва­ли при созда­нии кор­не­во­го сертификата.
* nopass мож­но упу­стить, если хотим повы­сить без­опас­ность с помо­щью паро­ля на сертификат.

Созда­дим файл HMAC, для допол­ни­тель­ной вери­фи­ка­ции кли­ен­та и сервера
/usr/sbin/openvpn --genkey --secret /etc/openvpn/ta.key
Файл ta.key дол­жен быть ско­пи­ро­ван и пере­дан клиенту

Акти­ви­ру­ем IP-фор­вар­динг в sysctl, отре­дак­ти­ро­вав файл sysctl.conf для редак­ти­ро­ва­ния:

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

Далее копи­ру­ем все файлы:
cp -rf /etc/openvpn/easy-rsa/pki/* /etc/openvpn/

Создание пользовательских ключей:

/etc/openvpn/easy-rsa/easyrsa gen-req user1 nopass

* nopass мож­но упу­стить, если хотим повы­сить без­опас­ность с помо­щью паро­ля на сертификат.

Необ­хо­ди­мо будет вве­сти пароль кото­рый зада­вал­ся при созда­нии при­ват­но­го ключа
/etc/openvpn/easy-rsa/easyrsa sign-req client user1

клю­чи кото­рые необ­хо­ди­мы клиенту:
/etc/openvpn/easy-rsa/pki/issued/user1.crt
/etc/openvpn/easy-rsa/pki/private/user1.key
/etc/openvpn/ta.key

 

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

Для того, что­бы ото­звать сер­ти­фи­кат user1:

/etc/openvpn/easy-rsa/easyrsa revoke user1

При этом будет создан новый файл crl.pem, кото­рый обя­за­тель­но надо ско­пи­ро­вать в дирек­то­рию /etc/openvpn, заме­нив ста­рый и пере­за­пу­стить сер­вер OpenVPN.

 

при стар­те, в слу­чае оши­бок, закомментируйте
explicit-exit-notify 1crl-verify crl.pem  в фай­ле /etc/openvpn/server.conf

service openvpn start

если centos 7 :

systemctl start openvpn@service

 

Настройка IPTABLES

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

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

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

/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/pki/issued/user1.crt
/etc/openvpn/easy-rsa/pki/private/user1.key

/etc/openvpn/ta.key

/etc/openvpn/ca.crt

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

На кли­ен­те создай­те файл client.ovpn.

В этот файл добавь­те сле­ду­ю­щие стро­ки. Обра­ти­те вни­ма­ние, мно­гие из этих строк отра­жа­ют стро­ки, кото­рые мы рас­ком­мен­ти­ро­ва­ли или доба­ви­ли в файл server.conf.

client
dev tun
proto udp
remote IP_SERVER 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert user.crt
key user.key
tls-auth ta.key 1
topology subnet
tls-client
pull
keysize 256
cipher AES-256-CBC
tun-mtu 1500

 

server.conf име­ет сле­ду­ю­щий вид:
cat /etc/openvpn/server.conf | grep -vE "^#|^;|^$"
local IP_SERVER
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
client-to-client
duplicate-cn
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
explicit-exit-notify 1
crl-verify crl.pem

При добав­ле­нии этих строк обра­ти­те вни­ма­ние на следующее:

  • В пер­вой стро­ке вам нуж­но будет ука­зать имя, кото­рое вы дали кли­ен­ту в клю­че и сер­ти­фи­ка­те; в нашем слу­чае это client.
  • Так­же необ­хо­ди­мо обно­вить IP-адрес; порт 1194 мож­но оставить.
  • Убе­ди­тесь, что пути к вашим клю­чам и фай­лам сер­ти­фи­ка­тов ука­за­ны верно.

 

 

Этот файл теперь мож­но исполь­зо­вать на кли­ен­тах OpenVPN для под­клю­че­ния к сер­ве­ру. Ниже при­ве­де­ны инструк­ции по под­клю­че­нию клиента

Windows

В Windows вам пона­до­бят­ся офи­ци­аль­ные дво­ич­ные фай­лы OpenVPN Community Edition, кото­рые постав­ля­ют­ся с гра­фи­че­ским интер­фей­сом. Поме­сти­те файл кон­фи­гу­ра­ции .ovpn в соот­вет­ству­ю­щий ката­лог, C:\Program Files\OpenVPN\config, и нажми­те Connect в интер­фей­се. OpenVPN GUI для Windows нуж­но выпол­нять с пра­ва­ми администратора.

 

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

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

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

Выбор подсети

По умол­ча­нию в настрой­ках OpenVPN исполь­зу­ет­ся под­сеть 10.8.0.0/24, кото­рая может быть изме­не­на на любую из част­ных подсетей.

  • 10.0.0.0
  • 172.16.0.0
  • 192.168.0.0

Под­се­ти могут исполь­зо­вать­ся с мас­ка­ми /8, /16, /24 или 255.0.0.0, 255.255.0.0, 255.255.255.0, соответственно.

--- ---------- -------

опи­са­ние:

  • ca.crt – глав­ный CA сер­ти­фи­кат, этот файл нужен всем кли­ен­там и всем openvpn-сер­ве­рам. С помо­щью него дого­ва­ри­ва­ю­щи­е­ся сто­ро­ны (сер­вер и кли­ент) про­ве­ря­ют под­пи­си полу­чен­ных пуб­лич­ных клю­чей на пред­мет при­над­леж­но­сти нашей организации;
  • ca.key – глав­ный CA ключ. Этот файл нужен толь­ко цен­тру сер­ти­фи­ка­ции, так как им под­пи­сы­ва­ют­ся все пуб­лич­ные клю­чи-сер­ти­фи­ка­ты орга­ни­за­ции. Он не учав­ству­ет в обес­пе­че­нии без­опас­но­го кана­ла. Он нужен эпи­зо­ди­че­ски толь­ко для выпус­ка клю­чей (шиб­ко СЕКРЕТНЫЙ файл). Хочу заме­тить, что откры­тое хра­не­ние это­го фай­ла на openvpn-сер­ве­ре поз­во­лит веро­ят­но­му зло­умыш­лен­ни­ку украсть этот файл и выпу­стить про­из­воль­ное коли­че­ство клю­чей, с помо­щью кото­рых мож­но будет бес­пре­пят­ствен­но под­клю­чать­ся к нашим openvpn-серверам.

Одно­ра­зо­во дела­ем файл для допол­ни­тель­ной без­опас­но­сти openvpn-канала:

  • ta.key – TLS-ключ, кото­рый нужен и openvpn-кли­ен­там и openvpn-сер­ве­рам для пущей без­опас­но­сти. Мож­но и без него, но он помо­га­ет бло­ки­ро­вать DoS ата­ки и UDP флу­динг на откры­тый порт сер­ве­ра.

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

  • server.crt – сер­ти­фи­кат сер­ве­ра, нужен толь­ко серверу;
  • server.key – ключ сер­ве­ра, нужен толь­ко сер­ве­ру (СЕКРЕТНЫЙ файл);
  • dh1024.pem – ключ име­ни Диф­фи и Хель­ма­на. Этот файл нужен толь­ко сер­ве­ру. Навер­ное, исполь­зу­ет­ся на эта­пе пред­ва­ри­тель­но­го обме­на откры­ты­ми клю­ча­ми (сер­ти­фи­ка­та­ми).

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

  • client.crt – сер­ти­фи­кат кли­ен­та. Этот файл нужен кли­ен­ту для уста­нов­ки соеди­не­ния с openvpn-сервером;
  • client.key – ключ кли­ен­та, нужен толь­ко кли­ен­ту (СЕКРЕТНЫЙ файл).
В /etc/openvpn/easy-rsa/keys лежат сер­ти­фи­кат цен­тра сер­ти­фи­ка­ции ca.crt и при­ват­ный ключ цен­тра сер­ти­фи­ка­ции ca.key.
Сер­ти­фи­кат цен­тра сер­ти­фи­ка­ции нахо­дит­ся как на сто­роне сер­ве­ра, так и на сто­роне кли­ен­та и учав­ству­ет в созда­нии туннеля.
При­ват­ный ключ цен­тра сер­ти­фи­ка­ции чрез­вы­чай­но сек­рет­ный и не дол­жен попасть в чужие руки. В созда­нии тун­не­ля он не исполь­зу­ет­ся. Если я пра­виль­но пони­маю, то при­ват­ным клю­чом цен­тра сер­ти­фи­ка­ции под­пи­сы­ва­ют­ся клю­чи новых кли­ен­тов, поэто­му файл ca.key жела­тель­но изы­мать из этой пап­ки после окон­ча­ния гене­ра­ции клю­чей, зати­рая уби­тую копию shred'ом. Или же пап­ку easy-rsa раз­ме­щать в сек­рет­ном крип­то­хра­ни­ли­ще, где и про­из­во­дить по необ­хо­ди­мо­сти эпи­зо­ди­че­ские рабо­ты по выпус­ку ключей.
  • KEY_CN: вве­ди­те домен или под­до­мен, кото­рый раз­ре­ша­ет­ся на ваш сервер.
  • KEY_NAME: вве­ди­те сюда server. Если вы вве­де­те дру­гое имя, вам при­дет­ся обнов­лять фай­лы кон­фи­гу­ра­ции, кото­рые ссы­ла­ют­ся на server.key и server.crt.
  • KEY_COUNTRY: вве­ди­те двух­бук­вен­ную аббре­ви­а­ту­ру стра­ны проживания.
  • KEY_PROVINCE: штат/область/регион.
  • KEY_CITY: город.
  • KEY_ORG: назва­ние вашей организации.
  • KEY_EMAIL: элек­трон­ная поч­та, кото­рая будет при­вя­за­на к сертификату.
  • KEY_OU: Organizational Unit – назва­ние коман­ды и отде­ла, для кото­ро­го пред­на­зна­чен сертификат.