Собственно сразу к делу, понадобится любая версия 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).
Комментарии (6)
viktorf3ss
08.09.2023 09:10+2Большое спасибо за статью, tp-link Archer C6U, OpenWrt 22.03.2 полёт нормальный.
Andrevich Автор
08.09.2023 09:10+1Спасибо за оценку, рад слышать! Вы какой из двух способов использовали?
Tuxozaur
Интересно, а на Asuswrt Merlin это заведётся?
Outline очень зашёл - устанавливается за минуту на VPS, позволяет разделять пользователей, сбор метрик из коробки. Не хватает только клиента на роутер.
Andrevich Автор
C Asuswrt честно говоря опыта не было, наверняка файл конфигурации сети и файрволла устроены иначе, возможно механизм автозапуска иной, в остальном наверняка адаптировать будет не сложно