Skip to content

Установка и настройка OpenVPN на Debian

Системные требования

Для работы OpenVPN нужны минимальные требования. Система с 64 MB оперативной памяти и 1 GB места на жёстком диске достаточно для OpenVPN. OpenVPN работает почти на всех основных системах.

Установка и настройка OpenVPN на Debian

по данным zalinux

Установка OpenVPN on Мастер-сервер

Запустите следующую команду для установки OpenVPN.

1
apt-get install openvpn

По умолчанию скрипты easy-rsa scripts устанавливаются в директорию ‘/usr/share/easy-rsa/‘. Поэтому нам нужно скопировать эти скрипты в нужное расположение, например /root/easy-rsa.

1
2
mkdir /root/easy-rsa
cp -prv /usr/share/easy-rsa /root/easy-rsa

Генерируем CA сертификат и CA ключ

Откройте файл ‘vars‘ и сделайте следующие изменения, но перед внесением изменений я предлагаю сделать резервную копию.

1
2
cd /root/easy-rsa
cp vars{,.orig}

Используя ваш текстовый редактор измените значения по умолчанию для easy-rsa.

1
vim ./vars

Например, добавьте в самый низ:

1
2
3
4
5
6
KEY_SIZE=4096
KEY_COUNTRY="TH"
KEY_PROVINCE="ChonBuri"
KEY_CITY="Pattaya"
KEY_ORG="MiAlConsorcium"
KEY_EMAIL="user@example.net"

Здесь я использую 4096 битный ключ. Вы можете по своему использовать 1024, 2048, 4096 или 8192 битный ключ.

Экспортируем величины по умолчанию выполнив.

1
source ./vars

Очистим все сертификаты, которые были сгенерированы ранее.

1
./clean-all

Далее запустите следующую команду для генерации сертификата CA и ключа CA.

1
./build-ca

Сгенерируйте сертификат сервера следующей командой. Вместо «имя-сервера» подставьте имя сервера.

1
./build-key-server имя-сервера

Сгенерируйте PEM сертификат Diffie Hellman PEM.

1
./build-dh

Сгенерируйте клиентский сертификат. Вместо «имя-клиента» подставьте ваше имя клиента.

1
./build-key имя-клиента

Сгенерируйте код HMAC.

openvpn —genkey —secret /root/easy-rsa/keys/ta.key

Скопируйте сертификаты на машины клиента и сервера следующим образом.

  •  Убедитесь, что ca.crt присутствует и на клиентской и на серверной машинах.
  • Ключ ca.key должен быть на машине, сгенерировавшей ключ.
  • Сервер требует server.crt, dh4096.pemserver.key и ta.key.
  • client.crtclient.key и ta.key должны быть на клиенте.

Для установки сертификатов на сервере запустите команды.

1
2
mkdir -p /etc/openvpn/certs
cp -pv /root/easy-rsa/keys/{ca.{crt,key},имя-сервера.{crt,key},ta.key,dh4096.pem} /etc/openvpn/certs/

Настройка сервера OpenVPN

Теперь вам нужно настроить OpenVPN. Откройте фйл ‘/etc/openvpn/server.conf‘. Пожалуйста, сделайте изменения, как написано ниже.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
port 1194
proto udp
dev tun
 
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key
dh /etc/openvpn/certs/dh4096.pem
tls-auth /etc/openvpn/certs/ta.key 0
 
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
keepalive 1800 4000
 
cipher DES-EDE3-CBC # Triple-DES
comp-lzo
 
max-clients 10
 
user nobody
group nobody
 
persist-key
persist-tun
 
log /var/log/openvpn.log
status /var/log/openvpn-status.log
verb 5
mute 20
 
#client-config-dir ccd
mode server
tls-server

Запустите следующую команду для настройки OpenVPN запускаться при загрузке.

1
update-rc.d -f openvpn defaults

Запустите службу OpenVPN.

1
service openvpn restart

Включение перенаправления и IPTABLES

Создайте файл vpn_firewall.sh

1
vim /root/vpn_firewall.sh

