Користувальницькькі налаштування

Налаштування сайту


vpn

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Наступна ревізія
Попередня ревізія
vpn [2014/11/20 14:35]
wombat створено
vpn [2023/07/30 23:05] (поточний)
wombat [Сервер] Налаштування сервера
Рядок 1: Рядок 1:
-====== ​VPN ======+====== ​OpenVPN ​======
  
-===== Сервер =====+===== Установка ===== 
 + 
 +==== в Debian GNU/​Linux ​====
  
   sudo apt-get install openvpn   sudo apt-get install openvpn
 +
 +===== Настройка =====
 +
 +==== Сервер ====
 +
 +Чтобы организовать защищённое подключение,​ нужно сгенерировать секретный ключ доступа:​
  
   # openvpn --genkey --secret static.key   # openvpn --genkey --secret static.key
 +
 +Для подключения со статическим ключом доступа:​
 +
 +  sudo openvpn --secret /​etc/​openvpn/​static.key --proto tcp-server --lport 1194 --dev tun1 --ifconfig 10.9.8.1 10.9.8.2
 +
 +Если планируется подключаться к серверу только через 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
 +
 +Это позволит объединить сервер и подключившийся к нему компьютер в одну локальную сеть, однако ещё не даёт доступа подключённому компьютеру в интернет. Чтобы получить выход в интернет через такой сервер,​ на нём нужно включить NAT:
  
   # echo 1 > /​proc/​sys/​net/​ipv4/​ip_forward   # echo 1 > /​proc/​sys/​net/​ipv4/​ip_forward
-  # iptables -A FORWARD -i venet0 ​-o tun1 -m state --state ESTABLISHED,​RELATED -j ACCEPT +  # iptables -A FORWARD -i <​NET_IF> ​-o tun1 -m state --state ESTABLISHED,​RELATED -j ACCEPT 
-  # iptables -A FORWARD -s 10.9.8.0/24 -o venet0 ​-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 venet0 ​-j SNAT --to 162.211.231.29+  # iptables -t nat -A POSTROUTING -s 10.9.8.0/24 -o <​NET_IF> ​-j SNAT --to <​SERVER_IP>​ 
 + 
 +''<​NET_IF>''​ -- это "​внешний"​ сетевой интерфейс сервера (через который осуществляется доступ в Интернет). 
 +''<​SERVER_IP>''​ -- это IP-адрес сервера на внешнем сетевом интерфейсе. 
 + 
 +**Примечание:​** Если на сервере запустить несколько копий OpenVPN, указывая им один и тот же IP сервера,​ то сетевые пакеты будут свободно перемещаться из одной VPN в другую. Т.еполучается нечто вроде моста.
  
 ===== Клиент ===== ===== Клиент =====
 +
 +Для начала нужно скопировать секретный ключ доступа,​ сгенерированный на сервере,​ к себе на компьютер. Расположить его можно в ''/​etc/​openvpn/​static.key'',​ как и на сервере.
 +
 +==== Прямое подключение ====
 +
 +  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>​ --http-proxy <​PROXY>​ <​PROXY_PORT>​ --dev tun1 --ifconfig 10.9.8.2 10.9.8.1
 +
 +
 +==== Через SSH-тоннель ====
 +
 +  ssh -f -N -L5611:​localhost:​1194 -p <​SERVER_SSH_PORT>​ <​SERVER_IP> ​
 +  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 ===
 +
 +Если в качестве 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 -f -N -L5611:​localhost:​1194 -p 443 wombat.org.ua +  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 openvpn ​--proto tcp-client --secret /​etc/​openvpn/​WOU.key --remote localhost 5611 --dev tun1 --ifconfig ​10.9.8.10.9.8.1 + 
-  route del default +==== Новый маршрут ==== 
-  sudo route add 195.22.132.22 eth0 + 
-  sudo route add 195.22.132.2 eth0 +  sudo route add -net 10.9.8.0 netmask 255.255.255.0 gw 10.9.8.1 
-  sudo route add 195.22.132.3 eth0+  ​sudo route del default
   sudo route add default gw 10.9.8.1   sudo route add default gw 10.9.8.1
  
-  sudo openvpn ​--proto tcp-client --remote wombat.org.ua 443 --http-proxy <​PROXY>​ <​PROXY_PORT>​ --dev tun1 --ifconfig 10.9.8.2 10.9.8.1+Чтобы сохранить доступ к DNS-серверам своего провайдера (на всякий случай):​
  
 +  sudo route add <​DNS1_IP>​ eth0
 +  sudo route add <​DNS2_IP>​ eth0
  
 +Доступ к прокси-серверу,​ если он есть, обязательно нужно сохранить:​
 +
 +  sudo route add <​PROXY_IP>​ eth0
 +
 +Чтобы использовать DNS-серверы,​ отличные от предоставленных провайдером,​ можно изменить файл
 +
 +<file conf "/​etc/​resolv.conf">​
 +nameserver 8.8.8.8
 +nameserver 8.8.4.4
 +nameserver 4.2.2.1
 +nameserver 4.2.2.2
 +</​file>​
 +
 +
 +------------
 +
 +Следует заменить ''​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
 +
 +
 +
 +===== Клієнт =====
  
vpn.1416486945.txt.bz2 · В останнє змінено: 2014/11/20 14:35 by wombat