Конфигуриране на OpenVPN сървър с два различни изходящи IP адреса

OpenVPN е най-широко използваният VPN софтуер. Предимствата му пред другите алтернативи са много, една от които ще разгледаме в тази статия.

Методът за работа с него, е че трябва клиента (потребителя, който ще се връзва към сървъра) да притежава генериран конфигурационен файл със собствени ключове, както и потребителско име и парола на самия OpenVPN сървър. Има изключения, в които клиента може да осъществи връзка само с конфигурационен файл и ключове, но тук ще използваме добрите практики и ще добавим и потребител с парола, като допълнително ниво security при оторизация към сървъра.

OpenVPN е cross platform и може да се инсталира и използва както в Linux, така и в Windows и MacOS. Единственият недостатък, е че е нужно да се използва 3rd party софтуер от потребителската страна, за осъществяване на връзката. Но това не е проблем, защото дори самите OpenVPN предлагат добри решения и за това.

1.Инсталиране и конфигуриране на OpenVPN

Тази статия не цели да обясни как се инсталира OpenVPN, а по скоро как да го конфигурирате, с цел да използвате повече от един изходящ IP адрес. Инсталацията и конфигурацията на OpenVPN представлява няколко стъпки, които ние тук ще пропуснем и ще използваме готов скрипт. След което нанесете нужните промени в конфигурационните файлове. Скриптът е интерактивен и генерира конфигурационни файлове както за сървъра, така и за клиента. Използват се директиви, които са в добрите практики, така че дори и да имате вече ваш собствен OpenVPN сървър, можете да го промените според стъпките в тази статия, за да постигнете желаният резултат. Но все пак, нека обходим скрипта и опциите, които предлага, за да инсталирате собствен OpenVPN сървър от нулата.

Сървърът, на който ще се извърши конфигурацията има два IP адреса. Единият е разположен на eth0 а другият на eth0:1 . Интерфейсите може да варират между различните дистрибуции, но ние ще се придържаме към тези именувания.

IP адресите в този пример ще бъдат представени като 1.1.1.1 и 2.2.2.2. Вие използвайте тези, които са на вашият сървър. 1.1.1.1 би бил адресът, който е на eth0, а 2.2.2.2 – този , който е на eth0:1. Нека да пристъпим към същественото.

Влезте в сървъра през SSH:

 ssh root@yourserver 

След което свалете желаният от вас скрипт:

 wget https://raw.githubusercontent.com/Angristan/OpenVPN-install/master/openvpn-install.sh && chmod +x  openvpn-install.sh 

Изпълнете скрипта:

 ./openvpn-install.sh 
 Welcome to the secure OpenVPN installer (github.com/Angristan/OpenVPN-install)

I need to ask you a few questions before starting the setup
You can leave the default options and just press enter if you are ok with them

I need to know the IPv4 address of the network interface you want OpenVPN listening to.
If your server is running behind a NAT, (e.g. LowEndSpirit, Scaleway) leave the IP address as it is. (local/private IP)
Otherwise, it should be your public IPv4 address.
IP address: 1.1.1.1

Първата стъпка ви пита за това кой е вашият първи публичен IP адрес. В случая използвайте IP адреса 1.1.1.1:

What port do you want for OpenVPN?
Port: 1194

Използвайте този порт, който е стандартният за OpenVPN:

What protocol do you want for OpenVPN?
Unless UDP is blocked, you should not use TCP (unnecessarily slower)
Protocol [UDP/TCP]: UDP

Използвайте този протокол:

What DNS do you want to use with the VPN?
   1) Current system resolvers (from /etc/resolv.conf)
   2) Quad9 (Anycast: worldwide)
   3) FDN (France)
   4) DNS.WATCH (Germany)
   5) OpenDNS (Anycast: worldwide)
   6) Google (Anycast: worldwide)
   7) Yandex Basic (Russia)
   8) AdGuard DNS (Russia)
DNS [1-8]: 1

Изберете 1, за да използвате системните resolver-и. Ако има причина да не искате да използвате тях, може да изберете нещо друго:

Choose which cipher you want to use for the data channel:
   1) AES-128-CBC (fastest and sufficiently secure for everyone, recommended)
   2) AES-192-CBC
   3) AES-256-CBC
Alternatives to AES, use them only if you know what you're doing.
They are relatively slower but as secure as AES.
   4) CAMELLIA-128-CBC
   5) CAMELLIA-192-CBC
   6) CAMELLIA-256-CBC
   7) SEED-CBC
Cipher [1-7]: 1

Изберете 1, защото това е достатъчно като ниво на криптация и сигурност:

Choose what size of Diffie-Hellman key you want to use:
   1) 2048 bits (fastest)
   2) 3072 bits (recommended, best compromise)
   3) 4096 bits (most secure)
DH key size [1-3]: 1