B этот файл скопируйте следующее содержимое, отредактировав его под свои нужды. Обратите внимание на:

  • PRIVATE=10.8.0.0/24 – измените подсеть в соответствии с вашими настройками. Если делали по этой инструкции, то менять ничего не нужно.
  • имя интерфейса — eth0, у вас может быть другое значение, измените его на своё везде, где оно встречается
  • в строке iptables -A INPUT -p tcp —dport 22 -j ACCEPT мы открываем доступ к порту 22, чтобы могли подключиться по SSH, если у вас нестандартный порт, то обязательно отредактируйте его, поскольку может получиться так, что после применения этого файла вы не сможете подключиться к вашему серверу по сети, добавьте нужно количество строк с необходимыми вам портами
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/bin/sh
 
echo 1 > /proc/sys/net/ipv4/ip_forward
 
# Пример настройки файервола для OpenVPN.
 
# Если нужно, сделайте соответствующие
# изменения, сети вашего OpenVPN
PRIVATE=10.8.0.0/24
 
# Петлевой адрес
LOOP=127.0.0.1
 
# Удалить старые правила iptables
# и временно заблокировать весь траффик.
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -F
 
# Установление политик по умолчанию
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
 
# Предотвращаем использование локальных адресов внешними пакетами
iptables -A INPUT -i eth0 -s $LOOP -j DROP
iptables -A FORWARD -i eth0 -s $LOOP -j DROP
iptables -A INPUT -i eth0 -d $LOOP -j DROP
iptables -A FORWARD -i eth0 -d $LOOP -j DROP
 
# Всё, что приходит из Интернета, должно иметь реальный адрес
iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i eth0 -s 10.8.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 10.8.0.0/8 -j DROP
 
# Блокируем исходящий NetBios (если в вашей подсети
# есть машины с Windows).  Это не окажет влияния на какой-либо
# траффик NetBios, который идёт по VPN туннелю, но остановит
# локальные машины Windows от самостоятельного
# широковещания в Интернет.
iptables -A FORWARD -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A FORWARD -p udp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p udp --sport 137:139 -o eth0 -j DROP
 
# Разрешаем локальные петли
iptables -A INPUT -s $LOOP -j ACCEPT
iptables -A INPUT -d $LOOP -j ACCEPT
 
# Позволяем входящий пинг (можно отключить)
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
 
# Разрешаем такие службы как www и ssh (можно отключить)
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
 
# Разрешаем входящие пакеты OpenVPN
# Дуплицируйте строку ниже для каждого
# туннеля OpenVPN, меняя --dport n
# для соответствия порту OpenVPN UDP.
#
# В OpenVPN номер порта
# контролируется опцией --port n.
# Если вы разместили эту опцию в конфигурационном
# файле, вы можете удалить предшествующие '--'
#
# If you taking the stateful firewall
# approach (see the OpenVPN HOWTO),
# then comment out the line below.
 
iptables -A INPUT -p udp --dport 1194 -j ACCEPT
 
# Разрешить пакеты от устройств TUN/TAP.
# Когда OpenVPN запущен в безопасном режиме,
# он будет проверять подлинность пакетов до
# их прибытия на интерфейс
# tun или tap.  Следовательно нет
# необходимости добавлять сюда какие-либо фильтры,
# если вы не хотите ограничить
# тип пакетов, которые могут проходить
# через туннель.
 
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT
 
# Сохранить состояние подключений от локальной машины и частных сетей
iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW -o eth0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# Маскировка локальной сети
iptables -t nat -A POSTROUTING -s $PRIVATE -o eth0 -j MASQUERADE

Проверить работу файла:

1
bash vpn_firewall.sh

ОБЯЗАТЕЛЬНО проверьте работу файла ДО добавления его в автозагрузку. Отключитесь и подключитесь по SSH чтобы убедиться, что всё действительно работает.

Установка OpenVPN на клиенте

Запустите следующую команду для установки OpenVPN на клиентской машине.

1
2
apt-get install openvpn
mkdir -p /etc/openvpn/certs/

Настройки даны исходя из расположения файлов здесь:

  • /etc/openvpn/certs/ca.crt
  • /etc/openvpn/certs/client.crt
  • /etc/openvpn/certs/client.key
  • /etc/openvpn/certs/ta.key

Используя текстовый редактор, настройте конфигурацию OpenVPN клиента в ‘/etc/openvpn/client.conf‘ на клиенте. Пример конфигурации ниже:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
client
remote 185.117.153.79
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/client.crt
key /etc/openvpn/certs/client.key
cipher DES-EDE3-CBC
comp-lzo yes
dev tun
proto udp
tls-auth /etc/openvpn/certs/ta.key 1
nobind
auth-nocache
persist-key
persist-tun
user nobody
group nogroup

