Аналогичный пост на эту тему – CentOS: установка OpenVPN сервера. Особой разницы нет, только тут OpenVPN сервер будет устанавливаться на Debian 8.
Ниже описывается достаточно базовая настройка, с единственной целью проксировать трафик с нескольких домашних машин в Украине на запрещённые ныне ресурсы.
Интересно – что получится по трафику, т.к. сервер (t2.nano
) расположен в Ирландии, AWS.
Впрочем, сам RTFM кушает трафика более чем прилично, например Апрель:

Но по деньгам пока нормально – попробую VPN в Амазоне.
Установка выполняется на:
lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.7 (jessie)
Release: 8.7
Codename: jessie
Установка OpenVPN
Обновляем установленные пакеты:
apt-get update && apt-get upgrade
Устанавливаем OpenVPN:
Копируем конфиг из готовых примеров:
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
Редактируем созданный /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
...
Настройка роутинга
Включаем поддержку пересылки пакетов ядром:
echo 1 > /proc/sys/net/ipv4/ip_forward
Правим /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):
ufw allow ssh
Rules updated
Rules updated (v6)
OpenVPN у нас будет работать по UDP, разрешаем порт 1194 ( доступ к нему тоже ограничен в security group):
ufw allow 1194/udp
Rules updated
Rules updated (v6)
Включаем роутинг в файле /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
:
ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Проверяем правила:
ufw status
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
1194/udp ALLOW Anywhere
22 ALLOW Anywhere (v6)
1194/udp ALLOW Anywhere (v6)
SSL
Переходим к созданию ключей.
Копируем скрипты:
cp -r /usr/share/easy-rsa/ /etc/openvpn
Создаём каталог для ключей сервера:
mkdir /etc/openvpn/easy-rsa/keys
Правим /etc/openvpn/easy-rsa/vars
. При желании – можно указать тут параметры по умолчанию для создаваемых ключей – страницу, организацию и т.д.
Указываем имя ключа:
...
# X509 Subject Field
export KEY_NAME="openvpn"
...
Генерируем ключ Diffie-Hellman с размером 2048 байт:
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
Готовим ключи.
Переходим в каталог openvpn
, применяем переменные из vars
, который редактировали выше:
. ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
Создаём свой CA сертификат:
./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]:
Проверяем:
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
Создаём ключ нашего OpenVPN сервера:
./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'
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
Проверяем:
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
Копируем ключи сервера в его каталог настроек:
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’
Проверяем:
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
Запускаем сервис:
systemctl start openvpn.service
Добавляем в автозапуск:
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
Проверяем сервис:
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.
Сервер:
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)
└─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
Собственно – на этом установка и настройка OpenVPN сервера завершена.
Клиент на Arch Linux опишу отдельно, подключаемся:
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
Проверяем:
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
Готово.
UPD
Быстрая напоминалка по генерации клиентских ключей:
cd /etc/openvpn/easy-rsa/
. ./vars
./build-key client_name
Обновляем client_name.ovpn
(для Windows, Linux – client_name.conf
), меняем:
...
cert client_name.crt
key client_name.key
...
Отправляем клиенту:
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
Ссылки по теме
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