<- До підрозділу Теорія по OpenVPN
Встановлення та налаштування OpenVPN на Debian
https://wiki.debian.org/OpenVPN
Загальні поняття
Встановлення
Встановіть пакет openvpn як на клієнті, так і на сервері.
sudo apt update
sudo apt-get install openvpn
Щоб увімкнути OpenVPN в аплеті Gnome NetworkManager для області сповіщень на панелі завдань, на клієнті потрібно встановити додатковий пакет network-manager-openvpn-gnome
:
apt-get install network-manager-openvpn-gnome
Попередні умови
На брандмауері сервера відкрийте UDP 1194 (порт за замовчуванням). Майте на увазі, що 90% усіх проблем підключення, з якими стикаються нові користувачі OpenVPN, пов’язані з брандмауером. Дізнатися чи використовується брандмауер iptables на пристрої:
sudo iptables -L
Додайте правило для відкриття порту udp для вхідного трафіку:
sudo iptables -A INPUT -p udp --dport 1194 -j ACCEPT
Збережіть правила
sudo apt install iptables-persistent
sudo netfilter-persistent save
Перевірка чи порт слухають всередині сервера після запуску
sudo netstat -tuln | grep 1194
або
sudo ss -tuln | grep 1194
Якщо порожньо то порт не прослуховується. Перевірка відкритості порту ззовні через утиліту nmap:
nmap -sU -p 1194 -T4 1.1.1.1
Конфігурування
OpenVPN може автентифікувати користувачів за допомогою user/pass, попереднього спільного ключа, сертифікатів тощо.
Системне меню NetworkManager / GNOME
Можна повністю налаштувати з’єднання OpenVPN за допомогою параметрів Debian GNOME за замовчуванням разом із network-manager-openvpn-gnome
. Підключенням VPN керуватиметься, як і будь-яким іншим мережевим підключенням, у NetworkManager, а також матиме елементи керування в системному меню GNOME поруч із елементами керування WiFi та Ethernet. Щоб певне мережеве підключення автоматично активувало конфігурацію OpenVPN у GNOME 42 (використовується в bookworm), використовуйте nm-connection-editor
. Знайдіть мережеве підключення, відкрийте його налаштування, а потім у розділі Загальні увімкніть Автоматично підключатися до VPN. Після збереження рядок secondaries=
додається до файлу конфігурації цієї мережі в розділі [підключення]
. Він міститиме список UUID вторинного підключення, які потрібно активувати. Зазвичай файл конфігурації /etc/NetworkManager/system-connections/.
Сире (незахищене) VPN з’єднання для тестування
Серверна частина
Якщо ваш клієнт має статичний IP з оболонки сервера запустіть
# openvpn --remote CLIENT_IP --dev tun1 --ifconfig 10.9.8.1 10.9.8.2
Якщо ваш клієнт має динамічний IP запустіть
sudo openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2
Ви повинні побачити консольний вихід, схожий на
2021-09-03 21:22:18 library versions: OpenSSL 1.1.1k 25 Mar 2021, LZO 2.10
2021-09-03 21:22:18 ******* WARNING *******: All encryption and authentication features disabled -- All data will be tunnelled as clear text and will not be protected against man-in-the-middle changes. PLEASE DO RECONSIDER THIS CONFIGURATION!
2021-09-03 21:22:18 TUN/TAP device tun1 opened
...
Під час роботи openvpn
перевірте конфігурацію мережі за допомогою ip a
. Вихідні дані повинні включати
9: tun1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
link/none
inet 10.9.8.1 peer 10.9.8.2/32 scope global tun1
valid_lft forever preferred_lft forever
inet6 fe80::dc71:3707:693c:5017/64 scope link stable-privacy
valid_lft forever preferred_lft forever
Зауважте, що якщо ви закриєте openvpn
(наприклад, за допомогою Control-c у його консолі), ви не побачите наведений вище мережний інтерфейс.
Client part
# openvpn --remote SERVER_IP --dev tun1 --ifconfig 10.9.8.2 10.9.8.1
...
2021-09-03 21:32:32 Peer Connection Initiated with [AF_INET]SERVER_IP:PORT
2021-09-03 21:32:32 2012 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
2021-09-03 21:32:32 Initialization Sequence Completed
...
Ви також можете зробити ping сервера, щоб перевірити його доступність: ping 10.9.8.1
.
VPN-з’єднання зі статичним ключем
Конфігурація VPN-сервера зі статичним ключем
У каталозі /etc/openvpn
сервера виконайте таку команду, щоб створити статичний ключ:
# openvpn --genkey secret static.key
Примітка: для OpenVPN 2.4 на Debian 10 використовуйте --secret
замість secret
. Скопіюйте цей статичний ключ до каталогу клієнта /etc/openvpn
за допомогою безпечного каналу, наприклад scp
або sftp
. На сервері створіть новий файл /etc/openvpn/tun0.conf
і додайте наступне:
dev tun0
ifconfig 10.9.8.1 10.9.8.2
secret /etc/openvpn/static.key
Де 10.9.8.x
— ваша підмережа VPN, 10.9.8.1
— IP-адреса сервера, 10.9.8.2
— IP-адреса клієнта.
Конфігурація VPN-клієнта зі статичним ключем
На клієнті скопіюйте /etc/openvpn/static.key
із сервера та створіть новий файл /etc/openvpn/tun0.conf
і додайте таке:
remote your-server.org
dev tun0
ifconfig 10.9.8.2 10.9.8.1
secret /etc/openvpn/static.key
Запустіть OpenVPN вручну з обох сторін за допомогою такої команди (докладне виведення на 6):
# openvpn --config /etc/openvpn/tun0.conf --verb 6
Щоб переконатися, що VPN працює, ви повинні мати можливість перевірити 10.9.8.2
на сервері та 10.9.8.1
на клієнті.
VPN-з’єднання з підтримкою TLS
Починаючи з Jessie, easy-rsa — це окремий пакет, який слід завантажувати разом із встановленням openvpn.
Ініціалізація easy-rsa
# cd /etc/openvpn
# make-cadir easy-rsa/
Щоб ініціалізувати середовище, просто скористайтеся такою командою:
cd easy-rsa/
./easyrsa init-pki
Усі команди запускаються з папки easy-rsa. Зверніться до ./easyrsa help
для детального опису доступних команд.
Пам’ятайте:
- тільки файли
.key
повинні бути конфіденційними. - Файли
.crt
і.csr
можна надсилати через незахищені канали, такі як звичайна електронна пошта. - не потрібно копіювати файл
.key
між комп’ютерами. - кожен комп’ютер матиме власний сертифікат/пару ключів.
Створення CA CERTIFICATE/KEY
Створіть CERTIFICATE/KEY ЦЕНТРУ СЕРТИФІКАЦІЇ (CA):
# ./easyrsa build-ca
Він створить ca.crt
і ca.key
в каталогах /etc/openvpn/easy-rsa/{pki,pki/private}
. Згенеруйте CERTIFICATE/KEY сервера:
# ./easyrsa build-server-full server
Він створить server.crt
і server.key
у /etc/openvpn/easy-rsa/pki/{issued/server.crt,private/server.key}
і підпише ваш кореневий сертифікат.
Створення DIFFIE-HELLMAN PARAMETERS
Створіть BUILD DIFFIE-HELLMAN PARAMETERS (необхідно для серверної сторони підключення SSL/TLS):
./easyrsa gen-dh
Створення Static Key для TLS authentication
Якщо ви вже створили статичний ключ, ви можете перейменувати його на ta.key
і перемістити до папки /etc/openvpn/server
. Інакше виконайте наступне:
openvpn --genkey secret /etc/openvpn/server/ta.key
Примітка. Для OpenVPN 2.4 on Debian 10, вкиористовуйте --secret
замість secret
.
Створення CERTIFICATE/KEYs для клієнтів
Створіть ключ для кожного клієнта: скористайтеся однією з наступних двох команд.
- Згенеруйте ключ без пароля:
./easyrsa build-client-full clientname nopass
- Згенерувати ключ із паролем: вам буде запропоновано ввести “Enter PEM pass phrase” (це парольна фраза, яку вам знадобиться для входу в клієнт кожного разу, коли ви підключаєтесь до сервера), для кожного клієнта:
./easyrsa build-client-full clientname
Він створить ключі в /etc/openvpn/easy-rsa/pki/{issued/clientname.crt,private/clientname.key}
.
Встановлення Client CERTIFICATE/KEYs
Скопіюйте ca.crt, clientname.crt, clientname.key
з каталогів Server до Client /etc/openvpn/easy-rsa/pki/{issued/clientname.crt,private/clientname.key}
.
Перевірте ключ OpenVPN RSA, щоб дізнатися більше.
VPN підключення через командний рядок
Server:
openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 --tls-server --dh /etc/openvpn/easy-rsa/pki/dh.pem --ca /etc/openvpn/easy-rsa/pki/ca.crt --cert /etc/openvpn/easy-rsa/pki/issued/server.crt --key /etc/openvpn/easy-rsa/pki/private/server.key --reneg-sec 60 --verb 5 --cipher AES-256-CBC --auth SHA512 --tls-version-min 1.3 --auth-nocache
Client:
openvpn --remote SERVER_IP --dev tun1 --redirect-gateway def1 --ifconfig 10.9.8.2 10.9.8.1 --tls-client --ca /etc/openvpn/easy-rsa/pki/ca.crt --cert /etc/openvpn/easy-rsa/pki/issued/clientname.crt --key /etc/openvpn/easy-rsa/pki/private/clientname.key --reneg-sec 60 --verb 5 --cipher AES-256-CBC --auth SHA512 --tls-version-min 1.3 --auth-nocache
Конфігураційний файл VPN Server
Якщо попереднє підключення успішне, створіть файл конфігурації сервера /etc/openvpn/server.conf
таким чином:
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key # keep secret
dh /etc/openvpn/easy-rsa/pki/dh.pem
topology subnet
server 10.9.8.0 255.255.255.0 # internal tun0 connection IP
ifconfig-pool-persist ipp.txt
push "route 192.168.0.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
keepalive 10 120
tls-auth /etc/openvpn/server/ta.key 0
auth-nocache
cipher AES-256-CBC
data-ciphers AES-256-CBC
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3 # verbose mode
client-to-client
explicit-exit-notify 1
Створити файл статусу журналу:
# touch /var/log/openvpn/openvpn-status.log
Перезапуск OpenVPN.
# service openvpn restart
Зауважте, що сценарій /etc/init.d/openvpn
, запущений service openvpn restart
, запустить сервер openvpn для кожного файлу .conf
у /etc/openvpn/
, тому, якщо у вас все ще є файл tun0.conf
, перейменуйте його на щось інше, ніж *.conf
. Це тому, що systemd за замовчуванням хоче лише один сервер openvpn.
Конфігураційний файл VPN Client
У клієнті створіть /etc/openvpn/client.conf
таким чином: (примітка: ви можете використовувати графічний інтерфейс мережевого менеджера vpn, надавши ключ і сертифікати)
client
dev tun
proto udp
remote VPNSERVER_IP 1194 # [VPN server IP] [PORT]
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/clientname.crt
key /etc/openvpn/easy-rsa/pki/private/clientname.key
remote-cert-tls server
tls-auth /etc/openvpn/server/ta.key 1
auth-nocache
cipher AES-256-CBC
data-ciphers AES-256-CBC
mute-replay-warnings
verb 3
Restart OpenVPN:
# service openvpn restart
Запуск VPN підключення як Systemd service
At the root of /etc/openvpn/
За замовчуванням усі налаштовані VPN у /etc/openvpn/
запускаються під час завантаження системи. Відредагуйте /etc/default/openvpn
, щоб запустити певні VPN або вимкнути цю поведінку. Вам потрібно один раз запустити systemctl daemon-reload
, щоб увімкнути нові VPN
у вкладених папках server і client
У Debian служба systemd очікує, що файли конфігурації сервера та клієнта будуть відповідно у /etc/openvpn/server
та /etc/openvpn/client
. Після того як ви створили конфігураційний файл у правильній папці, його потрібно ввімкнути. Наприклад, припустімо, що ви створили конфігурацію в /etc/openvpn/server/myserver.conf
:
systemctl start openvpn-server@myserver
systemctl enable openvpn-server@myserver
Запуск VPN підключення через файли інтерфейсів
openvpn ifupdown також доступні для запуску/зупинки тунелів за допомогою /etc/network/interfaces
, наприклад:
auto dsl
iface dsl inet ppp
provider dsl-provider
openvpn work_vpn
Див /usr/share/doc/openvpn/README.Debian.gz
для детальної інформації
Android / iOS devices certificate generation
…
Forward traffic to provide access to the Internet
on the Server
In Server enable runtime IP forwarding:
echo 1 > /proc/sys/net/ipv4/ip_forward
Edit /etc/sysctl.conf uncomment the following line to make it permanent:
net.ipv4.ip_forward = 1
Execute the following command in server for testing (Old way):
IF_MAIN=eth0
IF_TUNNEL=tun0
YOUR_OPENVPN_SUBNET=10.9.8.0/24
#YOUR_OPENVPN_SUBNET=10.8.0.0/16 # if using server.conf from sample-server-config
iptables -A FORWARD -i $IF_MAIN -o $IF_TUNNEL -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s $YOUR_OPENVPN_SUBNET -o $IF_MAIN -j ACCEPT
iptables -t nat -A POSTROUTING -s $YOUR_OPENVPN_SUBNET -o $IF_MAIN -j MASQUERADE
Execute the following command in server for testing (Starting with Bullseye):
IF_MAIN=eth0
IF_TUNNEL=tun0
YOUR_OPENVPN_SUBNET=10.9.8.0/24
#YOUR_OPENVPN_SUBNET=10.8.0.0/16 # if using server.conf from sample-server-config
nft add table ip filter
nft add table ip nat
nft add chain ip filter FORWARD
nft add chain nat POSTROUTING '{ type nat hook postrouting priority srcnat; policy accept; }'
nft add rule ip filter FORWARD iifname "$IF_MAIN" oifname "$IF_TUNNEL" ct state related,established accept
nft add rule ip filter FORWARD oifname "$IF_MAIN" ip saddr $YOUR_OPENVPN_SUBNET accept
nft add rule ip nat POSTROUTING oifname "$IF_MAIN" ip saddr $YOUR_OPENVPN_SUBNET masquerade
You may also use the rc.firewall-iptables script from TLDP Masquerade as an alternative.
If everything is working fine, save the rules: Debian wiki iptables and nftables pages for details.
Manage the Public Key Infrastructure
?easy-rsa helps to manage the key of your PKI:
- Generation of client & server certificates
- revocaton of certificates
More info here: /usr/share/doc/easy-rsa/doc
For security purpose, it is advised to set up the PKI in a different server that the openvpn server.
Application to a VPN passing through a http proxy
Prerequisites: install an HTTP proxy
This part describe how to configure a VPN to pass through a http proxy, which allow only trafic on port 443 (and 80). This use the http-proxy option of OpenVPN.
- First of all, check that the port 443 isn’t already used by another service on your server.
- Configure OpenVPN on server side by adding port 443 and proto tcp-server to the configuration file. This option works only with TCP as the tunnel carrier protocol
- Configure OpenVPN on the client side by adding port 443, proto tcp-client and http-proxy 1.1.1.1 8080 to the configuration file.
Where 1.1.1.1 and 8080 are IP and port of your proxy.
- Now you should launch OpenVPN on the server and next on the client.
Enable and use the Management Interface
Enable the option in server conf file by adding:
management localhost 7505
Connect to this interface:
telnet localhost 7505
This is useful for authentication (http-proxy) or killing an open session. More info
Troubleshooting
- Check the log files which are by default in /var/log/openvpn/
- Most of VPN issue are related to firewall configuration
- Check if it might be related to natwork routing table on server (or client) side
- Another lead: DNS management (resolv.conf, resovlconf) on both server and client side
Адаптовано Олександр Пупена.