Обратите внимание на строку remote 185.117.153.79 – вам обязательно нужно заменить это значение на IP вашего собственного VPN сервера!

Запустите следующую команду для настройки OpenVPN запускаться при загрузке.

1
update-rc.d -f openvpn defaults

Запустите службу OpenVPN на клиенте.

1
service openvpn restart

Как просматривать логи OpenVPN

Для наших настроек это делается так:

1
2
cat /var/log/openvpn.log
cat /var/log/openvpn-status.log

Ещё это можно делать, например, командой:

1
grep VPN /var/log/syslog

Настройка входа в OpenVPN по логину и паролю

Принцип работы с подключением по логину и паролю следующий:

  • OpenVPN не может проверять действительность логина и пароля;
  • вместо проверки OpenVPN сохраняет присланные ей логин и пароль в файл со случайным именем в директорию, которую мы указали в tmp-dir (в нашем случае это /tmp).
  • после этого OpenVPN запускает скрипт, который мы указали в auth-user-pass-verify (в нашем случае это /etc/openvpn/verify.sh), в качестве аргумента этому скрипту передаётся имя только что сохранённого файла с логином и паролем.
  • если от скрипта получен код выхода 0, то OpenVPN авторизует клиента, если 1, то считает, что логин или пароль неверны.
  • после этого OpenVPN удаляет временный файл.

Схема работы, мягко говоря, так себе. Поскольку предусматривает хранение паролей в открытом виде и на сервере и на клиенте…

Внесём изменения в конфигурационный файл сервера:

1
vim /etc/openvpn/server.conf

Добавим туда следующие строки:

1
2
3
4
5
auth-user-pass-verify /etc/openvpn/verify.sh via-file
client-cert-not-required
username-as-common-name
tmp-dir /tmp
script-security 2

Создаём файл

1
vim /etc/openvpn/verify.sh

копируем туда следующий код (можете придумать свой механизм аутентификации):

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
 
USERS=`cat /etc/openvpn/user.pass`
for i in $USERS; do
if [ "$i" = "`cat $1 | paste -sd ':' -`" ]; then
exit 0
fi
done
echo "С таким паролем пользователей не найдено"
exit 1

Делаем файл исполнимым:

1
chmod 755 /etc/openvpn/verify.sh

Файл с паролями /etc/openvpn/user.pass выглядит так:

1
user1:pass1 user2:pass2 ...

то есть идёт через пробел пара логин:пароль. Пароль находится в открытом виде!

В конфигурационный файл клиента добавляем такую строку:

1
auth-user-pass /etc/openvpn/pass.txt

и создаём соответственно файл pass.txt, где будет находится логин и пароль в таком виде:

1
2
username
password

Примечание: Если в параметре auth-user-pass убрать путь к файлу, будет запрашиваться логин/пароль.

Полные конфигурационные файлы в моём случае. Для сервера:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
port 1194
proto udp
dev tun
 
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key
dh /etc/openvpn/certs/dh4096.pem
#tls-auth /etc/openvpn/certs/ta.key 0
 
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
keepalive 1800 4000
 
cipher DES-EDE3-CBC # Triple-DES
comp-lzo
 
max-clients 10
 
user nobody
group nobody
 
persist-key
persist-tun
 
log /var/log/openvpn.log
status /var/log/openvpn-status.log
verb 5
mute 20
 
#client-config-dir ccd
mode server
tls-server
 
auth-user-pass-verify /etc/openvpn/verify.sh via-file
client-cert-not-required
username-as-common-name
tmp-dir /tmp
script-security 2

Для клиента:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
client
remote 185.117.153.79
ca /etc/openvpn/certs/ca.crt
#cert /etc/openvpn/certs/client.crt
#key /etc/openvpn/certs/client.key
cipher DES-EDE3-CBC
comp-lzo yes
dev tun
proto udp
#tls-auth /etc/openvpn/certs/ta.key 1
nobind
auth-nocache
persist-key
persist-tun
user nobody
group nogroup
 
auth-user-pass /etc/openvpn/pass.txt

Перезапустите службу OpenVPN.

1
service openvpn restart
Published inLinux
Яндекс.Метрика