Вы здесь

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

Инструкция по установке и настройке OpenVPN-сервера на базе Linux -дистрибутива Debian 8 Jessie.

Для работы OpenVPN необходима поддержка TUN/TAP интерфейса на сервере. Если вы устанавливаете OpenVPN на физической машине, либо используете виртуализацию KVM, в с этим не должно возникнуть проблем.
В случае использования OpenVZ, необходимо активировать поддержку TUN/TAP в настройках контейнера.

Проверяем поддержку в системе tun/tap-интерфейсов:

ls -l /dev/net/tun
crw-rw-rw- 1 root root 10, 200 Nov 19 23:02 /dev/net/tun

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

apt-get update && apt-get upgrade
apt-get install openvpn

Клиенты будут использовать на сервере аутентификацию по ключу. Для этого создадим директорию в которую будут скопированы сгенерированные ключи:

# mkdir /etc/openvpn/easy-rsa/

И скопируем в нее утилиты и конфиги для работы с ключами:

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

переходим в созданную директорию:

# cd /etc/openvpn/easy-rsa/

В файле vars можно настроить параметры ключей и сертификатов. Данный пункт не обязательный и при желании его можно пропустить.

# vim vars

Меняем (по желанию) следующие строки:

export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"

Остальное оставляем по умолчанию.

После правки vars инициализируем переменные и очищаем каталог keys/serverот старых сертификатов и ключей:

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

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

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

# ./build-ca

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

Генерируем сертификаты сервера и клиента:

# ./build-key-server server
# ./build-key client1
# ./build-key client2

Для каждого клиента должны быть сгенерированы отдельные ключи.

Генерируем ключ Диффи — Хеллмана:

# ./build-dh

Cоздаем ключ для tls-аутификации:

# openvpn --genkey --secret keys/ta.key

Все сгенерированные сертификаты и ключи находятся в директории /etc/openvpn/easy-rsa/keys/
Копируем сертификаты и ключи сервера в директорию OpenVPN:

# cd /etc/openvpn/easy-rsa/keys
# cp server.crt server.key ca.crt dh2048.pem ta.key /etc/openvpn/

На клиентскую машину OpenVPN необходимо скопировать следующие ключи и сертификаты:

client1.crt
client1.key
ca.crt
ta.key

Для понимания назначения и расположения соответствующих файлов, я сделал небольшую таблицу:

Имя файла Где необходим Назначение Секретный
ca.crt сервер + все клиенты Корневой CA-сертификат НЕТ
ca.key машина для подписи ключей Корневой CA-ключ ДА
dh{n}.pem только сервер Параметры Diffie Hellman'а НЕТ
server.crt только сервер Сертификат сервера НЕТ
server.key только сервер Ключ сервера ДА
client1.crt только клиент1 Сертификат клиента1 НЕТ
client1.key только клиент1 Ключ клиента1 ДА
client2.crt только клиент2 Сертификат клиента2 НЕТ
client2.key только клиент2 Ключ клиента2 ДА

На этом установка сервера OpenVPN завершена, осталось настроить конфигурацию сервера.

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

Пример конфигурационного файла OpenVPN расположен в директории /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz, копируем и распаковываем его в /etc/openvpn:

# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
# gzip -d /etc/openvpn/server.conf.gz

В зависимости от потребностей, изменяем настройки сервера OpenVPN:

vim /etc/openvpn/server.conf

Вот моя конфигурация:

cat /etc/openvpn/server.conf
  1. local 1.2.3.4.5 # внешний IP сервера (Инетовский IP-адрес)
  2. port 1194 # порт на котором будет висеть служба OpenVPN
  3. proto tcp # протокол
  4. dev tun # используем тип тунеля для интернет, tap для eternet
  5. ca ca.crt # наши сертификаты
  6. cert cafap-250.crt
  7. key cafap-250.key
  8. dh dh1024.pem
  9. server 10.10.10.0 255.255.255.0 # Наша виртуальная сеть (адреса, которые будут присваиваться клиентам OpenVPN)
  10. ifconfig-pool-persist ipp.txt # запоминать выданные динамические адреса
  11. keepalive 10 120 # пинг каждые 10 секунд для поддержания канала связи
  12. comp-lzo # сжатие трафика
  13. persist-key
  14. persist-tun
  15. log /var/log/openvpn.log # Путь к лог-файлу
  16. verb 3 # Уровень детализации лога.
  17. mute # В лог будет записываться до 10 сообщений из одной категории.
  18. status openvpn-status.log #лог
  19. client-to-client
  20. ;push "redirect-gateway def1" # Перенаправлять default gateway на vpn-сервер. Если не нужно - закомментировать.
  21. ;push "route 192.168.2.0 255.255.255.0"
  22. client-config-dir ccd # Директория где хранятся настройки клиентов
  23. ;user nobody
  24. ;group nogroup

Если вам нужно чтобы , чтобы после подключения у клиента весь траффик шел через сервер OpenVPN, то раскомментируйте строку 20:

#push "redirect-gateway def1" 

Таким образом шлюзом по умолчанию для клиентов у вас станет OpenVPN - сервер.

