Настраиваем клиент Outline на OpenWRT за 5 минут с помощью tun2socks

—

от автора

Собственно сразу к делу, понадобится любая версия 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)

Что делает скрипт:

  1. Проверит наличие пакетов kmod-tun, ip-full

  2. Cкачает tun2socks для вашего роутера (если пакет есть в репозитории)

  3. Перенесёт файл в ПЗУ

  4. Создаст необходимые записи в /etc/config/network и /etc/config/firewall

  5. Перезагрузит сеть

  6. Попросит ввести данные для настройки

  7. Проверит и сохранит текущий маршрут по умолчанию

  8. Создаст скрипт запуска /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

Что делает скрипт:

  1. Проверит наличие пакетов kmod-tun, ip-full

  2. Cкачает tun2socks для вашего роутера (если пакет есть в репозитории)

  3. Создаст необходимые записи в /etc/config/network и /etc/config/firewall

  4. Перезагрузит сеть

  5. Попросит ввести данные для настройки

  6. Проверит и сохранит текущий маршрут по умолчанию

  7. Создаст скрипт запуска /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).


ссылка на оригинал статьи https://habr.com/ru/articles/759638/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *