Быстрое поднятие OpenVPN сервера CentOS
OpenVPN на CentOS
Данная хаутушка является выдержкой многих статей с минимальным описанием шагов и без воды. Подразумевается, что центр сертификации и OpenVPN сервер находятся на одном хосте. К тому же, надоело каждый раз гуглить по данной теме, т.к. подавляющее большинство руководств являются устаревшими, то уходит много времени на поднятие сервиса.
Настройка OpenVPN для доступа клиентов к ресурсам локальной сети
Сервер
Конфиг сервера
Установить OpenVPN
yum -y install openvpn
Создать конфиг сервера openvpn со следующим содержимым:
mcedit /etc/openvpn/server.conf port 1194 proto udp dev tun0 #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
Центр авторизации и ключи
Установить центр авторизации 3 версии
yum -y install easyrsa`
Перейти в каталог easyrsa3 и объявить для него переменные:
cd ~/easy-rsa/3.0.3
cp ~/easy-rsa/3.0.3/vars.example ~//easy-rsa/3.0.3/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 tun0 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 от имени администратора, иначе в сиситеме не поднимутся маршруты, и произвести подключение двойным кликом по иконке в трее (такая область около часов, обычно в правом нижнем углу).