Для повышения безопасности на linux-системах можно понизить права VPN-сервера, раскомментировав в конфиге сервера следующие строки:

user nobody
group nogroup

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

# mkdir /etc/openvpn/ccd
# reboot

После завершения настройки OpenVPN, перезагружаем сервер:

В случае успешного запуска OpenVPN в системе должен появиться новый tun0 интерфейс:

# ifconfig
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 10.10.10.1  netmask 255.255.255.255  destination 10.10.10.2
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)
        RX packets 37465  bytes 7557368 (7.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 39557  bytes 19278117 (18.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Наличие данного интерфейса означает, что OpenVPN Запущен и работает. Если по каким-либо причинам он не появился, то смотрим лог-файл на наличие ошибок:

# cat /var/log/openvpn.log

Настройка маршрутизации для клиентов OpenVPN

После подключения клиента к серверу OpenVPN, если он (клиент) находится в локальной сети, нужно дополнительно настроить маршрутизацию для доступа к ресурсам внутри сети. Для этого создаем файл в каталоге ccd с тем же именем ключа клиента:

# vim /etc/openvpn/ccd/client1

Добавим в файл следующие параметры:

push "route 192.168.2.0 255.255.255.0"
push "dhcp-option DNS 192.168.1.1"

Первая строка добавляет маршрут в локальную сеть клиента. Проще говоря - говорит клиенту OpenVPN "ходить" в сеть 192.168.2.0 через сервер OpenVPN. Если ваша локалка связана еще с какой-либо подсетью, то её также нужно указать.

Вторая строка задает DNS-сервер, который будет использоваться после подключения (Если в вашей локальной сети DNS-сервер отсутствует, то можно указать ns от Google - 8.8.8.8, либо не указывать вообще.

Включаем NAT на OpenVPN сервере

Чтобы использовать OpenVPN для выхода в интернет, на сервере необходимо задать правило для маршрутизации трафика из сети OpenVPN в локальную сеть или сеть интернет-провайдера и обратно.

Чтобы включить поддержку IP forwarding, нужно в файле /etc/sysctl.conf раскомментировать строчку:

net.ipv4.ip_forward=1

Применяем изменения (загружаем переменные ядра):

# sysctl -p

Не забываем прописать правила iptables. Нам нужно разрешить клиентам из подсети 10.10.10.0/24 доступ в интернет, разрешить принимать пакеты из интернета и пропустить трафик клиентов через NAT.

# iptables -A FORWARD -i tun0 -j ACCEPT
# iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE

В первой строке мы разрешаем форвардинг пакетов на интерфейсе tun0.
Второй строкой разрешаем форвардинг с tun0 на eth0.
Третей - разрешаем формардинг с eth0 на tun0.

Замените eth0 на имя своего внешнего интерфейса. Следует отметить, что MASQUERADE создает нагрузку на процессор. Поэтому, предпочтительнее использовать SNAT:

iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j SNAT --to-source ВНЕШНИЙ_IP
(в моем случае внешним IP был локальный адрес OpenVPN-сервера)

Разница между SNAT и MASQUERADE:
Маскарадинг постоянно запрашивает IP адрес у интерфейса, тем самым создавая нагрузку на процессор, в то время как SNAT "знает" IP (в нашем случае мы его указываем явно, т.к он статический).

Сохраняем правила и добавляем их в автозагрузку:

# iptables-save > /etc/iptables.conf
# echo "iptables-restore < /etc/iptables.conf" >> /etc/rc.local

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

Если OpenVPN не установлен, то установим его::

# apt-get install openvpn

Копируем на компьютер клиента следующие ключи и сертификаты:

  • client1.crt
  • client1.key
  • ca.crt
  • ta.key

Затем переносим их в директорию OpenVPN - /etc/openvpn/

Копируем и распаковываем пример конфигурационного файла в содержимое директории OpenVPN:

# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/

и редактируем его:

vim /etc/openvpn/client.conf

Добавим в содержимое файла следующие параметры:

client
dev tun
proto tcp
remote 1.2.3.4 1194                        # Адрес и порт сервера OpenVPN (внешний, инетовский)
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1
auth SHA512
cipher BF-CBC
comp-lzo adaptive
;log /var/log/openvpn.log
;status /var/log/openvpn-status.log
verb 3
mute 20
;route 192.168.1.0 255.255.0.0    # Можно прописать маршрут в локальную сеть, если это не сделано на сервере.         

Для Windows-машин нужно положить файл client.ovpn в папку:

C:\Program Files\OpenVPN\config\

Опции протокола, шифрования и сжатия у клиента и сервера должны быть одинаковые.

На этом настройка OpenVPN в Debian закончена, проверяем его работоспособность:

Перезапустим OpenVPN:

/etc/init.d/openvpn restart

Подключаемся с клиентской машины к OpenVPN-серверу , и пингуем с неё OpenVPN-сервер:

ping 10.10.10.1

Если пинг проходит, то все хорошо, если же нет, то смотрим логи и проверяем настройки маршрутизации.

P.S. Если у вас на сервере динамический IP, то можете воспользоваться скриптом замены IP в конфиге OpenVPN, и последующей его отправкой на email.

Если возникнут какие-либо вопросы - пишите в комментариях.