В този случай, можете да изберете какъвто размер на ключа искате. Ние ще изберем 1, защото ще се генерира най-бързо. 2048 e стандартна дължина на ключа, така че използването ѝ не е проблем:

Choose what size of RSA key you want to use:
   1) 2048 bits (fastest)
   2) 3072 bits (recommended, best compromise)
   3) 4096 bits (most secure)
RSA key size [1-3]: 1

Изборът ви тук е на принципа на миналия. Отново изберете 1:

Finally, tell me a name for the client certificate and configuration
Please, use one word only, no special characters
Client name: delta

Тук можете да въведете каквото искате като име на клиент. Това е нужно за генериране на сертификатите и ключовете за OpenVPN. Ние използваме delta в тази статия:

Okay, that was all I needed. We are ready to setup your OpenVPN server now
Press any key to continue…

Готови сте да продължите с инсталацията. След като подадохте всички нужни аргументи на скрипта, той ще инсталира и конфигурира OpenVPN сървъра ви, както и ще ви генерира клиентски конфигурационен файл, който ще използвате после за връзка към сървъра. В следващите няколко минути ще се инсталират пакети и ще се генерират ключове.

2.Конфигурационни файлове и настройки на сървъра

След като приключи нашата инсталация на OpenVPN сървъра, ще имате цяла нова директория в /etc с име openvpn , както и клиентски конфигурационен файл в /root с име delta.ovpn. Следващите стъпки представляват промяна на сървърната конфигурация, както и клиентската, и да се добавят няколко реда в iptables, с които ще се случи цялата магия.

Отворете /etc/openvpn/server.conf

 vim /etc/openvpn/server.conf 

Вътре добавете следните директиви:

plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so system-auth

client-to-client

fast-io

local 1.1.1.1

И променете dev tun на dev tun0

Финалният ви server.conf изглежда така

port 1194
proto udp
dev tun0
client-to-client
fast-io
local 1.1.1.1
user nobody
group nobody
persist-key
persist-tun
keepalive 10 120
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so system-auth
push "dhcp-option DNS 79.98.109.15"
push "redirect-gateway def1 bypass-dhcp" 
crl-verify crl.pem
ca ca.crt
cert server_MzmX7pjrZpZcGCOj.crt
key server_MzmX7pjrZpZcGCOj.key
tls-auth tls-auth.key 0
dh dh.pem
auth SHA256
cipher AES-128-CBC
tls-server
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
status openvpn.log
verb 3

Какво пряват добавените директиви?

dev tun0 – оказвате кой device на сървъра ще отговаря за осъществяването на тунела. Изрично е казан tun0, защото за другият IP адрес и server.conf ще се използва tun1.

client-to-client – тази директива ви позволява VPN сървъра да изпраща client-to-client пакети, без да минава през самия kernel. Това се използва за комуникация между повече от един клиенти на VPN сървъра един с друг.

fast-io – тази директива не е задължителна, но я добавяме, защото може да подобри връзката ви от гледна точка на I/O при писане към UDP сокети или TUN device-и. Липсата ѝ може да забави работата на сървъра, ако самият сокет или device не могат да върнат отговор при операция на писане.

local 1.1.1.1 – с тази директива описвате кой е IP адреса, обслужващ този конфигурационен файл. Напомняме, че тук 1.1.1.1 е първият публичен IP адрес.

plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so system-auth – това е директивата, с която казвате на OpenVPN сървъра, че ще се използва PAM оторизиране. Това означава, че VPN сървърът ще търси потребители, намиращи се на самия линукс (/etc/passwd).

След като сте редактирали първият ви server.conf, е нужно да го запазите. След като го запазите, сте готови да процедирате с втория.

 cp /etc/openvpn/server.conf /etc/openvpn/server2.conf 

Отваряте server2.conf за редакция и променяте следните директиви:

 vim /etc/openvpn/server2.conf 

port 1195

dev tun1

local 2.2.2.2

server 10.8.1.0 255.255.255.0

 

Финалният ви server2.conf изглежда така:

port 1195
proto udp
dev tun1
client-to-client
fast-io
local 2.2.2.2
user nobody
group nobody
persist-key
persist-tun
keepalive 10 120
topology subnet
server 10.8.1.0 255.255.255.0
ifconfig-pool-persist ipp.txt
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so system-auth
push "dhcp-option DNS 79.98.109.15"
push "redirect-gateway def1 bypass-dhcp" 
crl-verify crl.pem
ca ca.crt
cert server_MzmX7pjrZpZcGCOj.crt
key server_MzmX7pjrZpZcGCOj.key
tls-auth tls-auth.key 0
dh dh.pem
auth SHA256
cipher AES-128-CBC
tls-server
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
status openvpn.log
verb 3

Какво правят директивите, които променихте?

port 1195 – с тази директива се указва друг порт за този config. Първият ви config работи на порт 1194, този, обслужващ втория ви реален IP адрес, ще работи на порт 1195.

