| Порівняння попередніх версійПопередня ревізіяНаступна ревізія | Попередня ревізія |
| vpn [2014/11/21 11:26] – wombat | vpn [2023/07/30 20:05] (поточний) – [Сервер] Налаштування сервера wombat |
|---|
| ====== VPN ====== | ====== OpenVPN ====== |
| |
| ===== Установка ===== | ===== Установка ===== |
| # openvpn --genkey --secret static.key | # openvpn --genkey --secret static.key |
| |
| Для связи одного компьютера с сервером (интерфейс TUN): | Для подключения со статическим ключом доступа: |
| |
| sudo openvpn --secret /etc/openvpn/static.key --proto tcp-server --lport 1194 --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 | sudo openvpn --secret /etc/openvpn/static.key --proto tcp-server --lport 1194 --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 |
| |
| Для организации некоторой подсети с возможностью подключения нескольких компьютеров к серверу (интерфейс TAP): | |
| |
| sudo openvpn --secret /etc/openvpn/static.key --proto tcp-server --lport 1194 --dev tap1 --ifconfig 10.9.8.1 255.255.255.0 | |
| |
| Если планируется подключаться к серверу только через SSH-тоннель (либо [[sslh|через SSLH]]), то нужно добавить к параметрам IP-адрес, к которому будет прикреплён сервер: | Если планируется подключаться к серверу только через SSH-тоннель (либо [[sslh|через SSLH]]), то нужно добавить к параметрам IP-адрес, к которому будет прикреплён сервер: |
| |
| sudo openvpn --secret /etc/openvpn/static.key --proto tcp-server --local 127.0.0.1 --lport 1194 --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 | sudo openvpn --secret /etc/openvpn/static.key --proto tcp-server --local 127.0.0.1 --lport 1194 --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 |
| |
| или | |
| |
| sudo openvpn --secret /etc/openvpn/static.key --proto tcp-server --local 127.0.0.1 --lport 1194 --dev tap1 --ifconfig 10.9.8.1 255.255.255.0 | |
| |
| Это позволит объединить сервер и подключившийся к нему компьютер в одну локальную сеть, однако ещё не даёт доступа подключённому компьютеру в интернет. Чтобы получить выход в интернет через такой сервер, на нём нужно включить NAT: | Это позволит объединить сервер и подключившийся к нему компьютер в одну локальную сеть, однако ещё не даёт доступа подключённому компьютеру в интернет. Чтобы получить выход в интернет через такой сервер, на нём нужно включить NAT: |
| # iptables -A FORWARD -s 10.9.8.0/24 -o <NET_IF> -j ACCEPT | # iptables -A FORWARD -s 10.9.8.0/24 -o <NET_IF> -j ACCEPT |
| # iptables -t nat -A POSTROUTING -s 10.9.8.0/24 -o <NET_IF> -j SNAT --to <SERVER_IP> | # iptables -t nat -A POSTROUTING -s 10.9.8.0/24 -o <NET_IF> -j SNAT --to <SERVER_IP> |
| |
| Следует заменить ''tun1'' на ''tap1'' в случае TAP-подключения. | |
| |
| ''<NET_IF>'' -- это "внешний" сетевой интерфейс сервера (через который осуществляется доступ в Интернет). | ''<NET_IF>'' -- это "внешний" сетевой интерфейс сервера (через который осуществляется доступ в Интернет). |
| ''<SERVER_IP>'' -- это IP-адрес сервера на внешнем сетевом интерфейсе. | ''<SERVER_IP>'' -- это IP-адрес сервера на внешнем сетевом интерфейсе. |
| |
| | **Примечание:** Если на сервере запустить несколько копий OpenVPN, указывая им один и тот же IP сервера, то сетевые пакеты будут свободно перемещаться из одной VPN в другую. Т.е. получается нечто вроде моста. |
| |
| ===== Клиент ===== | ===== Клиент ===== |
| sudo openvpn --proto tcp-client --remote <SERVER_IP> <SERVER_PORT> --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 | sudo openvpn --proto tcp-client --remote <SERVER_IP> <SERVER_PORT> --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 |
| |
| или | |
| |
| sudo openvpn --proto tcp-client --remote <SERVER_IP> <SERVER_PORT> --dev tap1 --ifconfig 10.9.8.2 255.255.255.0 | |
| |
| ==== Через прокси-сервер ==== | ==== Через прокси-сервер ==== |
| |
| sudo openvpn --proto tcp-client --remote <SERVER_IP> <SERVER_PORT> --http-proxy <PROXY> <PROXY_PORT> --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 | sudo openvpn --proto tcp-client --remote <SERVER_IP> <SERVER_PORT> --http-proxy <PROXY> <PROXY_PORT> --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 |
| |
| или | |
| |
| sudo openvpn --proto tcp-client --remote <SERVER_IP> <SERVER_PORT> --http-proxy <PROXY> <PROXY_PORT> --dev tap1 --ifconfig 10.9.8.2 255.255.255.0 | |
| |
| ssh -f -N -L 1194:localhost:1194 -p 443 vova@wombat.org.ua -J 'corkscrew proxy.opu.ua 3128 wombat.org.ua 443' | |
| openvpn --proto tcp-client --secret /jffs/etc/openvpn/WOU.key --remote localhost 1194 --dev tap1 --ifconfig 10.9.9.3 255.255.255.0 | |
| |
| |
| sudo openvpn --proto tcp-client --secret /etc/openvpn/static.key --remote localhost 5611 --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 | sudo openvpn --proto tcp-client --secret /etc/openvpn/static.key --remote localhost 5611 --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 |
| |
| или | === DD-WRT === |
| |
| sudo openvpn --proto tcp-client --secret /etc/openvpn/static.key --remote localhost 5611 --dev tap1 --ifconfig 10.9.8.2 255.255.255.0 | Если в качестве SSH-клиента используется [[https://matt.ucc.asn.au/dropbear/dropbear.html | Dropbear]] (как в [[dd-wrt|DD-WRT]]), тоннель через прокси нужно устанавливать следующим образом: |
| | |
| | ssh -f -N -L 1194:localhost:1194 -p <SSH_SERVER_PORT> <SSH_SERVER -J 'corkscrew <PROXY_SERVER> <PROXY_PORT> <SSH_SERVER> <SSH_SERVER_PORT>' |
| | openvpn --proto tcp-client --secret /jffs/etc/openvpn/static.key --remote localhost 1194 --dev tun1 --ifconfig 10.9.9.3 255.255.255.0 |
| | |
| | Для маршрутизатора удобнее сгенерировать SSH-ключ, чтобы обеспечить его беспарольное подключение к серверу. |
| | |
| | ssh-keygen |
| | |
| | Затем загрузить полученные файлы ''id_rsa'' и ''id_rsa.pub'' в папку ''/jffs/'' маршрутизатора (подразумевается наличие файловой системы JFFS в маршрутизаторе), и сконвертировать закрытый ключ в формат Dropbear: |
| | |
| | dropbearconvert openssh dropbear /jffs/id_rsa /jffs/id_rsa_dropbear |
| | |
| | Открытый ключ нужно загрузить на VPN-сервер, к которому будет подключаться маршрутизатор в домашний каталог пользователя, от имени которого будет производиться подключение. Например, если это будет пользователь "stavrida", то дописать содержимое только что сгенерированного файла ''id_rsa.pub'' в файл ''/home/stavrida/.ssh/authorized_keys'' на VPN-сервере. |
| | |
| | SSH-тоннель в этом случае следует устанавливать так: |
| | |
| | ssh -y -i /jffs/id_rsa_dropbear -f -N -L 1194:localhost:1194 -p <SSH_SERVER_PORT> <SSH_SERVER -J 'corkscrew <PROXY_SERVER> <PROXY_PORT> <SSH_SERVER> <SSH_SERVER_PORT>' |
| |
| ==== Новый маршрут ==== | ==== Новый маршрут ==== |
| |
| | sudo route add -net 10.9.8.0 netmask 255.255.255.0 gw 10.9.8.1 |
| sudo route del default | sudo route del default |
| sudo route add default gw 10.9.8.1 | sudo route add default gw 10.9.8.1 |
| |
| |
| | ------------ |
| |
| | Следует заменить ''tun1'' на ''tap1'' в случае TAP-подключения. |
| |
| | sudo openvpn --proto tcp-client --secret /etc/openvpn/static.key --remote localhost 5611 --dev tap1 --ifconfig 10.9.8.2 255.255.255.0 |
| |
| https://wiki.debian.org/OpenVPN | https://wiki.debian.org/OpenVPN |
| | |
| | https://openvpn.net/index.php/open-source/documentation.html |
| | |
| | |
| | |
| | |
| | ====== OpenConnect VPN ====== |
| | |
| | |
| | |
| | |
| | ===== Сервер ===== |
| | |
| | [[https://ocserv.gitlab.io/www/index.html|OpenConnect VPN Server]] |
| | |
| | Встановити сервер OpenConnect у Debian-подібних системах можна наступним чином: |
| | |
| | apt install ocserv |
| | |
| | |
| | 1. Спочатку нам знадобиться доменне ім'я, прив'язане до зовнішньої IP-адреси нашого сервера. |
| | |
| | 2. Далі потрібно отримати дійсний SSL-сертифікат для цього домену. Наприклад, [[ssl|сертифікат від Let's Encrypt!]]. |
| | |
| | 3. Наступним кроком потрібно налаштувати сервер у файлі ''/etc/ocserv/ocserv.conf'': |
| | |
| | Якщо хочемо організувати підключення з логіном та паролем, то коментуємо усі зайві рядки символом "''#''" та залишаємо лише рядок із вказанням шляху до файлу з паролями: |
| | |
| | <file> |
| | #auth = "pam" |
| | #auth = "pam[gid-min=1000]" |
| | auth = "plain[passwd=/etc/ocserv/ocpasswd]" |
| | </file> |
| | |
| | Тут ми вважаємо, що паролі зберігаються у файлі "''/etc/ocserv/ocpasswd''". Створити його та додати в нього дані про якогось користувача, наприклад, з іменем "''username1''", можна відповідною командою ''ocpasswd'': |
| | |
| | ocpasswd -c /etc/ocserv/ocpasswd username1 |
| | |
| | Треба налаштувати порти для TCP та UDP з'єднань (якщо такі дозволено): |
| | |
| | <file> |
| | tcp-port = 443 |
| | udp-port = 443 |
| | </file> |
| | |
| | Зауважимо, що порт 443 типово використовується веб-сервером для протоколу HTTPS. Тому якщо на цьому ж сервері передбачається одночасно робота веб-сервера, то потрібно обрати інший номер порту. |
| | |
| | Вказуємо шляхи до файлів SSL-сертифікату та відповідного приватного ключа. Якщо ці файли ми отримали за допомогою "Let's Encrypt", то вони зазвичай будуть зберігатися у шляхах на кшталт: |
| | |
| | <file> |
| | server-cert = /etc/letsencrypt/live/example.com.ua/fullchain.pem |
| | server-key = /etc/letsencrypt/live/example.com.ua/privkey.pem |
| | </file> |
| | |
| | Тут для прикладу використано доменне ім'я "''example.com.ua''". Звісно, для вашого домену воно буде якимось іншим. |
| | |
| | Можна змінити кількість дозволених одночасних клієнтів та одночасних з'єднань від одного клієнта: |
| | |
| | <file> |
| | max-clients = 32 |
| | max-same-clients = 32 |
| | </file> |
| | |
| | Також варто встановити період надсилання даних для підтримання з'єднання активним в залежності від параметрів вашої мережі та очікуваного режиму використання: |
| | |
| | <file> |
| | keepalive = 30 |
| | </file> |
| | |
| | try-mtu-discovery = true |
| | |
| | Якщо ми не хочемо, щоб клієнти автоматично від'єднувалися після тривалої відсутності активності з їхнього боку, треба закоментувати наступні рядки: |
| | |
| | <file> |
| | #idle-timeout = 1200 |
| | #mobile-idle-timeout = 1800 |
| | </file> |
| | |
| | Також корисна функція для захисту від автоматизованих атак, але яка може виявитися незручною для певних користувачів, це пауза після невдалої спроби увести пароль. В залежності від ситуації, також можна закоментувати: |
| | |
| | <file> |
| | #min-reauth-time = 300 |
| | </file> |
| | |
| | Вказуємо наш справжній домен, прив'язаний до нашого сервера: |
| | |
| | <file> |
| | default-domain = example.com.ua |
| | </file> |
| | |
| | Вказуємо базову IP-адресу та маску для віртуальної мережі, яку створить наш VPN сервер по підключенню клієнта: |
| | |
| | <file> |
| | ipv4-network = 10.9.8.0 |
| | ipv4-netmask = 255.255.255.0 |
| | </file> |
| | |
| | Вкажемо, що усі DNS-запити від клієнта потрібно передавати також через VPN, а також надаємо перелік DNS-серверів, доступних для сервера: |
| | |
| | <file> |
| | tunnel-all-dns = true |
| | |
| | dns = 127.0.0.53 |
| | dns = 8.8.8.8 |
| | dns = 1.1.1.1 |
| | </file> |
| | |
| | Тут IP-адреса "''127.0.0.53''" -- це типова локальна адреса, яку використовує сервіс ''systemd-resolved.service''. Замість неї можна вказати IP-адреси, надані провайдером. |
| | |
| | Якщо ми хочемо, щоб усі з'єднання клієнта після підключення до нашого VPN сервера, проходили через наш |
| | сервер (а саме для цього найчастіше і використовують VPN у побуті), то потрібно закоментувати усі рядки з вказанням маршрутів: |
| | |
| | <file> |
| | #route = 10.0.0.0/8 |
| | #route = 172.16.0.0/12 |
| | #route = 192.168.0.0/16 |
| | #route = fd00::/8 |
| | </file> |
| | |
| | Звісно, це найпростіший випадок. Якщо потрібна якась диференціація маршрутів, то можна їх вказати, а також додати маршрут за замовчуванням у кінці: |
| | |
| | <file> |
| | route = default |
| | </file> |
| | |
| | |
| | |
| | 4. Якщо сервер знаходиться за NAT'ом (наприклад, підключений до інтернету через маршрутизатор), то потрібно переспрямувати порти, які ми потім надамо користувачам для налаштування з'єднання, з маршрутизатора на наш сервер. |
| | |
| | В нашому прикладі ми вказали порт ''443'' для TCP та UDP-з'єднань. І якщо ми хочемо, щоб користувачі підключалися за зовнішньою адресою нашого сервера (власне, за доменним ім'ям) до порту ''443'', то переспрямовуємо цей порт з маршрутизатора до нашого сервера. Це робиться у налаштуваннях маршрутизатора. |
| | |
| | 5. Коли усі попередні кроки зроблено, можна перезапустити сервер OpenConnect, і все має працювати. |
| | |
| | sudo systemctl -l restart ocserv.service |
| | |
| | |
| | |
| | ===== Клієнт ===== |
| | |