В данной статье рассмотрим как:
Настроить обход блокировок с помощью 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).
В сборку необходимо добавить пакеты:
luci (Web-интерфейс надстройка для OpenWRT)
kmod-tun (TUN модуль ядра)
zram-swap (создаёт в оперативной памяти сжатое блочное устройство (другими словами, RAM-диск со сжатием данных "на лету")
-
bird2c (для использования BGP для получения маршрутов от antifilter.download, antifilter.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" -
Согласно документации проекта
- На каком адресе слушает socks5 сервер
"local_addr": "127.0.0.1"
На каком порту слушает socks5 сервер
"local_port": 1080 -
- Адрес сервера Trojan TCP
"remote_addr": "АДРЕС ИЛИ IP СЕРВЕРА 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 выбор значительно больше, чему и планирую посвятить следующие статьи.
aborouhin
А производительность этого решения какова? А то я на гораздо более шустрых Микротиках (128/1024, да и CPU пободрее) сначала потратил кучу времени на тестирование разных стойких к блокировкам протоколов в контейнерах, - а в итоге протестировал максимальную скорость, прослезился и прикрутил к этим микротам Orange Pi, на которых уже подняты экзотические туннели.
decompressor
а можно модель апельсина, что дало норм производительность с xray/ss2022?openwrt как операционка? даже hap ax3 не очень что-то:(
aborouhin
del
aborouhin
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 должно получиться ещё немного повеселее.
aborouhin
Ну и обычный WG через Cloak - те же 185 Мбит/с, что у Amnezia-WG через Cloak, но загрузка CPU апельсинки чуть меньше - в пределах 80%/40% для первого/остальных ядер. В общем, существенной разницы нет, можно оставлять одну Амнезию для простоты настройки.
Всё, тесты закончил :)
viktorf3ss
Поделитесь топ 3 решениями в плане скорости?
aborouhin
Вряд ли, у меня нет задачи сравнить совершенно все решения, т.к. моим потребностям удовлетворяет небольшая часть (те, которые дают полноценный VPN для связи сетей за обеими сторонами тоннеля). Сейчас это Amnezia-WG, Cloak, через который проброшен обычный WG, и OpenConnect. На роутерах мне интересны первые два, а OpenConnect для мобильных клиентов.
brugger
Можно подробнее о вариантах вашего решения? Думаю ,будет полезно. Многим.
aborouhin
Цепляем апельсинку к одному из портов микрота. Настраиваем на этом порту три VLAN - management, in и out, для каждого своя подсеть (management у меня в bridge с другими сетями для управления, но это уже детали). Через management ходим по ssh, через in маршрутизируем с микрота через апельсинку трафик, который должен идти через VPN, через out апельсинка получает доступ к другому концу тоннеля через микрот. Наверное, можно и без VLAN'ов, но мне так понятнее, чтобы не запутаться.
Потом на это всё натягиваем динамическую маршрутизацию на OSPF и BGP, но тут рассказывать долго, сложно и всё равно у всех разные потребности. Да и у меня там пока есть несколько недоделанных моментов.
После этого меняем на апельсинке VPN хоть каждую неделю в зависимости от успехов РКН, не трогая настройки микрота вообще.