В данной статье рассмотрим как:

  • Настроить обход блокировок с помощью Trojan TCP, tun2socks и bird2 (BGP) на устройствах с 8 Мб ПЗУ и 64 ОЗУ (8/64)

  • настроить существующее подключение к OpenVPN серверу, которое могло или может перестать работать, через Trojan TCP туннель (Websocket этой реализацией не поддерживается)

  • Собрать прошивку с Trojan, kmod-tun, zram и bird2 на базе OpenWRT 21.02.7 для устройств с 8/64 (более новые версии (>22.03) занимают больше места и этот набор пакетов уже не поместится в 8 Мб)

Понадобятся:

  • Существующий сервер OpenVPN и настроенный клиент на OpenWRT

  • Конфиг Trojan вашего либо чужого сервера. (О том как настроить свой сервер и где искать сервера расскажу в статье)

  • Сервер, ПК или виртуальная машина с Linux для сборки прошивки

Оглавление:

  • 1.Сборка прошивки на базе OpenWRT 21.02.7 (не нужно для устройств с 16 Мб памяти)

    2. Настройка туннеля Trojan

    3. 1. Настройка tun2socks и обхода блокировок с помощью BGP (bird2)

    3. 2. Настройка клиента OpenVPN через Trojan TCP

Целью данной статьи было найти способ (способы) который подходил бы для большинства устройств на OpenWRT и давал бы некий запас прочности по устойчивости к блокировкам, (shadowsocks старой версии уже в явной зоне риска к сожалению). Этой цели будет посвящена эта и несколько последующих статей, сконцентрированы они в первую очередь на устройствах с 8/64, 16/64 и 16/128 (ПЗУ/ОЗУ) конфигурациях памяти. Решения для устройств с количеством памяти подробно описаны в моих предыдущих статьях и статьях коллег по цеху.

1. Сборка прошивки для 8/64 на базе OpenWRT 21.02.7

Владельцы устройств с ПЗУ 16Мб и имеющие свободные 3Мб памяти могут пропустить этот пункт (и использовать в т.ч. и версию 23.05) и перейти к п.2

Проблемой устройств 8/64 является слишком ограниченное свободное место в ПЗУ из-за чего необходимые пакеты невозможно установить через opkg из-за чего единственным способом собрать вместе необходимые пакеты является сборка прошивки через OpenWRT Buildroot

Подробно сборка описана в wiki проекта openwrt.org, я опишу только необходимые шаги для сборки.

Моя среда сборки это виртуальная машина Debian 11 в VirtualBox, рекомендуется не менее 10 Гб свободного места на диске и не менее 4 Гб RAM

Устанавливаем необходимые для сборки пакеты:

sudo apt install binutils bzip2 diffutils flex libc-dev libz-dev perl python3.7 rsync subversion unzip ncurses-dev git-core build-essential libssl-dev libncurses5-dev gawk zlib1g-dev subversion mercurial

Далее скачиваем исходный код OpenWRT версии 21.02.7

git clone https://github.com/openwrt/openwrt.git -b v21.02.7

Добавляем репозитории и обновляем списки:

cd openwrt
echo -e "src-git small https://github.com/kenzok8/small \nsrc-git kenzo https://github.com/kenzok8/openwrt-packages" >> feeds.conf.default
./scripts/feeds update -a
./scripts/feeds install -a

Далее OpenWrt проверит отсутствующие пакеты в вашей системе сборки и предложит выбрать архитектуру вашего устройства и модель, а также пакеты для сборки.

make menuconfig

В меню необходимо выбрать ваше устройство и сохранить конфигурацию (кнопка Save).

