OpenVPN: установка сервера на Debian

Автор: | 21/05/2017

Аналогичный пост на эту тему – CentOS: установка OpenVPN сервера. Особой разницы нет, только тут OpenVPN сервер будет устанавливаться на Debian 8.

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

Интересно – что получится по трафику, т.к. сервер (t2.nano) расположен в Ирландии, AWS.

Впрочем, сам RTFM кушает трафика более чем прилично, например Апрель:

Но по деньгам пока нормально – попробую VPN в Амазоне.

Установка выполняется на:

[simterm]

# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.7 (jessie)
Release:        8.7
Codename:       jessie

[/simterm]

Установка OpenVPN

Обновляем установленные пакеты:

[simterm]

# apt-get update && apt-get upgrade

[/simterm]

Устанавливаем OpenVPN:

[simterm]

# apt install openvpn

[/simterm]

Копируем конфиг из готовых примеров:

[simterm]# gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf[/simterm]

Редактируем созданный /etc/openvpn/server.conf, и меняем параметры:

...
# keys files location
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/openvpn.crt
key /etc/openvpn/easy-rsa/keys/openvpn.key
...
# 2048 instaead of 1024
dh dh2048.pem
...
# redirct all trafic from client 
push "redirect-gateway def1 bypass-dhcp"
...
# google and opendns
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 208.67.220.220"
...
# root otherwise
user nobody
group nogroup
...

Настройка роутинга

Включаем поддержку пересылки пакетов ядром:

[simterm]# echo 1 > /proc/sys/net/ipv4/ip_forward[/simterm]

Правим /etc/sysctl.conf и снимаем комментарий со строки:

...
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
...

Настраиваем netfilter. Всегда пользовался IPTABLES для этого, в этот раз попробовал UFW.

Казуальщина пришла не только в мир Lineage 🙂

Разрешаем SSH (доступ по IP сделан в security group для EC2):

[simterm]

# ufw allow ssh
Rules updated
Rules updated (v6)

[/simterm]

OpenVPN у нас будет работать по UDP, разрешаем порт 1194 ( доступ к нему тоже ограничен в security group):

[simterm]

# ufw allow 1194/udp
Rules updated
Rules updated (v6)

[/simterm]

Включаем роутинг в файле /etc/default/ufw, устанавливаем ACCEPT вместо DROP:

...
# Set the default forward policy to ACCEPT, DROP or REJECT.  Please note that
# if you change this you will most likely want to adjust your rules
DEFAULT_FORWARD_POLICY="ACCEPT"
...

Редактируем /etc/ufw/before.rules, добавляем правила для нашего VPN:

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

Активируем ufw:

[simterm]

# ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

[/simterm]

Проверяем правила:

[simterm]

# ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
1194/udp                   ALLOW       Anywhere
22                         ALLOW       Anywhere (v6)
1194/udp                   ALLOW       Anywhere (v6)

[/simterm]

SSL

Переходим к созданию ключей.

Копируем скрипты:

[simterm]# cp -r /usr/share/easy-rsa/ /etc/openvpn[/simterm]

Создаём каталог для ключей сервера:

[simterm]# mkdir /etc/openvpn/easy-rsa/keys[/simterm]

Правим /etc/openvpn/easy-rsa/vars. При желании – можно указать тут параметры по умолчанию для создаваемых ключей – страницу, организацию и т.д.

Указываем имя ключа:

...
# X509 Subject Field
export KEY_NAME="openvpn"
...

Генерируем ключ Diffie-Hellman с размером 2048 байт:

[simterm]

# openssl dhparam -out /etc/openvpn/dh2048.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time

[/simterm]

Готовим ключи.

Переходим в каталог openvpn, применяем переменные из vars, который редактировали выше:

[simterm]

# . ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

[/simterm]

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

[simterm]

# ./build-key-server --initca
Generating a 2048 bit RSA private key
...
Country Name (2 letter code) [US]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [SanFrancisco]:
Organization Name (eg, company) [Fort-Funston]:
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:
Name [EasyRSA]:
Email Address [[email protected]]:

[/simterm]

Проверяем:

[simterm]

# ls -l keys/
total 12
-rw-r--r-- 1 root root 1818 May 21 12:30 ca.crt
-rw------- 1 root root 1704 May 21 12:30 ca.key
-rw-r--r-- 1 root root    0 May 21 12:30 index.txt
-rw-r--r-- 1 root root    3 May 21 12:30 serial

[/simterm]

Создаём ключ нашего OpenVPN сервера:

