Собственно сразу к делу, понадобится любая версия OpenWRT (проверялось на 19.07, 21.02, 22.03 и 23.05-rc1) и установленные пакеты kmod-tun и ip-full, а так же настроенный сервер Outline (shadowsocks).
Рекомендую роутер не меньше чем с 128 Мб ОЗУ, будут показаны варианты установки в ПЗУ и ОЗУ.
Использоваться будет пакет xjasonlyu/tun2socks.
Установка
Скачаем скрипт в ОЗУ и дадим права на запуск:
cd /tmp wget https://raw.githubusercontent.com/1andrevich/outline-install-wrt/main/install_outline.sh -O install_outline.sh chmod +x install_outline.sh
Проверьте что у вас установлены kmod-tun and ip-full, если нет, запустите:
opkg update opkg install kmod-tun ip-full
Далее запускаем скрипт: (вам понадобится около 9 Мб свободной памяти роутера)
./install_outline.sh
Скрипт запросит:
IP адрес вашего Сервера Outline (shadowsocks)
Outline (Shadowsocks) конфиг в формате "ss://base64coded@IP:ПОРТ" (копируем и вставляем из Outline Manager)
Хотите ли вы использовать Outline (shadowsocks) как шлюз по умолчанию (y/n)
Что делает скрипт:
Проверит наличие пакетов kmod-tun, ip-full
Cкачает tun2socks для вашего роутера (если пакет есть в репозитории)
Перенесёт файл в ПЗУ
Создаст необходимые записи в /etc/config/network и /etc/config/firewall
Перезагрузит сеть
Попросит ввести данные для настройки
Проверит и сохранит текущий маршрут по умолчанию
Создаст скрипт запуска /etc/init.d/tun2socks и добавит его в автозапуск
Установка в ОЗУ
Если у вас доступно меньше 9 Мб в ПЗУ, но есть желание установить клиент (и свободно минимум 35Мб ОЗУ), тогда:
Проверьте что установлены пакеты kmod-tun и ip-full
Запустите команды:
cd /tmp wget https://raw.githubusercontent.com/1andrevich/outline-install-wrt/main/install_outline_ram.sh -O install_outline_ram.sh chmod +x install_outline_ram.sh ./install_outline_ram.sh
Что делает скрипт:
Проверит наличие пакетов kmod-tun, ip-full
Cкачает tun2socks для вашего роутера (если пакет есть в репозитории)
Создаст необходимые записи в /etc/config/network и /etc/config/firewall
Перезагрузит сеть
Попросит ввести данные для настройки
Проверит и сохранит текущий маршрут по умолчанию
Создаст скрипт запуска /etc/init.d/tun2socks и добавит его в автозапуск (и будет скачивать пакет tun2socks после каждой перезагрузки устройства)
Для остановки туннеля до перезапуска:
Система - Автозапуск и Остановить напротив tun2socks