dev tun1 – както споменяхме по-рано, указва кой device на сървъра ще отговаря за осъществяването на тунела. В случая този път е tun1, защото първият config използва tun0

local 2.2.2.2 – с тази директива се описва кой е IP адреса, обслужващ този конфигурационен файл. В случая той е 2.2.2.2, защото това е вторият публичен IP адрес.

server 10.8.1.0 255.255.255.0 – във втория конфигурационен файл нанасяте промяна в това коя мрежа ще бъде използвана и push-вана към клиентите, защото тя трябва да е различна от тази в първия конфигурационен файл. В първият тя е 10.8.0.0 , във втория е 10.8.1.0. Тази промяна ще ви улесни при писането на iptables правила по-късно.

3.Конфигурационни файлове и настройки на клиента

Както споменахме, за да използвате OpenVPN, трябва да имате както сървърна конфигурация, така и клиентска. Реално тя представлява един файл, който съдържа правила за връзка, както и ключове за сигурност при връзката. Напомняме, че при нас клиентският конфигурационен файл се намира в /root и е с име delta.ovpn. Нужно е да се промени и дублира, както направихте с вашите сървърни конфигурационни файлове. Принципът ще бъде подобен – първият config ще отговаря за връзка с първият IP адрес (1.1.1.1), а втория config ще отговаря за връзка с втория IP адрес (2.2.2.2).

 

Ние отваряме delta.ovpn за редактиране:

 vim /root/delta.ovpn 

Добавя се следната директива преди <ca>

auth-user-pass

По този начин конфигурацията изглежда така:


client
proto udp
remote 1.1.1.1 1194
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verify-x509-name server_MzmX7pjrZpZcGCOj name
auth SHA256
auth-nocache
cipher AES-128-CBC
tls-client
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
setenv opt block-outside-dns
verb 3
auth-user-pass
<ca>
****
</ca>
<cert>
****
</cert>
<key>
****
</key>
key-direction 1
<tls-auth>
#
# 2048 bit OpenVPN static key
#
****
</tls-auth>

Каква беше ролята на добавената директива?

auth-user-pass –  оказвате на клиента, че сървъра търси оторизация с потребителско име и парола.

След като сте готови с първият конфигурационен файл, копирайте го и създайте втори за втория ви IP адрес, след което го отворете за редакция:

 cp /root/delta.ovpn /root/delta2.ovpn && vim /root/delta2.ovpn 

Там се променя единствено remote 1.1.1.1 1194 , който трябва да стане remote 2.2.2.2 1195. С него се описва вторият IP адрес и порт, към който ще се вържете. Запазете delta2.ovpn

След като вече имате два сървърни конфигурационни файла и два клиентски, сте почти готови да тествате вашия сетъп. Копирайте клиентските конфигурации на вашия компютър (delta.ovpn и delta2.ovpn) или мястото, от което ще се връзвате към OpenVPN сървъра. След което създайте потребител на сървъра, с който ще се оторизирате. Тук той се казва delta

 useradd delta 
 passwd delta 

4.iptables и финални настройки

След като сте му определили парола, остана само да добавите няколко реда в iptables, с които ще може да имате интернет след като сте се вързали към VPN-а, както и да излизате към света с някое от двете ви IP-та.

 
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0:1 -j MASQUERADE

С тези два реда оказвате на сървъра, че искате клиентите ви да имат интернет от тези две мрежи. Напомняме, че тези мрежи се push-ват на самите клиенти. Едната е от първия ви конфигурационен файл (за 1.1.1.1), а другата е от втория (за 2.2.2.2).

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 1.1.1.1
iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -j SNAT --to-source 2.2.2.2

С тези два реда оказвате на сървъра, че искате клиентите, използвайки първата мрежа (от файла server.conf), да излизат към света с IP адреса 1.1.1.1. Същото важи и за втория, само че става въпрос за втората мрежа (от файла server2.conf) и за втория IP адрес, 2.2.2.2.

След като всичко е изпълнено, сте готови да тествате. Използвайте OpenVPN софтуера на вашата машина и операционна система, за да се свържете към сървъра. Добавете двата конфигурационни файла. След като са добавени, свържете се използвайки първият. Въведете потребител delta и паролата, която сте въвели по рано. След успешно свързване към сървъра можете да посетите някой сайт, като https://whatismyipaddress.com/ , за да видите с кой IP адрес излизате към света. В случая с първият config, това би бил 1.1.1.1 (или реално вашият първи IP адрес на сървъра, който сте въвеждали по времето на конфигурацията). След което се разкачете от VPN-a и опитайте същото действие с втория config. Потребителят и паролата отново са същите. При успешна връзка, посетете отново https://whatismyipaddress.com/ и refresh-нете. Би трябвало да виждате вторият IP адрес, 2.2.2.2 (или реално вашият втори IP адрес на сървъра, който сте въвеждали по време на кофигурацията).

Leave a Reply

Your email address will not be published. Required fields are marked *