В сборку необходимо добавить пакеты:

  1. luci (Web-интерфейс надстройка для OpenWRT)

  2. kmod-tun (TUN модуль ядра)

  3. zram-swap (создаёт в оперативной памяти сжатое блочное устройство (другими словами, RAM-диск со сжатием данных "на лету")

  4. bird2c (для использования BGP для получения маршрутов от antifilter.downloadantifilter.network)

    и использовать параметры уменьшения размера прошивки (sstrip)

Это можно сделать при помощи конфигуратора либо следующей командой:

echo -e "CONFIG_USE_MKLIBS=y \nCONFIG_STRIP_KERNEL_EXPORTS=y \nCONFIG_KERNEL_PROC_STRIPPED=y \nCONFIG_PACKAGE_luci=y \nCONFIG_PACKAGE_zram-swap=y \nCONFIG_PACKAGE_bird2c=y \nCONFIG_PACKAGE_kmod-tun=y" >> .config

после чего повторно запустить проверку:

make menuconfig

Убедиться что устройство выбрано правильно и настройки не потеряны и сохранить конфигурацию повторно (Save).

После чего запускаем сборку образа (на 8 потоках):

make -j9

Команда запускает сборку на 8 потоках (ядрах) (8+1), можете ввести нужное вам количество вместо -j9 (например -j5 для сборки на 4 потоках)

Ждём окончания сборки (около 1 часа), после чего скачиваем файлы из папки ~/openwrt/bin/targets/$платформа/$архитектура/

Для обновления существующей прошивки OpenWRT понадобится файл оканчивающийся на *-sysupgrade.bin

После чего заходим в интерфейс вашего роутера, переходим в Система - Восстановление/обновление

И загружаем собранный образ, галку сохранить настройки убрать (можно настройки сохранить, но возможно проблемы, не рекомендую).

В случае вашего роутера могут быть отличия по способу прошивки, рекомендую посетить тему по вашему устройству на сайте OpenWRT [OpenWrt Wiki] Table of Hardware дабы случайно не получить кирпич вместо роутера.

Ждём окончания обновления роутера.

Далее потребуется первичная настройка роутера, необходимо обеспечить подключение к интернету согласно настройкам вашего провайдера.

Разобравшись с интернетом, переходим к пункту 2.

2.Настройка туннеля Trojan

Владельцы устройств с 16Мб ПЗУ пропустившие предыдущий пункт должны установить пакет trojan:

Для этого сначала необходимо добавить репозиторий:

sed -i 's/option check_signature/# option check_signature/g' /etc/opkg.conf
echo "src/gz custom_generic https://raw.githubusercontent.com/lrdrdn/my-opkg-repo/main/generic" >> /etc/opkg/customfeeds.conf
echo "src/gz custom_arch https://raw.githubusercontent.com/lrdrdn/my-opkg-repo/main/$(grep "OPENWRT_ARCH" /etc/os-release | awk -F '"' '{print $2}')" >> /etc/opkg/customfeeds.conf

И установить пакет:

opkg update
opkg install trojan

Далее общие инструкции:

необходимо создать конфигурацию Trojan TCP:

Редактируем файл /etc/config/trojan.json

{
  "run_type": "client",
  "local_addr": "127.0.0.1",
  "local_port": 1080,
  "remote_addr": "АДРЕС ИЛИ IP СЕРВЕРА TROJAN TCP",
  "remote_port": ПОРТ СЕРВЕРА,
  "password": [
    "ПАРОЛЬ СЕРВЕРА"
  ],
  "log_level": 1,
  "ssl": {
    "verify": true,
    "verify_hostname": true,
    "cert": "",
    "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA",
    "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
    "sni": "",
    "alpn": [
      "h2",
      "http/1.1"
    ],
    "reuse_session": true,
    "session_ticket": false,
    "curves": ""
  },
  "tcp": {
    "no_delay": true,
    "keep_alive": true,
    "reuse_port": false,
    "fast_open": false,
    "fast_open_qlen": 20
  }
}

"run_type": "client" - Согласно документации проекта
"local_addr": "127.0.0.1"
- На каком адресе слушает socks5 сервер
"local_port": 1080 -
На каком порту слушает socks5 сервер
"remote_addr": "АДРЕС ИЛИ IP СЕРВЕРА TROJAN TCP"
- Адрес сервера Trojan TCP
"remote_port": ПОРТ СЕРВЕРА
"password": [
"ПАРОЛЬ СЕРВЕРА"

Данные об адресе сервера, порте подключения и пароле можно получить из ссылки формата

trojan://PASSWORD@HOSTNAME:PORT#LUTrojan28TLS%29

Для настройки собственного сервера c Trojan TCP можно воспользоваться инструкциями Раз, Два, и Три . Также в т.ч. и на Хабре есть компании предоставляющие услуги VPN и Прокси, включая Trojan TCP.

Далее создаём службу автозапуска:

Редактируем файл /etc/init.d/trojan:

#!/bin/sh /etc/rc.common
USE_PROCD=1

# starts after network starts
START=72
# stops before networking stops
STOP=72

PROG=/usr/sbin/trojan
CONFIG="/etc/config/trojan.json"


start_service() {
  procd_open_instance
  procd_set_param user root
  procd_set_param command "$PROG" -c "$CONFIG"
  procd_set_param stdout 1
  procd_set_param stderr 1
  procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
  procd_close_instance
    echo "Trojan TCP daemon is working!"
}

start() {
    start_service
}
boot() {
    # This gets run at boot-time.
    start
}

shutdown() {
    # This gets run at shutdown/reboot.
    stop
}

stop_service() {
    service_stop "$PROG"
    echo "Trojan TCP daemon has stopped!"
}

reload_service() {
    stop
    sleep 3s
    echo "Trojan TCP daemon restarted!"
    start
}

Сохраняем файл.

Задаем права запуска:

chmod +x /etc/init.d/trojan

Добавляем службу в автозапуск с порядковым номером 72:

ln -s /etc/init.d/trojan /etc/rc.d/S72trojan

Теперь служба подключения к серверу Trojan будет запускаться вместе с роутером.

Далее необходимо добавить статический маршрут к серверу Trojan:

Переходим в Сеть - Статические маршруты

И добавляем маршрут до вашего сервера, не забываем указать ваш шлюз по умолчанию (можно посмотреть на странице Состояние или командой route).

Не забываем проверить доступность сервера после добавления маршрута:

ping $Ваш_Сервер__TROJAN

Теперь можем запустить службу Trojan:

/etc/init.d/trojan start

3.1 Настройка tun2socks и обхода блокировок с помощью BGP

Далее настроим tun2socks (требует установленного пакета kmod-tun) для создания интерфейса в системе в который будет направляться трафик, бинарный файл tun2socks занимает 9Мб, поэтому будем использовать установку в ОЗУ и скачивание при запуске системы.

Создаём службу tun2socks:

Редактируем файл /etc/init.d/tun2socks:

#!/bin/sh /etc/rc.common
USE_PROCD=1

# starts after network starts
START=99
# stops before networking stops
STOP=89

PROG=/tmp/tun2socks
IF="tun2"
LOGLEVEL="warning"
HOST="127.0.0.1"
PORT="1080"
#ARCH=$(grep "OPENWRT_ARCH" /etc/os-release | awk -F '"' '{print $2}')

#Check for tun2socks then download tun2socks binary from Sourceforge to RAM
before_start() {
if [ ! -f "/tmp/tun2socks*" ]; then
  ARCH=$(grep "OPENWRT_ARCH" /etc/os-release | awk -F '"' '{print $2}')
  wget https://master.dl.sourceforge.net/project/outline-install-wrt/v2.5.1/tun2socks-linux-$ARCH?viasf=1 -O /tmp/tun2socks
 # Check wget's exit status
    if [ 0 -ne 0 ]; then
        echo "Download failed. No file for your Router's architecture"
        exit 1
   fi
fi
#Executing chmod +x command
chmod +x /tmp/tun2socks
}

start_service() {
    before_start
    procd_open_instance
    procd_set_param user root
    procd_set_param command "$PROG" -device "$IF"  -proxy "$HOST":"$PORT" -loglevel "$LOGLEVEL"
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
    procd_close_instance
    echo "tun2socks is working!"
}

boot() {
    # This gets run at boot-time.
    start
}

shutdown() {
    # This gets run at shutdown/reboot.
    stop
}

stop_service() {
    service_stop "$PROG"
    echo "tun2socks has stopped!"
}

reload_service() {
    stop
    sleep 3s
    echo "tun2socks restarted!"
    start
}
start() {
    before_start
    start_service
}

Данная служба при каждом запуске проверяем наличие файла /tmp/tun2socks и при его отсутствии скачивает его, после чего запускает интерфейс tun2 c прокси 127.0.0.1:1080 (параметры прописаны в переменных IF="tun2", HOST="127.0.0.1", PORT="1080").

Разрешаем права запуска службы:

chmod +x /etc/init.d/tun2socks

Добавляем службу в автозапуск с порядковым номером 99:

ln -s /etc/init.d/tun2socks /etc/rc.d/S99tun2socks

Теперь tun2socks будет запускаться вместе с роутером, но после запуска службы Trojan.

Согласно документации tun2socks рекомендуется присвоить интерфейсу ip адрес (на практике маршрутизация работает и перенаправлением в dev tun2).

Для этого в /etc/config/network добавим следующее содержание:

config interface 'tunnel'
        option device 'tun2'
        option proto 'static'
        option ipaddr '172.16.10.1'
        option netmask '255.255.255.252'

Диапазон 172.16.10.0/30 выбран случайно, может быть любой диапазон частных адресов.

Так же создаём зону и правило в /etc/config/firewall

config zone
        option name 'proxy'
        option forward 'REJECT'
        option output 'ACCEPT'
        option input 'REJECT'
        option masq '1'
        option mtu_fix '1'
        option device 'tun2'
        option family 'ipv4'
config forwarding
option name 'lan-proxy'
option dest 'proxy'
option src 'lan'
option family 'ipv4'

Перезагружаем сеть:

/etc/init.d/network restart

Далее запускаем службу tun2socks:

/etc/init.d/tun2socks start

Далее необходимо настроить обход блокировок по спискам адресов с помощью bird2, для этого есть отличная статья @itdog Точечный обход блокировок на роутере OpenWrt c помощью BGP / Хабр (habr.com), после чего процесс настройки окончен. Для использования списков BGP antifilter.network используйте IP-адрес 51.75.66.20, номер автономной системы 65444.

3.2 Настройка клиента OpenVPN через Trojan TCP

Если вы используете OpenVPN для обхода блокировок и не хотели бы лишних действий с настройкой tun2socks вы можете проксировать OpenVPN через Trojan TCP:

переходим во вкладку VPN - OpenVPN

Вносим изменения в текущую конфигурацию:

После строки remote, добавляем на новой строке запись socks-proxy 127.0.0.1 1080.

Теперь OpenVPN клиент будет подключаться к серверу через socks5 прокси который мы настроили ранее.

Сохраняем.

Перезапускаем соединение двойным нажатием кнопки Start/Stop.

Проверяем работу OpenVPN.

Послесловие

Для устройств 8/64 мною было найдено не так много вариантов умещающихся в память устройства и устойчивых к блокировкам, это:

  • Связка shadowsocks-libev + kcptun-client

  • Собственно trojan

  • ShadowsocksR-libev

  • trojan-plus - форк trojan с некоторыми дополнительными фичами

Для устройств 16/64 выбор значительно больше, чему и планирую посвятить следующие статьи.

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


  1. aborouhin
    15.12.2023 12:55

    А производительность этого решения какова? А то я на гораздо более шустрых Микротиках (128/1024, да и CPU пободрее) сначала потратил кучу времени на тестирование разных стойких к блокировкам протоколов в контейнерах, - а в итоге протестировал максимальную скорость, прослезился и прикрутил к этим микротам Orange Pi, на которых уже подняты экзотические туннели.


    1. decompressor
      15.12.2023 12:55

      а можно модель апельсина, что дало норм производительность с xray/ss2022?openwrt как операционка? даже hap ax3 не очень что-то:(


      1. aborouhin
        15.12.2023 12:55

        del


      1. aborouhin
        15.12.2023 12:55

        Orange Pi 5, Armbian, amnezia-wg по тесту iperf3 выдаёт 455 Мбит/с, в момент теста одно из 4 ядер апельсинки грузится максимум до 65%, остальные не более 25%. Та же amnezia-wg в контейнере на Mikrotik RB3011 упиралась в CPU уже на ~30 Мбит/с.

        XRay / SS2022 в планах нет, т.к. нужен полноценный VPN, есть в планах WG через Cloak, как запущу - дополню комментарий.

        P.S. Если кто успел прочитать первый комментарий про 770 Мбит/с - это я ступил, iperf3 через другой интерфейс до апельсинки достучался :) Но 455 меня тоже вполне устраивает.

        P.P.S. По-быстрому запустил на той же апельсинке Amnezia-WG поверх Cloak (понятно, что через Cloak достаточно и обычного WG, но подружить обычный и Amnezia на одной машине заняло бы некоторое время).

        Результат - 185 Мбит/с, загрузка первого/остальных ядер апельсинки - в пределах 85%/50% соответственно. Уже не так радужно, но приемлемо, и с обычным WG должно получиться ещё немного повеселее.


        1. aborouhin
          15.12.2023 12:55

          Ну и обычный WG через Cloak - те же 185 Мбит/с, что у Amnezia-WG через Cloak, но загрузка CPU апельсинки чуть меньше - в пределах 80%/40% для первого/остальных ядер. В общем, существенной разницы нет, можно оставлять одну Амнезию для простоты настройки.

          Всё, тесты закончил :)


    1. viktorf3ss
      15.12.2023 12:55

      Поделитесь топ 3 решениями в плане скорости?


      1. aborouhin
        15.12.2023 12:55

        Вряд ли, у меня нет задачи сравнить совершенно все решения, т.к. моим потребностям удовлетворяет небольшая часть (те, которые дают полноценный VPN для связи сетей за обеими сторонами тоннеля). Сейчас это Amnezia-WG, Cloak, через который проброшен обычный WG, и OpenConnect. На роутерах мне интересны первые два, а OpenConnect для мобильных клиентов.


    1. brugger
      15.12.2023 12:55

      Можно подробнее о вариантах вашего решения? Думаю ,будет полезно. Многим.


      1. aborouhin
        15.12.2023 12:55

        Цепляем апельсинку к одному из портов микрота. Настраиваем на этом порту три VLAN - management, in и out, для каждого своя подсеть (management у меня в bridge с другими сетями для управления, но это уже детали). Через management ходим по ssh, через in маршрутизируем с микрота через апельсинку трафик, который должен идти через VPN, через out апельсинка получает доступ к другому концу тоннеля через микрот. Наверное, можно и без VLAN'ов, но мне так понятнее, чтобы не запутаться.

        Потом на это всё натягиваем динамическую маршрутизацию на OSPF и BGP, но тут рассказывать долго, сложно и всё равно у всех разные потребности. Да и у меня там пока есть несколько недоделанных моментов.

        После этого меняем на апельсинке VPN хоть каждую неделю в зависимости от успехов РКН, не трогая настройки микрота вообще.


  1. php7
    15.12.2023 12:55

    Я вот чет не доверяю программе с названием Trojan


    1. AcckiyGerman
      15.12.2023 12:55

      А Shadow Socks (теневые носки?)