или:
/etc/init.d/tun2socks stop
Для удаления службы из автозапуска:
Система - Автозапуск и Включено напротив tun2socks, после нажатия Включено изменится на Отключено
или:
rm /etc/rc.d/S99tun2socks
На этом инструкция закончена.
Далее часть посвящена разбору скрипта и возможному устранению проблем.
Разбор скрипта
Для возможного устранения проблем
install_outline.sh по частям:
# Step 1: Проверяет наличие kmod-tun, скрипт прекращается если не установлен opkg list-installed | grep kmod-tun > /dev/null if [ $? -ne 0 ]; then echo "kmod-tun is not installed. Exiting." exit 1 echo 'kmod-tun installed' fi
Тоже самое Step 2, для ip-full
# Step 2: Check for ip-full opkg list-installed | grep ip-full > /dev/null if [ $? -ne 0 ]; then echo "ip-full is not installed. Exiting." exit 1 echo 'ip-full installed' fi
# Step 3: Проверяет наличие tun2socks если нет, то качает tun2socks с GitHub if [ ! -f "/tmp/tun2socks*" ]; then ARCH=$(grep "OPENWRT_ARCH" /etc/os-release | awk -F '"' '{print $2}') #Определяет архитектуру устройства wget https://github.com/1andrevich/outline-install-wrt/releases/download/v2.5.1/tun2socks-linux-$ARCH -O /tmp/tun2socks #Качает нужный файл # Check wget's exit status if [ $? -ne 0 ]; then echo "Download failed. No file for your Router's architecture" #Это значит что загрузка не удалась и выполнение скрипта будет прекращено exit 1 fi fi
# Step 4: Проверка наличия tun2socks и перенос его в /usr/bin if [ ! -f "/usr/bin/tun2socks" ]; then mv /tmp/tun2socks /usr/bin/ echo 'moving tun2socks to /usr/bin' chmod +x /usr/bin/tun2socks fi
# Step 5: Проверка наличия конфигурации в /etc/config/network если нет, тогда добавить if ! grep -q "config interface 'tunnel'" /etc/config/network; then echo " config interface 'tunnel' option device 'tun1' option proto 'static' option ipaddr '172.16.10.1' #Адрес роутера option netmask '255.255.255.252' #Подсеть из 4 адресов " >> /etc/config/network echo 'added entry into /etc/config/network' fi echo 'found entry into /etc/config/network'
# Step 6:Проверка наличия конфигурации в /etc/config/firewall если нет, тогда добавить if ! grep -q "option name 'proxy'" /etc/config/firewall; then echo " config zone option name 'proxy' list network 'tunnel' option forward 'REJECT' option output 'ACCEPT' option input 'REJECT' option masq '1' option mtu_fix '1' option device 'tun1' option family 'ipv4' config forwarding option name 'lan-proxy' option dest 'proxy' option src 'lan' option family 'ipv4' " >> /etc/config/firewall echo 'added entry into /etc/config/firewall' fi
Step 7 перезапуск сети
# Step 7: Restart network /etc/init.d/network restart echo 'Restarting Network....'
# Step 8: Read user variable for OUTLINE HOST IP read -p "Enter Outline Server IP: " OUTLINEIP #Cохранение IP адреса в переменную # Read user variable for Outline config read -p "Enter Outline (Shadowsocks) Config (format ss://base64coded@HOST:PORT/?outline=1): " OUTLINECONF #Сохранение конфигурации в переменную
Step 9, 10 сохранение маршрута и интерфейса по умолчанию в переменные
#Step 9. Check for default gateway and save it into DEFGW DEFGW=$(ip route | grep default | awk '{print $3}') echo 'checked default gateway' #Step 10. Check for default interface and save it into DEFIF DEFIF=$(ip route | grep default | awk '{print $5}') echo 'checked default interface'
# Step 11: Создание скрипта /etc/init.d/tun2socks if [ ! -f "/etc/init.d/tun2socks" ]; then #Проверка наличия файла cat <<EOL > /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=/usr/bin/tun2socks #IF="tun1" #Интерфейс tun1 для избежания конфликтов с OpenVPN #OUTLINE_CONFIG="$OUTLINECONF" #LOGLEVEL="warning" #Уровень логгирования, только предупреждения и ошибки #BUFFER="64kb" #Размер буфера выбран исходя из вики tun2socks start_service() { procd_open_instance procd_set_param user root procd_set_param command /usr/bin/tun2socks -device tun1 -tcp-rcvbuf 64kb -tcp-sndbuf 64kb -proxy "$OUTLINECONF" -loglevel "warning" 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 ip route add "$OUTLINEIP" via "$DEFGW" #Добавляет маршрут до сервера Outline echo 'route to Outline Server added' ip route save default > /tmp/defroute.save #Сохраняет действующий маршрут по умолчанию echo "tun2socks is working!" } boot() { # This gets run at boot-time. start } shutdown() { # This gets run at shutdown/reboot. stop } stop_service() { service_stop /usr/bin/tun2socks ip route restore default < /tmp/defroute.save #Восстанавливает действующий маршрут по умолчанию ip route del "$OUTLINEIP" via "$DEFGW" #Удаляет маршрут до сервера Outline echo "tun2socks has stopped!" } reload_service() { stop sleep 3s echo "tun2socks restarted!" start } EOL DEFAULT_GATEWAY="" #Спрашивает пользователя о назначении Outline маршрутом по умолчанию while [ "$DEFAULT_GATEWAY" != "y" ] && [ "$DEFAULT_GATEWAY" != "n" ]; do echo "Use Outline as default gateway? [y/n]: " read DEFAULT_GATEWAY done if [ "$DEFAULT_GATEWAY" = "y" ]; then cat <<EOL >> /etc/init.d/tun2socks #Заменяет текущий маршрут по умолчанию на Outline service_started() { # This function checks if the default gateway is Outline, if no changes it echo 'Replacing default gateway for Outline...' sleep 2s if ip link show tun1 | grep -q "UP" ; then ip route del default #Удаляет существующий маршрут по умолчанию ip route add default via 172.16.10.2 dev tun1 #Создает маршрут по умолчанию через прокси fi } start() { start_service service_started } EOL #Проверяет содержимое файла rc.local и добавляем при необходимости в rc.local скрипт для проверки маршрута по умолчанию при запуске if ! grep -q "sleep 20" /etc/rc.local; then sed '/exit 0/i\ sleep 20\ #Проверяет является ли Outline маршрутом по умолчанию или нет\ if ! ip route | grep -q '\''^default via 172.16.10.2 dev tun1'\''; then\ /etc/init.d/tun2socks start\ fi\ ' /etc/rc.local > /tmp/rc.local.tmp && mv /tmp/rc.local.tmp /etc/rc.local echo "All traffic would be routed through Outline" fi else #При выборе нет на вопрос маршрута, запускается этот вариант скрипта cat <<EOL >> /etc/init.d/tun2socks start() { start_service } EOL echo "No changes to default gateway" #Никаких изменений в маршрут по умолчанию fi echo 'script /etc/init.d/tun2socks created' chmod +x /etc/init.d/tun2socks fi
# Step 12: Создание автозапуска if [ ! -f "/etc/rc.d/S99tun2socks" ]; then ln -s /etc/init.d/tun2socks /etc/rc.d/S99tun2socks echo '/etc/init.d/tun2socks /etc/rc.d/S99tun2socks создаётся симлинк указывающий на очередность загрузки' fi # Step 13: Start service /etc/init.d/tun2socks start echo 'Script finished' # Работа скрипта завершена
В случае install_outline_ram.sh в разделе на этапе создания скрипта /etc/init.d/tun2socks есть дополнительная запись в конфигурации:
before_start() { #Перед запуском if [ ! -f "/tmp/tun2socks*" ]; then #Проверка наличия файла tun2socks в ОЗУ ARCH=$(grep "OPENWRT_ARCH" /etc/os-release | awk -F '"' '{print $2}') wget https://github.com/1andrevich/outline-install-wrt/releases/download/v2.5.1/tun2socks-linux-$ARCH -O /tmp/tun2socks #Скачивание файла # Check wget's exit status if [ $? -ne 0 ]; then echo "Download failed. No file for your Router's architecture" exit 1 fi fi . . . start_service() { before_start #Проверка наличия файла перед запуском основного скрипта
За идею и большую часть содержания скрипта хочу поблагодарить пользователя @itdog за его пост https://t.me/itdoginfo/10 так же рекомендую статьи:
Точечный обход блокировок на роутере OpenWrt c помощью BGP / Хабр (habr.com) С помощью BGP (bird2).
Точечный обход блокировок PKH на роутере с OpenWrt с помощью WireGuard и DNSCrypt / Хабр (habr.com) (путём скачивания списков и настройкой маршрутов в iptables, nftables).