[simterm]

# ./build-key-server openvpn
Generating a 2048 bit RSA private key
...
...
countryName           :PRINTABLE:'US'
stateOrProvinceName   :PRINTABLE:'CA'
localityName          :PRINTABLE:'SanFrancisco'
organizationName      :PRINTABLE:'Fort-Funston'
organizationalUnitName:PRINTABLE:'MyOrganizationalUnit'
commonName            :PRINTABLE:'openvpn'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'[email protected]'
Certificate is to be certified until May 19 12:31:50 2027 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

[/simterm]

Проверяем:

[simterm]

# ls -l keys/
total 48
-rw-r--r-- 1 root root 5730 May 21 12:31 01.pem
-rw-r--r-- 1 root root 1818 May 21 12:30 ca.crt
-rw------- 1 root root 1704 May 21 12:30 ca.key
-rw-r--r-- 1 root root  150 May 21 12:31 index.txt
-rw-r--r-- 1 root root   21 May 21 12:31 index.txt.attr
-rw-r--r-- 1 root root    0 May 21 12:30 index.txt.old
-rw-r--r-- 1 root root 5730 May 21 12:31 openvpn.crt
-rw-r--r-- 1 root root 1102 May 21 12:31 openvpn.csr
-rw------- 1 root root 1708 May 21 12:31 openvpn.key
-rw-r--r-- 1 root root    3 May 21 12:31 serial
-rw-r--r-- 1 root root    3 May 21 12:30 serial.old

[/simterm]

Копируем ключи сервера в его каталог настроек:

[simterm]

# cp -v keys/openvpn.* /etc/openvpn/
‘keys/openvpn.crt’ -> ‘/etc/openvpn/openvpn.crt’
‘keys/openvpn.csr’ -> ‘/etc/openvpn/openvpn.csr’
‘keys/openvpn.key’ -> ‘/etc/openvpn/openvpn.key’

[/simterm]

Проверяем:

[simterm]

# ls -l /etc/openvpn/
total 40
-rw-r--r-- 1 root root   424 May 21 12:24 dh2048.pem
drwxr-xr-x 3 root root  4096 May 21 12:30 easy-rsa
-rw-r--r-- 1 root root  5730 May 21 12:33 openvpn.crt
-rw-r--r-- 1 root root  1102 May 21 12:33 openvpn.csr
-rw------- 1 root root  1708 May 21 12:33 openvpn.key
-rw-r--r-- 1 root root 10325 May 21 11:55 server.conf
-rwxr-xr-x 1 root root  1301 Nov 12  2015 update-resolv-conf

[/simterm]

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

[simterm]# systemctl start openvpn.service[/simterm]

Добавляем в автозапуск:

[simterm]# systemctl enable openvpn.service
Synchronizing state for openvpn.service with sysvinit using update-rc.d…
Executing /usr/sbin/update-rc.d openvpn defaults
Executing /usr/sbin/update-rc.d openvpn enable[/simterm]

Проверяем сервис:

[simterm]

# systemctl status openvpn.service
● openvpn.service - OpenVPN service
   Loaded: loaded (/lib/systemd/system/openvpn.service; enabled)
   Active: active (exited) since Sun 2017-05-21 12:34:28 UTC; 1min 9s ago
  Process: 2343 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 2343 (code=exited, status=0/SUCCESS)

May 21 12:34:28 ip-172-31-42-36 systemd[1]: Starting OpenVPN service...
May 21 12:34:28 ip-172-31-42-36 systemd[1]: Started OpenVPN service.

[/simterm]

Сервер:

[simterm]

# systemctl status [email protected][email protected] - OpenVPN connection to server
   Loaded: loaded (/lib/systemd/system/[email protected]; disabled)
   Active: active (running) since Sun 2017-05-21 12:34:28 UTC; 1min 45s ago
  Process: 2342 ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf (code=exited, status=0/SUCCESS)
 Main PID: 2356 (openvpn)
   CGroup: /system.slice/system-openvpn.slice/[email protected]
           └─2356 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --config /etc/openvpn/server.conf

