У Wireguard есть немало прекрасного, включая его простоту реализации, скорость и минималистичные клиенты, которые не вызывают проблем у пользователей.

В начале августа некоторые интернет операторы и провайдеры начали блокировку протокола WireGuard в РФ по его рукопожатию.

Лично испытывал блокировку у Мегафон и Теле2, но не заметил у Ростелеком. VPN по-прежнему работал через последнего.

Очень не хотелось отказываться от Wireguard в пользу прокси-серверов в духе VLESS+TLS-Vision, в виду того, что все наши пользователи уже сильно привыкли именно к Wireguard.
Поэтому вариант с кардинальной сменой клиентского софта не рассматривался.

Поскольку трафик Wireguard блокируется только на зарубежные адреса было принято решение добавить еще один хоп в систему, а начальное подключение осуществлять к серверу в РФ.

Пользователь → Wireguard РФ → обфускатор в РФ → обфускатор в EU → Internet

В качестве обфускатора выбран shadowsocks. Причём с AED шифрованием. Оно уже детектируется GFW (https://en.wikipedia.org/wiki/Great_Firewall), но еще не детектируется у нас. Этот выбор позволит нам всё сильно упростить.

На сервере в EU ставим shadowsocks

apt update
apt install shadowsocks-libev

Редактируем /etc/shadowsocks-libev/config.json

{
    "server":["0.0.0.0"],
    "mode":"tcp_and_udp",
    "server_port":8443,
    "password":"YourPassword",
    "timeout":86400,
    "method":"chacha20-ietf-poly1305"
}

Конфиг говорит, что SOCKS5 сервер будет слушать порт 8443 по TCP/UDP с заданным метод шифрования и паролем.

Разрешаем коннект только с нашего российского сервера. Делаю через nftables sets

table inet filter {
	set ALLOWED_SPROXY {
	    type ipv4_addr;
	    elements = { 195.0.0.356 }
	}
	
	chain input {
		...
		ip saddr @ALLOWED_SPROXY counter udp dport 8443 accept comment "SPROXY"
	        ip saddr @ALLOWED_SPROXY counter tcp dport 8443 accept comment "SPROXY"
		...
	}

	...
}

Запуск

systemctl enable --now shadowsocks-libev

Проверим, что порт слушается

ss -nltu 'sport = 8443'

Переходим к серверу в РФ.

Считаем, что Wireguard у нас уже поднят на сервере. На нём не останавливаемся.

Поскольку shadowsocks это прокси, а нам нужно маршрутизировать весь трафик из РФ в EU, то нам нужен сетевой интерфейс на сервере, который будет перенаправлять трафик в shadowsocks.

Из коробки shadowsocks может либо слушать порт без SOCKS и отправлять его дальше (ss-tunnel), либо слушать socks сразу на хосте (ss-local). Оба варианта не подходят, т.к. ни один из них не создаёт интерфейс.

Поэтому мы ставим tun2socks.

https://github.com/xjasonlyu/tun2socks

Он будет использовать tun-интерфейс, с которого уже отправит трафик в shadowsocks в EU.

Я собрал из исходников

go install github.com/xjasonlyu/tun2socks/v2@latest

Но можно скачать и готовый бинарный файл.

В tun-интерфейс будет маршрутизироваться весь трафик, кроме трафика на сервер в EU и трафика localhost.

tun2socks умеет работать с протоколом shadowsocks, т.к. использует go-shadowsocks2-core, что очень удобно. Нам не придется ставить shadowsocks на сервер в РФ.

https://github.com/xjasonlyu/tun2socks/blob/main/proxy/shadowsocks.go#L9C2-L9C44

На сервере в РФ нужно поменять маршрутизацию.

  • Нужно будет добавить новый шлюз по умолчанию через tun0

  • Сделать исключение для IP сервера в EU

  • Старому шлюзу по умолчанию нужно будет повысить метрику

То есть в итоге у нас будет два шлюза по умолчанию. Если по какой-либо причине tun отвалится, то сервер будет доступен.

Как добавить именно tun/tap (не tunnel) интерфейс в netplan, я не нашёл. Поэтому интерфейс и маршруты прописываю в хуки systemd unit. Подразумевается, что интерфейс сервера это ens3. IP адрес tun0 роли не играет.

[Unit]
Description=Tun2Socks
After=network.target

[Service]
Type=simple
User=root
EnvironmentFile=/etc/default/tun2socks
ExecStartPre=-ip tuntap add mode tun dev tun0
ExecStartPre=ip addr add 192.168.0.33/24 dev tun0
ExecStartPre=ip link set dev tun0 up
ExecStart=tun2socks -device tun://tun0 -proxy ss://chacha20-ietf-poly1305:${SSPASSWORD}@${SSIP}:${SSPORT}
ExecStartPost=bash -c 'MIP=$(ip r l |grep "default via" | cut -f3 -d" "); ip r del default dev ens3; ip r add default via $MIP dev ens3 metric 200'
ExecStartPost=ip r add default dev tun0 metric 50
ExecStartPost=ip r add ${SSIP}/32 dev ens3
ExecStopPost=-ip link set dev tun0 down
ExecStopPost=-ip link del dev tun0
ExecStopPost=-ip r del ${SSIP}/32 dev ens3

[Install]
WantedBy=multi-user.target

В /etc/default/tun2socks находятся реквизиты подключения в серверу в EU

SSIP=195.0.0.357
SSPORT=8443
SSPASSWORD=YourPassword

Запуск

systemctl enable --now tun2socks

Сетевая задержка между серверами колеблется в районе 25-30ms, что не так уж и плохо.

Итоговая скорость хорошая, клиенты довольны.

Рассчитываем, что с этим можно жить еще минимум пару-тройку лет не беспокоясь об усилении лютости DPI провайдеров.

В дальнейшем между перед shadowsocks планирую установить HaProxy для более гибкой балансировки на несколько узлов зарубежных VPN, а также для повышения отказоустойчивости. Но пока с текущей базой пользователей этот шаг выглядит избыточным.

Комментарии (20)


  1. SignFinder
    12.09.2023 06:33
    +6

    Shadowsocks-libev выглядит заброшенным (последний релиз был в 2020), в отличие от Rust порта https://github.com/shadowsocks/shadowsocks-rust


  1. robertd
    12.09.2023 06:33
    -2

    В РФ vps разве не по паспорту?


    1. 13werwolf13
      12.09.2023 06:33
      +2

      1) зависит от хостера
      2) а не пофиг ли?


      1. s207883
        12.09.2023 06:33

        Брал у рег.ру и ещё нескольких. Ничего не спросили.


  1. kuraga333
    12.09.2023 06:33

    Спасибо за материал!

    А кто-то понимает, белый список протоколов там используется или чёрный? Если "испортить" (например, XOR-нуть) payload Ethernet-фрейма, пропустят или заблокируется?


  1. aborouhin
    12.09.2023 06:33
    +1

    У меня у самого так давно уже настроено (VPN-сервер в РФ отдельно, каналы за рубеж отдельно), и пока, тьфу-тьфу-тьфу, работает, но вот только новости про учения по блокировке VPN как-то не позволяют разделить Ваш оптимизм, что блокироваться будет только на зарубежные адреса. Были отчёты, что и внутри России блокировалось. Понимаю, что это бред полный и, возможно, не желаемый эффект, а побочные последствия реализации задачи отдельными провайдерами, - но от этого не легче.

    А менять софт пользователям, учитывая что они удалённые и технически не продвинутые, и правда, сильно не хотелось бы, это да.


    1. nevzorofff
      12.09.2023 06:33
      +1

      Внутри РФ... у меня внутри пары BRAS, стоящих в одной серверной, отваливался IPsec, а уж внутри РФ регулярно, благо эти эксперименты с ТСПУ на выходных проводят


    1. GuardCat
      12.09.2023 06:33

      Я задавал вопрос РКН и получил оф. ответ, что внутри страны wg не блокируется и таких планов нет.


  1. inscriptios
    12.09.2023 06:33
    +1

    Сохраняю в PDF пока можно. Если будет нужно - пишите, пришлю на почту.

    P.S. Вообще шучу, но не смешно.


    1. Andrey001
      12.09.2023 06:33
      +1

      Коллега, как Вы планируете из pdf выполнять команды apt install shadowsocks-libev или go install github.com/xjasonlyu/tun2socks/v2@latest?

      Это тоже шутка, но не шутка)


      1. inscriptios
        12.09.2023 06:33
        +1

        Коллега, также как и вы планируете это делать из статьи на Хабре) Речь шла про сохранение статьи в PDF в связи с грядущими изменениями в полномочиях некоторых исполнительных органов, которые позволят этим органам блокировать сайты или отдельные ресурсы, содержащие информацию, как в этой статье)


        1. Andrey001
          12.09.2023 06:33

          Это я к тому, что современный подход в unix мире строится на инструкциях с использованием репозиториев. Если github будет недоступен или репозитории дистрибутивов, то эта инструкция становится тыквой для человека неподготовленного


          1. inscriptios
            12.09.2023 06:33

            Про запрет GitHub думать не хочется, но при таком подходе когда-то может и дойти.


  1. Lerpi
    12.09.2023 06:33
    +1

    У меня на работе обращались сотрудники, у которых проводной российский провайдер блочил openvpn пакеты до российского сервера. Пришлось через мобильный интернет временно им работать.


  1. xxx202
    12.09.2023 06:33
    +2

    При недавних блокировках замечал, что до адресов внутри РФ тоже блокировали WG и openvpn. Сервер в квартире в РФ (Билайн +статический IP), клиент в РФ (ростелеком), пару раз падало, но по sstp работало (резервный). Клиент андроид тоже в РФ - через билайн не подключался, через теле2 работало. С ноутбука поднимался sstp через тот же самой андроид в роли точки доступа на обоих операторах. Мне показалось, что там от балды блокируют и не смотрят принадлежность адреса к РФ или вне РФ.


  1. xkb45bkc4
    12.09.2023 06:33
    +2

    начале августа некоторые интернет операторы и провайдеры начали блокировку протокола WireGuard в РФ по его рукопожатию.

    Какая блять брехня. Город Горловка, Донецкая область — у нас не то что ваер гуард не работает, у нас провайдеры гугл поиск блочат.
    Вот минусуйте сколько влезет, но это факт.
    Давайте Роскомнадзор, скажи почему у меня гулы заблокированы, в нарушение всех законов РФ???


  1. KyJIep-79
    12.09.2023 06:33

    Сделал по вашей инструкции, при запуске получаю ошибку, systemctl status tun2socks.service показывает:

    failed to start: parse "ss://chacha20-ietf-poly1305:xYzAbCqwerty123456789=@99.99.99.99:9999": invalid port ":xYzAbCqwert" after host"

    Я могу ошибаться, т.к. в этом почти ноль, но думаю, что неверно написана строка ExecStart в юните. Подскажите, пожалуйста, как это исправить.


    1. am83 Автор
      12.09.2023 06:33

      Я по правде не смог это воспроизвести, попытался на Ubuntu 18 даже.

      tun2socks использует стандартную библиотеку "url" (url.Parse) для разбора этой строки
      "ss://chacha20-ietf-poly1305:xYzAbCqwerty123456789=@99.99.99.99:9999"

      и ошибку "invalid port" отдаёт именно эта библиотека.

      Попробую еще поэксперементировать


      1. KyJIep-79
        12.09.2023 06:33

        Похоже дело было в спецсимволах, содержащихся в пароле shadowsocks. Убрал их. Теперь при запуске tun2socks отваливается ssh, и чёрт знает что там дальше происходит, но и клиент wireguard не может установить связь со своим сервером на этом vps. Помогает перезагрузка vps из панели хостера. Благо я не добавил службу tun2socks в автозапуск.


      1. KyJIep-79
        12.09.2023 06:33

        В принципе я не удивлён, что ssh отваливается. Но как его вернуть, не перезагружая сервер, или как сделать чтобы он не отваливался и всё работало? Может у меня в Ubuntu 20.04 чего-то не хватает?

        И вопрос вдогонку: а в postup и postdown скриптах в конфиге wireguard сервера ничего менять не надо? Например интерфейс ens3 на tun0?

        VPS не боевой, резервный, экспериментировать не боюсь.