- GUI управление VPN возможно network manager (по умолчанию L2TP, PPTP, OpenVPN, IPSec, с возможность добавления Wireguard)
- Все статьи про VPN
- Базовая теория
- DMVPN
- L2VPN
- Remote Access VPN
- IPsec VPN и множественные его реализации, site-to-site VPN
- Пример практической настройки VPN (IPSec и не только)
Зачем одному пользователю
- Сбор информации за вами
- Telegram
реализации
Их очень много, выбираем что нравится:
- xSwan (StrongSwan, LibreSwan) и реализации на основе них (напр. ipsec-vpn-server ниже)
- SoftEther
- WireGuard – подробнее в отдельной статье, включая настройку Wireguard в Linux
- ExpressVPN
- Racoon
- Accel-ppp (bras средне-провайдерского/энтерпрайз уровня)
- RouterOS, pfSense
- Juniper vSRX, PaloAlto, Fortigate, Checkpoint, Cisco, Sophos XG Firewall, etc. Лицензия только нужна (иногда есть и бесплатная, например для Sophos XG Home). Из плюса большого это возможность из коробки и SSL tunnel и все что угодно еще поднять.
StrongSwan
LibreSwan (ранее OpenSwan)
openvpn
Плюсы – очень большая гибкость, есть режим работы поверх TLS, есть проброс L2, есть аутентификация по сертификатам, гибкая настройка cipher suite. Покрывает зачастую потребности корпоративного VPN и используется в качестве замены anyconnect и аналогов (напр. используется Яндексом в качестве корпоративного VPN).
Минусы – из-за гибкости сложно настраивается (OpenVPN AccessServer решает проблему), низкая производительность (udp туннель решает проблему).
Деплой OpenVPN в виде OpenVPN AccessServer как контейнера от linuxserver. Используем на свой страх и риск – image deprecated в пользу wireguard. После двух пользователей платный.
****************************************************** ****************************************************** * * * * * This image is deprecated. * * We will not offer support for this image * * and it will not be updated. * * * * * ****************************************************** ****************************************************** We recommend our wireguard image instead for vpn: https://github.com/linuxserver/docker-wireguard
Параметры конфигурации контейнера описаны тут, не забываем в соответствии с рекомендацией дропнуть admin учетку и в целом желательно ограничить доступ к админскому WEB порталу (доступ по порту 943).
Что я поменял от дефолта (с примерами pcap):
- port 443 udp для UDP openvpn, основной протокол работы (сначала происходит попытка соединения именно по нему) 443_udp_openvpn_hadshake.pcap
- port 8443 (можно настроить любой, у меня TCP 443 занят) для TCP openvpn, попытка соединения происходит только если UDP туннель не поднялся (fallback) – по сути аналогия cisco anyconnect DTLS 8443_openvpn_hadshake.pcap
- конфиг в локальной директории your_config_dir_full_path (напр. /home/user_zero/)
sudo docker pull linuxserver/openvpn-as sudo docker run -d --name=openvpn-as --cap-add=NET_ADMIN -e PUID=1000 -e PGID=1000 -e TZ=Europe/London -e INTERFACE=eth0 `#optional` -p 943:943 -p 8443:8443 -p 443:443/udp -v <your_config_dir_full_path> --restart unless-stopped ghcr.io/linuxserver/openvpn-as # WEB (поднимается не сразу) https://<<YourIpAddress>>:943/admin Username: admin Password: password
Далее:
1) создаем учетку(и), выдаем нужной права админа в User management -> User permissions
2) удаляем учетку admin в User management -> User permissions
3) меняем hostname в network settings (тут должен быть внешний fqdn или IP, а не серый адрес docker), так же если меняли порты при создании контейнера – меняем порты TCP/UDP и в конфигурации самого ovpn в соответствии с настройками контейнера
4) создаем и выгружаем ovpn профиль(и) в User management -> User profile, в профиле содержится ключевая информация и конфигурация клиента. Можно было бы использовать self portal – пользователь логинится на web портале под своей учеткой и получает профиль и клиентский софт, но на мой взгляд это менее безопасно, портал у меня откл на внешнюю сеть.
5) enjoy
SOFTETHER
Самый лучший комментарий, который нашел на этот софт “ЗВЕЗДОЛЕТ ГОВНА”. Куча говнокода. Безусловно есть и плюсы – напр. поддерживает все ОС и все возможные реализации туннелей (включая L2).
https://www.softether.org/4-docs/9-research/Design_and_Implementation_of_SoftEther_VPN https://www.softether-download.com/en.aspx?product=softether https://www.softether.org/4-docs/1-manual/7._Installing_SoftEther_VPN_Server/7.3_Install_on_Linux_and_Initial_Configurations https://www.softether.org/3-spec
методы evasion vpn detection
мой выбор в качестве собственного сервера:
1) outline на базе shadowsocks (ss)
2) trojan
Если сервера нет потенциально должны работать ios приложения типа ultraserf vpn, puffin browser.
В целом shadowsocs один из самых популярных серверов во многом в силу того, что появился одним из первых для обхода великого китайского файра, но он и менее защищен от методов детекта в сравнении с более современными v2ray, vmess/vless (vless более современнее vmess), trojan (trojan современней всех).
Инфа с разных мест:
Vmess+TLS+WS has the biggest number of tutorials available, with Trojan following, and VLESS+XTLSх is the poorest documented.
Trojan is a newer protocol designed to act like HTTPS which is the most common traffic on the internet if you don't know.
По итогу Trojan выглядит наиболее простым. Честно говоря от китайских штук типа V2Ray или Xray как-то странно пахнет. Будто в них используется огромное количество велосипедов непонятно зачем. Я не исключаю, что всё это ради эффективного обхода блокировок, но вот например не понимаю зачем в большинстве гайдов создают такой оверхед, используя сразу TLS + WS + Vmess? Двойное шифрование с вебсокетами вместо обычного http/2.
outline vpn
https://getoutline.org
Чем outline отличается от других методов (v2ray, trojan, etc).
Shadowsocks is battle-tested, simple to understand and has a lot less overhead. You don’t need a domain name and it performs better. I recommend setting up your own server with Outline (I’m one of the authors).
Называют это VPN, но по факту это shadowsocks proxy под капотом с удобным управлением, созданием нескольких пользователей, множеством клиентом под разные ОС. Обвязки все эти допилены группой jigsaw Google.
Установка outline VPN простейшая и описана в три шага на самом оффициальном сайте. Я немного детализирую технику:
- качаем outline manager – это утилита управления сервером
- копируем из outline manager строку по загрузке & запуску sh скрипта
- вставляем строку на своем VDS – по итогу sh-скрипт:
- установит docker контейнер с outline сервером
- установит docker контейнер с watchtower – для автоапдейта контейнера с сервером
- создаст самоподписанный TLS сертификат для сервера управления через Rest API с outline manager
- сгенерирует json, по которому можно подключится к серверу для управления им с manager
- вставляем json с сервера в outline manager, если есть проблемы с подключением – возможно заблокирован порт
- генерируем ключи для клиентов, копируем URL подключения/конфигурации из outline manager
- на клиенты устанавливаем outline client и вставляем строку с URL с manager
# Script to install the Outline Server docker container, a watchtower docker container (to automatically update the server), and to create a new Outline user. -bash-4.2$ sudo bash -c "$(wget -qO- https://raw.githubusercontent.com/Jigsaw-Code/outline-server/master/src/server_manager/install_scripts/install_server.sh)" > Verifying that Docker is installed .......... OK > Verifying that Docker daemon is running ..... OK > Setting PUBLIC_HOSTNAME to external IP ...... OK > Creating persistent state dir ............... OK > Generating secret key ....................... OK > Generating TLS certificate .................. OK > Generating SHA-256 certificate fingerprint .. OK > Writing config .............................. OK > Starting Shadowbox .......................... OK > Starting Watchtower ......................... OK > Waiting for Outline server to be healthy .... OK > Creating first user ......................... OK > Adding API URL to config .................... OK > Checking host firewall ...................... OK CONGRATULATIONS! Your Outline server is up and running. To manage your Outline server, please copy the following line (including curly brackets) into Step 2 of the Outline Manager interface {"apiUrl":"https://<ip>:<port>/<hash>","certSha256":"<hash>"} If you have connection problems, it may be that your router or cloud provider blocks inbound connections, even though your machine seems to allow them. Make sure to open the following ports on your firewall, router or cloud provider: - Management port <xxxx>, for TCP - Access key port <xxxx>, for TCP and UDP
Что внутри основного контейнера.
sudo docker exec -it shadowbox sh
Пример конфига клиента – ciphersuite, port, secret.
/opt/outline-server # cat /opt/outline/persisted-state/outline-ss-server/config.yml keys: - cipher: chacha20-ietf-poly1305 id: '0' port: <port> secret: <XXXX>
Запущенные процессы – сервер и prometheus.
22 root 1:22 /opt/outline-server/bin/prometheus --config.file /opt/outline/persisted-state/prometheus/config.yml --web.enable-admin-api --storage.tsdb.retention.time 31d --storage.tsdb.path /opt/outline/persisted-state/prometheus/data --web.listen-address 127.0.0.1:9090 --log.level info 29 root 2:39 /opt/outline-server/bin/outline-ss-server -config /opt/outline/persisted-state/outline-ss-server/config.yml -metrics 127.0.0.1:9092 -ip_country_db /var/lib/libmaxminddb/ip-country.mmdb --replay_history=10000
Зачем то используют geo-ip mmdb базу libmaxminddb/ip-country.mmdb. Пример использования другой базы.
> mmdb_country --file /path/to/file.mmdb --ip 1.2.3.4 Australia
shadowsocks поддерживает и tcp и udp
shadowsocks (чистый)
Чистый shadowsocks не поддерживает несколько пользователей (и судя по git не планирует), только если создавать несколько instance в виде на каждого юзера свой прокси (один юзер на один порт).
shadowsocks client apps for IOS: spectre (работает, но не всегда, возможно связано с залипанием сессий), shawdowlink (шлет что-то по udp, по факту не работает), v2box, fair vpn.
Создание контейнера.
sudo docker run --name shadowsocks -d -e PASSWORD=<PASS> -p8388:8388 -p8388:8388/udp --restart=always shadowsocks/shadowsocks-libev
Попасть в контейнер можно так:
sudo docker exec -it shadowsocks sh
Посмотреть параметры запуска сервера:
~ $ ps -a PID USER TIME COMMAND 1 nobody 0:00 ss-server -s 0.0.0.0 -p 8388 -k <PASSWORD> -m aes-256-gcm -t 300 -d 8.8.8.8,8.8.4.4 -u
v2ray
v2ray по сути как комбайн.
https://www.v2ray.com/ru/
-
Несколько протоколов: V2Ray поддерживает несколько протоколов, включая Socks, HTTP, Shadowsocks, VMess и т. Д. Каждый протокол может иметь собственный транспорт, такой как TCP, mKCP, WebSocket и т. д.
sudo docker pull teddysun/v2ray sudo mkdir -p /etc/v2ray sudo cat > /etc/v2ray/config.json { "inbounds": [{ "port": 9000, "protocol": "vmess", "settings": { "clients": [ { "id": "11c2a696-0366-4524-b8f0-9a9c21512b02", "level": 1, "alterId": 6, } ] } }], "outbounds": [{ "protocol": "freedom", "settings": {} }] } sudo docker run -d -p 8443:9000 --name v2ray --restart=always -v /etc/v2ray:/etc/v2ray teddysun/v2ray
Racoon (ipsec-tools)
racoon is an alternative keying daemon, but it only implements the IKEv1 protocol and it's not actively developed anymore (unless you consider its forks in e.g. iOS/OS X and Android).
ipsec-vpn-server
Есть ipsec/l2tp vpn server как docker image, очень удобен по настройке и использованию, работает с клиентами iOS/MAC OS (проверял и Cisco IPsec и L2TP), Windows 10 (требует изменения регистра и простую настройку L2TP/IKEv2 втроенного клиента или стороннего IPSec XAuth).
Доп. настройки VPN/L2TP для Windows: - с использованием rasdial + планировщика задач настраивается автозапуск VPN, выбирать рекомендую автозапуск при логине т.к. при старте ПК может не работать, - для автологина при запуске ПК используем netplwiz, - static IP настраивается в настройках TCP/IP самого клиента, - там же в доп. настройках отключается установка default route и в powershell прописываются необходимые маршруты, обязательно не в CMD! Add-VpnConnectionRoute -ConnectionName "VPN Connection Name" -DestinationPrefix 10.0.0.0/16
“Под капотом” сервер использует Libreswan (IPsec VPN software; я бы сам лучше выбрал StrongSwan, подробности выше почему) и xl2tpd (L2TP daemon). В целом все (деплой, настройка клиентской стороны) подробно описано по ссылке к серверу в header.
# create & start container sudo docker run --name ipsec-vpn-server --env-file ./vpn.env --restart=always -v ikev2-vpn-data:/etc/ipsec.d -v /lib/modules:/lib/modules:ro -p 500:500/udp -p 4500:4500/udp -d --privileged hwdsl2/ipsec-vpn-server # stop & rm (будь осторожен если заходишь на сервер из под VPN - используй другой способ входа или screen и последовательность команд с последующим реконнектом к серверу) sudo docker stop ipsec-vpn-server sudo docker rm ipsec-vpn-server # under vpn example screen -S vpn_restart sudo docker stop ipsec-vpn-server ; sudo docker rm ipsec-vpn-server ; sudo docker run --name ipsec-vpn-server --env-file ./vpn.env --restart=always -v ikev2-vpn-data:/etc/ipsec.d -v /lib/modules:/lib/modules:ro -p 500:500/udp -p 4500:4500/udp -d --privileged hwdsl2/ipsec-vpn-server # users in container (врятли пригодится) cat /etc/ipsec.d/passwd # включение логов с username (по умолчанию отключены) https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/master/docs/advanced-usage.md#enable-libreswan-logs
Из особенностей:
- пример ручной настройки того же (ipsec + l2tp)
- если хочется из под одной учетной записи заходить с разных устройств, то это возможно, но оба устройства должны использовать один тип VPN
- при настройке L2TP не забываем включать опцию по передаче всего трафика в туннель, по умолчанию во многих клиентах она отключена
- нужно пробрасывать UDP порты 500/4500 для работы (IPSec NAT-T)
The ports that are exposed for this container to work are: 4500/udp and 500/udp for IPsec a0e3be0f032a hwdsl2/ipsec-vpn-server "/opt/src/run.sh" 8 months ago Up 56 seconds 0.0.0.0:500->500/udp, 0.0.0.0:4500->4500/udp ipsec-vpn-server
- статус сервера и подключенные клиенты (для быстрого доступа к командам)
sudo docker exec -it ipsec-vpn-server ipsec status sudo docker exec -it ipsec-vpn-server ipsec whack --trafficstatus sudo docker logs ipsec-vpn-server # внутри контейнера sudo docker exec -it ipsec-vpn-server bash /etc/xl2tpd/xl2tpd.conf cat /etc/ppp/options.xl2tpd cat /etc/ipsec.d/passwd
-bash-4.2$ sudo docker exec -it ipsec-vpn-server ipsec whack --trafficstatus 006 #70: "l2tp-psk"[35] <in_ip>, type=ESP, add_time=1590312870, inBytes=65469, outBytes=312426, id='192.168.100.40' 006 #72: "l2tp-psk"[36] <in_ip>, type=ESP, add_time=1590312885, inBytes=8754, outBytes=7686, id='192.168.100.43' 006 #142: "xauth-psk"[16] <in_ip>, username=<username>, type=ESP, add_time=0, inBytes=225856, outBytes=316252, lease=192.168.43.10/32
Используя L2TP сервер (напр. docker ipsec-vpn-server) можно настроить устройства на iOS с опцией автоподключения к сети при разрыве с любых сетей, используя функционал “VPN On Demand”. Подробнее тут.
GRE
GRE поднимается в aws. Подробный пример настройки
root@debian:~# cat /proc/sys/net/ipv4/ip_forward 1
Server1 ip tunnel add gre666 mode gre remote 172.16.0.2 local 172.16.0.1 ttl 255 ip link set gre666 up ip addr add 1.1.1.1/24 dev gre666 ip route add 10.1.0.0/24 via 1.1.1.1 ip addr add 10.0.0.1/32 dev lo ip link set gre666 mtu 1400 # при необходимости Server2 ip tunnel add gre666 mode gre remote 172.16.0.1 local 172.16.0.2 ttl 255 ip link set gre666 up ip addr add 1.1.1.2/24 dev gre666 ip route add 10.100.0.1/24 via 1.1.1.2 ip addr add 10.1.0.1/32 dev lo ip link set gre666 mtu 1400 # при необходимости
root@debian:~# ip tunnel gre0: gre/ip remote any local any ttl inherit nopmtudisc gre666: gre/ip remote 172.16.0.2 local 172.16.0.1 ttl 255
root@debian:~# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 10.0.0.1/32 scope global lo valid_lft forever preferred_lft foreve 10: gre666@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1 link/gre 172.16.0.1 peer 172.16.0.2 inet 1.1.1.1/24 scope global gre666 valid_lft forever preferred_lft forever inet6 fe80::5efe:ac10:1/64 scope link valid_lft forever preferred_lft forever root@debian:~# ping 10.1.0.1 -M do -s 1500 PING 10.1.0.1 (10.1.0.1) 1500(1528) bytes of data. ping: local error: Message too long, mtu=1400 ping: local error: Message too long, mtu=1400 ping: local error: Message too long, mtu=1400 ping: local error: Message too long, mtu=1400 ping: local error: Message too long, mtu=1400
ip link set gre0 down ip tunnel del gre0
stunnel