May 21 12:34:28 ip-172-31-42-36 ovpn-server[2342]: /sbin/ip route add 10.8.0.0/24 via 10.8.0.2
May 21 12:34:28 ip-172-31-42-36 systemd[1]: Started OpenVPN connection to server.
May 21 12:34:28 ip-172-31-42-36 ovpn-server[2356]: GID set to nogroup
May 21 12:34:28 ip-172-31-42-36 ovpn-server[2356]: UID set to nobody
May 21 12:34:28 ip-172-31-42-36 ovpn-server[2356]: UDPv4 link local (bound): [undef]
May 21 12:34:28 ip-172-31-42-36 ovpn-server[2356]: UDPv4 link remote: [undef]
May 21 12:34:28 ip-172-31-42-36 ovpn-server[2356]: MULTI: multi_init called, r=256 v=256
May 21 12:34:28 ip-172-31-42-36 ovpn-server[2356]: IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0
May 21 12:34:28 ip-172-31-42-36 ovpn-server[2356]: IFCONFIG POOL LIST
May 21 12:34:28 ip-172-31-42-36 ovpn-server[2356]: Initialization Sequence Completed

[/simterm]

Собственно – на этом установка и настройка OpenVPN сервера завершена.

Клиент на Arch Linux опишу отдельно, подключаемся:

[simterm]

# openvpn /etc/openvpn/client/setevoy_home.conf
Sun May 21 15:52:44 2017 OpenVPN 2.4.2 x86_64-unknown-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on May 11 2017
Sun May 21 15:52:44 2017 library versions: OpenSSL 1.1.0e  16 Feb 2017, LZO 2.10
Sun May 21 15:52:44 2017 WARNING: --ns-cert-type is DEPRECATED.  Use --remote-cert-tls instead.
Sun May 21 15:52:44 2017 TCP/UDP: Preserving recently used remote address: [AF_INET]34.***.***.137:1194
...
Sun May 21 15:52:45 2017 /usr/bin/ip route add 0.0.0.0/1 via 10.8.0.5
Sun May 21 15:52:45 2017 /usr/bin/ip route add 128.0.0.0/1 via 10.8.0.5
Sun May 21 15:52:45 2017 /usr/bin/ip route add 10.8.0.1/32 via 10.8.0.5
Sun May 21 15:52:45 2017 GID set to nogroup
Sun May 21 15:52:45 2017 UID set to nobody
Sun May 21 15:52:45 2017 Initialization Sequence Completed

[/simterm]

Проверяем:

[simterm]

$ mtr -r -c 1 ya.ru
Start: Sun May 21 16:05:24 2017
HOST: setevoy-arch-home           Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 10.8.0.1                   0.0%     1   55.5  55.5  55.5  55.5   0.0
  2.|-- ???                       100.0     1    0.0   0.0   0.0   0.0   0.0
...
 12.|-- slou-b1-link.telia.net     0.0%     1   63.5  63.5  63.5  63.5   0.0
 13.|-- ldn-bb3-link.telia.net     0.0%     1   65.4  65.4  65.4  65.4   0.0
 14.|-- adm-bb3-link.telia.net     0.0%     1   75.0  75.0  75.0  75.0   0.0
 15.|-- adm-b2-link.telia.net      0.0%     1   73.8  73.8  73.8  73.8   0.0
 16.|-- yandex-ic-318530-adm-b2.c  0.0%     1   71.7  71.7  71.7  71.7   0.0
 17.|-- jansson-et-4-1-0.yndx.net  0.0%     1  100.7 100.7 100.7 100.7   0.0
 18.|-- std-p2-hu0-1-0-1.yndx.net  0.0%     1  130.2 130.2 130.2 130.2   0.0
 19.|-- sas1-c1-ae13.yndx.net      0.0%     1  128.3 128.3 128.3 128.3   0.0
 20.|-- ya.ru                      0.0%     1  144.5 144.5 144.5 144.5   0.0

[/simterm]

Готово.

UPD

Быстрая напоминалка по генерации клиентских ключей:

[simterm]

# cd /etc/openvpn/easy-rsa/
# . ./vars
# ./build-key client_name

[/simterm]

Обновляем client_name.ovpn (для Windows, Linuxclient_name.conf), меняем:

...
cert client_name.crt
key client_name.key
...

Отправляем клиенту:

[simterm]

$ ls -l keys/client_name.*
-rw-r--r-- 1 setevoy root 5626 Sep  3 17:49 client_name.crt
-rw-r--r-- 1 setevoy root 1106 Sep  3 17:49 client_name.csr
-rw------- 1 setevoy root 1704 Sep  3 17:49 client_name.key
-rw-r--r-- 1 setevoy root 3442 Sep  3 17:49 client_name.ovpn

 

[/simterm]

Ссылки по теме

https://www.linode.com/docs/networking/vpn/set-up-a-hardened-openvpn-server

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-debian-8