Быстрое поднятие OpenVPN сервера на Debian, Ubuntu
Данная хаутушка является выдержкой многих статей с минимальным описанием шагов и без воды. Подразумевается, что центр сертификации и OpenVPN сервер находятся на одном хосте. К тому же, надоело каждый раз гуглить по данной теме, т.к. подавляющее большинство руководств являются устаревшими, то уходит много времени на поднятие сервиса.
Настройка OpenVPN для доступа клиентов к ресурсам локальной сети
Сервер
Конфиг сервера
Поставить OpenVPN и создать одноименного пользователя, под которым будет работать демон:
apt install openvpn adduser --system --no-create-home --disabled-login --group openvpn
Создать конфиг сервера openvpn со следующим содержимым:
mcedit /etc/openvpn/server.conf port 1194 proto udp dev tun #user openvpn #group openvpn dh /etc/openvpn/keys/dh.pem ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/vpn-server.crt key /etc/openvpn/keys/vpn-server.key tls-auth /etc/openvpn/keys/ta.key 0 #crl-verify /etc/openvpn/keys/crl.pem script-security 2 cipher AES-256-CBC tls-server comp-lzo mute 10 persist-key persist-tun max-clients 50 keepalive 10 900 client-config-dir /etc/openvpn/ccd ifconfig-pool-persist /etc/openvpn/ccd/ipp.txt server 10.15.0.0 255.255.255.0 ### Эти параметры требуют пояснений. # Пушить (передавать клиенту) свой DNS север push "dhcp-option DNS 192.168.0.1" # Пушить название домена push "dhcp-option DOMAIN mydomain.com" # Пушить маршрут локальной подсети. Для того, чтобы у клиентов был доступ до нее push "route 192.168.0.0 255.255.254.0" ### status /var/log/openvpn/openvpn-status.log 1 status-version 3 log-append /var/log/openvpn/openvpn-server.log verb 5
Создать каталоги для логов и хранения IP адресов клиентов:
mkdir /var/log/openvpn/ mkdir /etc/openvpn/ccd
Центр авторизации и ключи
Перейти в домашний каталог, скачать и распаковать easyrsa 3 версии:
cd wget https://github.com/OpenVPN/easy-rsa/archive/master.zip unzip master.zip
Перейти в каталог easyrsa3 и объявить для него переменные:
cd ~/easy-rsa-master/easyrsa3 cp ~/easy-rsa-master/easyrsa3/vars.example ~/easy-rsa-master/easyrsa3/vars
Инициализировать PKI
(Public Key Infrastructure - Инфраструктура открытых ключей):
./easyrsa init-pki
Создать корневой сертификат. Обязательно ввести сложный пароль и Common Name
сервера, например my vpn server
:
./easyrsa build-ca
Создать ключи Диффи-Хелмана:
./easyrsa gen-dh
Создать запрос на сертификат для сервера OVPN. Обращаю внимание, что сертификат будет незапаролен (параметр nopass
), иначе при каждом старте OpenVPN будет запрашивать этот пароль:
./easyrsa gen-req vpn-server nopass
Создать сам сертификат сервера OVPN:
./easyrsa sign-req server vpn-server
Скопировать полученные ключи в рабочий каталог openvpn:
mkdir -p /etc/openvpn/keys cp ~/easy-rsa-master/easyrsa3/pki/ca.crt /etc/openvpn/keys cp ~/easy-rsa-master/easyrsa3/pki/issued/vpn-server.crt /etc/openvpn/keys cp ~/easy-rsa-master/easyrsa3/pki/private/vpn-server.key /etc/openvpn/keys cp ~/easy-rsa-master/easyrsa3/pki/dh.pem /etc/openvpn/keys
Создать "HMAC firewall" для защиты от DoS аттак и флуда UDP порта:
cd /etc/openvpn/keys/ openvpn --genkey --secret ta.key
Запустить openvpn
:
/etc/init.d/openvpn start
Клиент
Ключи
Создание запроса запароленного ключа для клиента (потребуется вводить при каждом подключении) с именем User:
cd ~/easy-rsa-master/easyrsa3 ./easyrsa gen-req User
Если авторизация будет внешней (например ADшная), то пароль не потребуется. Создание запроса без парольного ключа для клиента:
./easyrsa gen-req User nopass
Создание ключа пользователя (по дефолту из vars сроком на 10 лет):
./easyrsa sign-req client User
Или с ограничением действия сертификата в 90 дней (после истечения срока можно только перевыпустить):
./easyrsa sign-req client User -days 90
Клиенту передать эти файлы:
~/easy-rsa-master/easyrsa3/pki/issued/User.crt ~/easy-rsa-master/easyrsa3/pki/private/User.key ~/easy-rsa-master/easyrsa3/pki/ca.crt /etc/openvpn/keys/ta.key
Конфиг
client dev tun proto udp remote xxx.xxx.xxx.xxx 1194 cipher AES-256-CBC tls-client ca "ca.crt" tls-auth "ta.key" 1 cert "User.crt" key "User.key" remote-cert-tls server comp-lzo tun-mtu 1500 mssfix 1450 verb 3 nobind resolv-retry infinite
Для удобства все пять клиентских файлов можно объединить в один
Отзыв сертификатов
Генерация файла отозванных ключей:
cd ~/easy-rsa-master/easyrsa3 ./easyrsa gen-crl
Сделать символическую ссылку в каталог с ключами (конечно, файл можно и скопировать, но придется делать каждый раз при отзыве сертификата):
ln -s ~/easy-rsa-master/easyrsa3/pki/crl.pem /etc/openvpn/keys
В /etc/openvpn/server.conf
добавить строку
crl-verify /etc/openvpn/keys/crl.pem
Отзыв сертификата пользователя User:
./easyrsa revoke User
Каждый раз при отзыве сертификата необходимо обновлять crl.pem
, чтобы внести в него изменения:
./easyrsa gen-crl
Примечание: одноименный файл ключа не может быть создан пока не отозван старый. При попытке создать сертификат с уже имеющимся именем выдаст ошибку:
failed to update database Easy-RSA error: signing failed (openssl output above may have more detail)
Минимальная настройка Iptables для доступа OpenVPN клиентов к локальной сети
# Включить форвард в ядре echo "1" > /proc/sys/net/ipv4/ip_forward # Разрешить входящие соединения на порт OVPN iptables -A INPUT -p UDP --dport 1194 -j ACCEPT # Разрешить форвард между подсетью OVPN и локальной # При чем, ставить их в начале цепочки, если правил много iptables -A FORWARD -s 10.15.0.0/24 -d 192.168.0.0/24 -j ACCEPT iptables -A FORWARD -d 10.15.0.0/24 -s 192.168.0.0/24 -j ACCEPT
Настройка OpenVPN для выхода в интернет
Наткнулся на тред, поржал и решил дополнить заметку. Если OpenVPN нужен для выхода в интернет - надо сделать, чтобы OpenVPN был шлюзом по умолчанию (default gateway) и подправить правила iptables.
Собственно, конфиг для сервера:
port 1194 proto udp dev tun dh /etc/openvpn/keys/dh.pem ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/vpn-server.crt key /etc/openvpn/keys/vpn-server.key tls-auth /etc/openvpn/keys/ta.key 0 crl-verify /etc/openvpn/keys/crl.pem script-security 2 cipher AES-256-CBC tls-server comp-lzo mute 10 persist-key persist-tun max-clients 50 keepalive 10 900 client-config-dir /etc/openvpn/ccd ifconfig-pool-persist /etc/openvpn/ccd/ipp.txt server 10.15.0.0 255.255.255.0 push "redirect-gateway def1" status /var/log/openvpn/openvpn-status.log 1 status-version 3 log-append /var/log/openvpn/openvpn-server.log verb 5
Конфиг для клиента не будет отличаться от приведенного выше.
Минимальная настройка Iptables для выхода OpenVPN клиентов в интернет
Правила iptables:
# Включить форвард в ядре echo "1" > /proc/sys/net/ipv4/ip_forward # Разрешить входящие соединения на порт OVPN iptables -A INPUT -p UDP --dport 1194 -j ACCEPT # Разрешить ходить транзитным пакетам для подсети OpenVPN iptables -A FORWARD -s 10.15.0.0/24 -j ACCEPT iptables -A FORWARD -d 10.15.0.0/24 -j ACCEPT # x.x.x.x - внешний IP сервера, если он статический iptables -t nat -A POSTROUTING -s 10.15.0.0/24 -j SNAT --to-source x.x.x.x # Если внешний IP сервера динамический, то вместо предыдущего правила использовать это # iptables -t nat -A POSTROUTING -s 10.15.0.0/24 -j MASQUERADE
Некоторые замечания
Для исключения возможности mitm атаки, ошибка которого так выглядит в логах клиента:
WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.
Служит параметр remote-cert-tls server
, который уже присутствует в конфиге клиента.
Список валидных и отозванных сертификатов
Список валидных и отозванных сертификатов можно посмотреть в файле ~/easy-rsa-master/easyrsa3/pki/index.txt. Начало строки оисания каждого сертификата начинается с букв V
или R
, что значит Valid и Revoked, например:
V 241019110411Z 01 unknown /CN=vpn-server R 241019110842Z 141202085241Z 02 unknown /CN=User1 R 241020105823Z 141201103442Z 03 unknown /CN=test R 150301095139Z 141202085814Z 04 unknown /CN=User2 V 141203091049Z 05 unknown /CN=User3
Как видно, первый и пятый сертификаты валидны, 2-4 отозваны.
Если клиент на Windows
Поставить OpenVPN GUI, скачав отсюда. Скопировать клиентские ключи в C:\Program Files\OpenVPN\config\
. Скопировать конфиг клиента и вставить в файл client.ovpn
, положить туда же. Всего в этом каталоге должно получиться пять файлов - User.crt, User.key, ca.crt, ta.key, client.ovpn
.
Обязательно запустить OpenVPN GUI от имени администратора, иначе в сиситеме не поднимутся маршруты, и произвести подключение двойным кликом по иконке в трее (такая область около часов, обычно в правом нижнем углу).
Ссылки по теме:
Описание параметров конфигурационных файлов.
Как сделать центр сертификации по феншую.
Отзыв сертификата Easy-RSA без .crt файла
Как прикрутить доменную авторизацию через AD к openvpn
Что делать, если
./easyrsa.real sign-req server vpn.1-ok.com
Note: using Easy-RSA configuration from: ./vars
Easy-RSA error:
Unknown cert type ‘server’
???
Скорее всего нарушена структура каталогов. В исходнике написано:
т.е.
$EASYRSA_EXT_DIR
=easy-rsa-master/easyrsa3/x509-types
. Предположу, что нет этого каталога или его содержимого.Скачайте easy-rsa3 по новой и все взлетит.
Версия у вас какая? У меня на версии 3.0.6 не заработало. а на 3.0.4 всё норм. Попробуйте 3.0.3 или 3.0.4(точно рабочая)
Привет! Спасибо!
застряла на пункте конфиг клиента, т.е. на стороне клиента в папке etc/openvpn создала файл client.conf с предлагаемым содержанием ( поменяла только xxx.xxx.xxx.xxx на ip сервера), ключи и сертификаты сгенерированные сервером выложила в папку /etc/openvpn/easy-rsa/keys.
Дальше как?
Если это Linux без GUI, то /etc/init.d/openvpn restart
Если с GUI, то настроить соединение через Network Manager
Если винда, то скачать клиента и подсунуть ему файлы.
Спасибо! Клиент на raspberry (raspbian wheezy)
на команду: openvpn /etc/openvpn/client.conf выдает следующее:
Thu Apr 21 13:19:10 2016 OpenVPN 2.2.1 arm-linux-gnueabihf [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Dec 1 2014
Thu Apr 21 13:19:10 2016 NOTE: OpenVPN 2.1 requires ‘—script-security 2’ or higher to call user-defined scripts or executables
Thu Apr 21 13:19:10 2016 Cannot load certificate file User.crt: error:02001002:system library:fopen:No such file or directory: error:20074002:BIO routines:FILE_CTRL:system lib: error:140AD002:SSL routines:SSL_CTX_use_certificate_file:system lib
Thu Apr 21 13:19:10 2016 Exiting
переделать все сначала? что не так?
Ясно же говорит — нет файла User.crt
Cannot load certificate file User.crt ... No such file or directory
. Предположу, что1. Надо запускать от рута, т.е. в случае Raspberry использовать sudo
2. Перед запуском сделать
cd /path/to/keys
или использовать абсолютные пути в конфигеУ меня не пинговались клиенты с сервера, после этого правила:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT —to-source x.x.x.x
Заработало только когда сделал так:
iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -j SNAT —to-source x.x.x.x
iptables -t nat -A POSTROUTING -o eth0 -j SNAT —to-source x.x.x.x
Вы путаете таблицы nat и filter. Таблица nat не должна фильтровать пакеты. Своим же правилом Вы только разрешили хождение пакетов через NAT с eth0 интерфейса.
Доброго времени суток, хотелоcь бы делать редирект только на локальную сеть к базе данных openvpn при этом . остальной трафик должен идти не через openvpn, а прямо в сеть в сеть.
Со стороны клиента использую :
client
port 1179
proto udp
dev tun
cipher AES-256-CBC
ca ca.crt
cert user1.crt
key user1.key
remote **.**.**.**
#no-bind
comp-lzo
remote-cert-tls server
persist-key
persist-tun
tls-auth ta.key 1
verb 5
#route 172.30.0.0 255.255.0.0
—redirect-gateway def1
#route-no-pull
Со стороны сервера:
ca ca.crt
cert aurora.crt
key aurora.key
dh dh2048.pem
tls-auth ta.key 0
cipher AES-256-CBC
server 172.30.3.0 255.255.255.0
#for windows clients
#topology subnet
keepalive 10 120
comp-lzo
persist-key
persist-tun
#push «redirect-gateway»
client-config-dir ccd
verb 5
user nobody
group nogroup
client-to-client
status aurora-status.log
log /var/log/aurora.log
sndbuf 0
rcvbuf 0
route 172.30.3.0 255.255.255.0
push «dhcp-option DNS 8.8.8.8»
Не понял формулировку задачи, опишите пожалуйста подробнее.
1. Что хотите слелать
2. Что сделали
3. Что идет не так, как Вы ожидали
Задача была обеспечить шифрование данных с помощью openVPN. При этом необходимо что бы обычный трафик шел обычным образом, а обращения (на пример к базе данных) к ресурсу исключительно через openVPN, при этом понятно , что БД находится в одной локальной сети с прокси сервером .
В статье именно об этом и написано. Хотите конкретики — следуйте шаблону из предыдущего моего коммента.
на ubuntu 16.04.4 openvpn не стартовал
сначала в /etc/default/openvpn раскомментировать строку AUTOSTART=»all»
Если после этого при запуске
sudo systemctl start openvpn@[ИМЯ ФАЙЛА КОНФИГА].service
появляется ошибка
«daemon() failed or unsupported: Resource temporarily unavailable (errno=11)»
Делаем следующее
sudo systemctl edit openvpn@ [tab]
В редакторе вставляем строки
[Service]
LimitNPROC=infinity
Это создаст файл
/etc/systemd/system/[email protected]/override.conf
Затем запускаем
sudo systemctl daemon-reload
sudo systemctl start openvpn@[ИМЯ ФАЙЛА КОНФИГА].service
p.s.: как тут форматировать текст?
Стандартная HTML разметка. Для кода испольльзуйте теги
code
илиpre
PS:
Я оставил этот момент на пользователя, поскольку считал его знакомым с systemd. Спасибо за дополнение!
Большое спасибо за статью!
Сделал ключи клиентов. Пинги от клиента до сервера идут.Возникло несколько вопросов.
1. Подскажите, пожалуйста, как подключить mikrotik в качестве ovpn клиента? Импортирую в mikrotik user.crt, user.key, ca.crt. В меню PPP добавляю данные OVPN Client: адрес сервера, порт, клиентский сертификат и тип шифрования (AES-256). Но маршрутизатор отказывается устанавливать соединение с сервером.
2. Как предоставить удаленным клиентам, подключенным к ovpn серверу, доступ к локальным ресурсам mikrotika?
Спасибо за отзыв )
1. Не могу ни чего сказать, смотрите логи на микротике. Как правило, достаточно бывает поиграть настройками шифрования, если все остальное не вызывает сомнений.
2. Надо сделать роутинг — на этих клиентах добавить маршрут в подсеть миркотика через OVPN сервер. Что-то типа
ip route add 192.168.20.0/24 dev tun0
, где 192.168.20.0/24 — локальная подсеть за микротиком, tun0 — OVPN интерфейс на клиенте, которому нужен доступ в подсеть за микротиком.PS. Чтобы клиенты имели возможность видеть друг друга, необходимо с конфиг сервера добавить опцию
client-to-client
, без нее не заработает.2. push «route 10.10.10.0 255.255.255.0 10.0.0.2 1» — отправит маршрут клиенту (микроитку) и он сможет видеть маршруты вашей сети
route 192.168.3.0 255.255.255.0 172.16.254.3 в openvpn.conf скажет серверу openvpn что у одного из клиентов есть такие адреса, дальше через ccd, в директории создать файл с именем равным имени пользователя клиента или common name сертификата, в котором прописать iroute 192.168.3.0 255.255.255.0. На свои адреса только поменять.
admin, wf, спасибо за помощь!
Первый вопрос решил. Микротик не дружит с протоколом UDP, а так же не поддерживает сжатие и TLS-аутентификацию.
Не могу победить второй вопрос. Сеть 192.168.1.* (микротик 1.1). Сеть удаленного клиента 192.168.2.* (маршрутизатор 1.1).
В server.conf прописал следующее:
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ccd/ipp.txt
server 10.15.0.0 255.255.255.0
route-gateway 10.15.0.1
route 10.15.0.1 255.255.255.0
topology subnet
client-to-client
В сcd User1 прописал доступ к одному ip: push «route 192.168.1.3 255.255.255.255».
У клиента добавил следующий маршрут: route add 10.15.0.6 mask 255.255.255.255 10.15.0.6.
Ping от клиента к удаленному устройству (1.3) не проходи.
Для всех страждущих ключей ВПН, их можно взять здесь https://t.me/Almost_Free_VPN_bot