Инструкция по установке и настройке 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 расположен в директории /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
-
local 1.2.3.4.5 # внешний IP сервера (Инетовский IP-адрес)
-
port 1194 # порт на котором будет висеть служба OpenVPN
-
proto tcp # протокол
-
dev tun # используем тип тунеля для интернет, tap для eternet
-
ca ca.crt # наши сертификаты
-
cert cafap-250.crt
-
key cafap-250.key
-
dh dh1024.pem
-
server 10.10.10.0 255.255.255.0 # Наша виртуальная сеть (адреса, которые будут присваиваться клиентам OpenVPN)
-
ifconfig-pool-persist ipp.txt # запоминать выданные динамические адреса
-
keepalive 10 120 # пинг каждые 10 секунд для поддержания канала связи
-
comp-lzo # сжатие трафика
-
persist-key
-
persist-tun
-
log /var/log/openvpn.log # Путь к лог-файлу
-
verb 3 # Уровень детализации лога.
-
mute # В лог будет записываться до 10 сообщений из одной категории.
-
status openvpn-status.log #лог
-
client-to-client
-
;push "redirect-gateway def1" # Перенаправлять default gateway на vpn-сервер. Если не нужно - закомментировать.
-
;push "route 192.168.2.0 255.255.255.0"
-
client-config-dir ccd # Директория где хранятся настройки клиентов
-
;user nobody
-
;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, если он (клиент) находится в локальной сети, нужно дополнительно настроить маршрутизацию для доступа к ресурсам внутри сети. Для этого создаем файл в каталоге 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 eth0 -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, во второй на интерфейсе eth0.
Третьей строкой разрешаем форвардинг с 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.
Если возникнут какие-либо вопросы - пишите в комментариях.