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

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


  1. Tuxozaur
    08.09.2023 09:10
    +1

    Интересно, а на Asuswrt Merlin это заведётся?

    Outline очень зашёл - устанавливается за минуту на VPS, позволяет разделять пользователей, сбор метрик из коробки. Не хватает только клиента на роутер.


    1. Andrevich Автор
      08.09.2023 09:10
      +1

      C Asuswrt честно говоря опыта не было, наверняка файл конфигурации сети и файрволла устроены иначе, возможно механизм автозапуска иной, в остальном наверняка адаптировать будет не сложно


  1. viktorf3ss
    08.09.2023 09:10
    +2

    Большое спасибо за статью, tp-link Archer C6U, OpenWrt 22.03.2 полёт нормальный.


    1. Andrevich Автор
      08.09.2023 09:10
      +1

      Спасибо за оценку, рад слышать! Вы какой из двух способов использовали?


      1. viktorf3ss
        08.09.2023 09:10
        +2

        Тк памяти свободной всего 7.8 Мб выбрал второй вариант, проблем небыло.


  1. vasisulay
    08.09.2023 09:10
    +2

    Совсем просто!