Linux: работа с vpn, туннелями (gre, ipsec, stunnel, openvpn, shadowsocks, outline, cloak, v2ray, vmess/vless, etc)

 

vpn ports
  • PPTP TCP port 1723
  • L2TP TCP port 1701, UDP 500/4500
  • SSTP TCP 443

 

Зачем одному пользователю
  • Сбор информации за вами
  • 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)
Слабее доки/функционал/количество статей в сравнении с StrongSwan, но контрибьютеров больше.
openvpn
  • Может работать как на базе TCP, так и UDP, обычно на 1194 порту.
  • Поддерживает разливку конфигурации с сервера клиентам.
  • Работает от прав пользователя (что хорошо для безопасности).
  • Может пробрасывать как L3 (Layer 3 IP tunnel), так и L2 (Layer 2 Ethernet tap).
  • Сервер может разворачиваться в виртуалке как решение
    • в AWS/Azure/GCP
    • на вашем гипервизоре ESXi/Hyper-V
    • как традиционное приложение на сервере Ubuntu/Centos/Rhel
  • Так же как пример OpenVPN, который использует OpenSSL (см. практику работы с ним в статье security – по генерации private ключа на базе RSA и созданию public ключа на базе private, шифрования/дешифрования данных, генерации hash и его проверке) библиотеку для обмена ключами, шифрования данных. OpenVPN поддерживает шифрование до 256-бит с помощью OpenSSL. Использование OpenSSL так же позволяет OpenVPN выбирать любые шифры, которые реализованы в OpenSSL.
  • OpenVPN поддерживает разные типы аутентификации (Pre-shared secret PSK, certificate based, username-password). Username-password способ не встроен непосредственно в OpenVPN, а реализуется с помощью модуля. Certificate based считается наиболее безопасной опцией, но требует большей поддержки т.к. у каждого клиента должен быть свой сертификат.

Плюсы openvpn – очень большая гибкость, есть режим работы поверх TLS, есть проброс L2, есть аутентификация по сертификатам, гибкая настройка cipher suite. Покрывает зачастую потребности корпоративного VPN (напр. есть встроенная интеграция с LDAP) и поэтому часто используется в качестве замены 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
(
SoftEther или SSTP – работает, есть платная аппа на apple, помимо softher поддерживается микротиа и кинетик. SoftEther якобы умеет прикидываться https из коробкии)
Самый лучший комментарий, который нашел на этот софт “ЗВЕЗДОЛЕТ ГОВНА”. Куча говнокода. Безусловно есть и плюсы – напр. поддерживает все ОС и все возможные реализации туннелей (включая 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)

Russian DPI now is also able to detect and block plain shadowsocks and Outline when running in most restrictive mode. As reported by TG channels monitoring, only Cloak was able to break through.

2) amnezia vpn – openVPN over cloak (best); openVPN over shadowsocks, Wireguard, IKEv2, etc.

При выборе Экстремального уровня контроля будет установлен OpenVPN в связке с маскировкой Cloak, это позволит посещать заблокированные сайты и добавит маскировку VPN-трафика под http-трафик. Системы анализа трафика никак не смогут распознать, что вы используете VPN. Ваш VPN будет защищен от блокировок даже в регионах с самым высоким уровнем цензуры.

При выборе Среднего или Высокого уровня контроля будет установлен протокол AmneziaWG. Это форк протокола WireGuard-GO с защитой от блокировок. Его отличительная особенность - это измененные размеры Junk-пакетов и названия Magic-заголовков, по которым, система DPI распознает протокол WireGuard. Эти параметры так же можно изменить в настройках. Идеальный баланс между маскировкой и скоростью.

При выборе Низкого уровня контроля будет установлен протокол WireGuard без маскировки трафика. Подойдет для регионов, где не блокируются VPN-приложения и VPN-протоколы. Повышает уровень приватности пользователя, и дополнительно шифрует трафик.

ShadowSocks это протокол, который маскирует трафик под http-трафик. Однако маскировка ShadowSocks распознается системами анализа трафика в некоторых странах с высоким уровнем интернет-цензуры, поэтому для защиты своего VPN от блокировки мы советуем дополнительно использовать Cloak.

OpenVPN over Cloak - это OpenVPN c дополнительной маскировкой трафика Cloak. Позволит посещать заблокированные сайты и добавит маскировку VPN-трафика под http-трафик. Системы анализа трафика никак не смогут распознать, что вы используете VPN. Ваш VPN будет защищен от блокировок даже в регионах с самым высоким уровнем цензуры.

3) 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

  • Аккуратно с шарингом ключей – из под одного ключа может работать сразу несколько пользователей и это не поменять средствами приложения никак, реально нужный feautre request разрабы не берут в работу с 2018, хотя для меня не выглядит каким то rocket science ( чтобы кто нужно всегда мог подключиться с твоим ключем? 🙂 ). Можно с использованием iptables настроить лимит на количество одновременных соединений на один destination (outline) порт, но в целом утечку ключа чаще всего можно будет увидеть по статистике трафика в management утилите.
https://github.com/Jigsaw-Code/outline-server/issues/208
https://github.com/Jigsaw-Code/outline-server/issues/439
https://github.com/Jigsaw-Code/outline-server/issues/1391

https://serverfault.com/questions/371763/limit-maximum-incoming-connections-to-a-port-using-iptables
Limit maximum incoming connections to a port using iptables
You could try --connlimit with the --connlimit-mask option to set a mask of 0.
iptables -A INPUT -p tcp --dport XXY -m connlimit --connlimit-above 5 --connlimit-mask 0 -j REJECT
Where XXY is the port that you want to rate-limit connections to.

Чем 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 простейшая и описана в три шага на самом оффициальном сайте. Я немного детализирую технику:

    1. качаем outline manager – это утилита управления сервером
    2. копируем из outline manager строку по загрузке & запуску sh скрипта
    3. вставляем строку на своем VDS – по итогу sh-скрипт:
      1. установит docker контейнер с outline сервером
      2. установит docker контейнер с watchtower – для автоапдейта контейнера с сервером
      3. создаст самоподписанный TLS сертификат для сервера управления через Rest API с outline manager
      4. сгенерирует json, по которому можно подключится к серверу для управления им с manager
    4. вставляем json с сервера в outline manager, если есть проблемы с подключением – возможно заблокирован порт (в моем случае tcp port 23732)
    5. генерируем ключи для клиентов, копируем URL подключения/конфигурации из outline manager
    6. на клиенты устанавливаем 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>

Запущенные процессы – сервер outline-ss-server и 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 и т. д.
Не поднимал до полность рабочего состояния с clientS.
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. Подробный пример настройки

1) Включить роутинг на Linux, применять не надо.
root@debian:~# cat /proc/sys/net/ipv4/ip_forward
1
2) Настроить gre tunnel на разных сторонах
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 # при необходимости
3) Проверяем настройку
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
4) Удаление интерфейса
ip link set gre0 down
ip tunnel del gre0
stunnel
Иногда используется для шифрования между девайсами с разными ОС (Windows, Linux, Android). Само шифрование осуществляется на базе SSL/TLS.

 

Leave a Reply