Popular Post DennoN Posted March 27, 2020 Popular Post Share Posted March 27, 2020 (edited) Изначально у меня была схема с BGP, настроенная по инструкции https://pimpmykeenetic.github.io/2019/01/22/bgp_routing.html Но потом она перестала работать, да и соединение по протоколу wireguard я так и не осилил как добавить в схему работы с BGP В итоге решил настроить через статические маршруты, через тот же самый bird4 После нескольких изменений в итоге проект был выложен в гит https://github.com/DennoN-RUS/Bird4Static/ А после некоторых изысканий и большего понимания что и как работает, появились и bgp и поддержка wireguard и прочее Установка: Скрытый текст 1) Зайти по ssh в среду entware 2) Выполнить: opkg install git git-http git clone https://github.com/DennoN-RUS/Bird4Static.git chmod +x ./Bird4Static/*.sh ./Bird4Static/install.sh 3) Далее последует вопрос о количестве впн туннелей. Если у вас их 2 и хотите, что бы они оба использовались, то введите 1. Если второго впн нет, то введите 0 или любое другое значение (приравняется к 0) 4) Потом нужно выбрать список, на основе которого будут строится маршруты в впн, 2 на выбор, но можно указать и свой урл 5) Во время выполнения скрипта потребуется ввести имя интерфейса провайдера и интерфейса/ов VPN. Все данные будут выводиться в консоль перед вводом, так что необходимо только скопировать нужные имена и вставить в консоль 6) После выполнения установки роутер получит маршрутизацию через впн до нужных ресурсов Обновление: Скрытый текст 1) Выполнить ./Bird4Static/update.sh Затягивает актуальную версию с репозитория и запускает установку 2) Во время выполнения не соглашаться с перезаписью файлов `user-*.list` cp: overwrite '/opt/root/Bird4Static/lists/user-isp.list'? n cp: overwrite '/opt/root/Bird4Static/lists/user-vpn.list'? n cp: overwrite '/opt/root/Bird4Static/lists/user-vpn1.list'? n cp: overwrite '/opt/root/Bird4Static/lists/user-vpn2.list'? n Если согласится на это, то ваши списки будут заменены дефолтными из репозитория Удаление: Скрытый текст Для удаления нужно запустить: ./Bird4Static/uninstall.sh Далее ответить на вопросы, что удалять, а что оставить из дополнительных пакетов Возможные проблемы: Скрытый текст Если у вас после применения скриптом перестало работать впн соединение, то скорее всего проблема в том, что в листы для впна попал сам адрес вашего впна. Для того, что бы это починить нужно в файл Bird4Static/lists/user-isp.list ввести ip адрес вашего впн и запустить обновление таблиц ./Bird4Static/scripts/add-bird4_routes.sh Если у вас при заполнении файла user-isp.list перестают открываться ресурсы указанные в нем, то надо изменить переменную в скрипте add-bird4_routes.sh с ISP=eht3 (где eth3 - это интерфейс провайдера) на ISP=10.0.0.1 (где 10.0.0.1 - это шлюз провайдера). Узнать шлюз можно командой ip route | grep default ВНИМАНИЕ! Сам скрипт не отслеживает какой сейчас шлюз. Если вы указали один, а потом он изменился, то надо снова менять в файле значение переменной ISP и перезапускать скрипт. Так же можно автоматизировать указание шлюза, указав в add-bird4_routes.sh ISP=`ip route | grep default | cut -f 3 -d' '` Но при каждой смене шлюза нужно будет все равно запускать скрипт После установки во время выполнения скрипта add-bird4_routes.sh вываливается ошибка sh: =~: unknown operand BusyBox v1.31.0 () built-in shell (ash) Что бы исправить это нужно обновить busybox командами opkg update opkg upgrade busybox ВАЖНО: Данные маршруты сработают только для Основного профиля (В веб интерфейса кинетика это Интернет - Приоритеты подключений - Основной профиль). Для всех других профилей будет использована маршрутизация в том виде, в котором у них задан приоритет в настройках этого профиля Назначение файлов: Bird4Static/lists/user-isp.list - для перенаправления трафика через провайдера Bird4Static/lists/user-vpn.list - для перенаправления трафика через VPN (в случае использования двух впн маршруты будут добавлены для обоих) Bird4Static/lists/user-vpn1.list и Bird4Static/lists/user-vpn2.list - появляется только при использовании двух впн, указывает к какому адресу идти с определенного впн (по умолчанию 2ip.ru отрывается через первый, yoip.ru через второй) Схема работы: Скрытый текст Чем меньше значение priority, тем более высокий приоритет в маршрутизации antifilter.list в Bird4Static/lists/ обновляется раз в час user-*.list - находятся в Bird4Static/lists/ и заполняются пользователем при желании bird4-*-*.list - находятся в /opt/etc/ и наполняются автоматически из файлов выше Спасибо всем, кто давал идеи об оптимизации команд! Один бы я такое не осилил. Как поставить удобный вэб интерфейс - описано ТУТ (спасибо @nnm) Как скрыть траффик wg под shadowsocks - описано ТУТ 07.02.2023 - обновление 3.6.0, добавлен BGP режим, переделана логика работы bird, подробнее тут 08.02.2023 - 3.6.1 фикс скрипта установки, для определения id роутера для конфигов bird тут 18.02.2023 - 3.7.0 правки в логике установки и прочие мелкие улучшения тут 13.06.2023 - 3.8.0 bird1-ipv4 заменен на bird2, подробнее тут 14.06.2023 - 3.8.1 фикс скрипта установки, теперь номер версии обновляется, а не берется старый 07.08.2024 - 3.9.0 Смена номеров таблиц, добавление возможности установки аддона IPset4Static Остальной список изменений в кратком виде: Скрытый текст 13.01.2023 - обновление 3.4, подробнее тут 27.01.2023 - обновление 3.4.2, важно для AS номеров, подробнее тут 28.01.2023 - важное обновление, если стояли версии v3.4 обновляться обязательно, подробнее тут 29.01.2023 - фикс установки с нуля (был сломан в версии v3.5), возможность задать несколько урлов, возможность вообще их отключить, подробнее тут Полный список изменений здесь Edited September 7 by DennoN 16 3 Quote Link to comment Share on other sites More sharing options...
DennoN Posted May 21, 2020 Author Share Posted May 21, 2020 (edited) Этот пост о старой версии, сейчас (25.03.2022) это уже не актуально, так как используются новые версии скриптов, и то что ниже не подходит к актуальной версии Скрытый текст 1) Нужно установить сам bird4 opkg install bird1-ipv4 далее меняем конфиг vi /opt/etc/bird4.conf сам конфиг: log syslog all; log stderr all; router id 123.123.123.123; # current external ip function martians() { return net ~ [ #104.20.41.23/32-, #4pda.ru 100.64.0.0/10+, 169.254.0.0/16+, 172.16.0.0/12+, 192.168.0.0/16+, 10.0.0.0/8+, 127.0.0.0/8+, 224.0.0.0/4+, 240.0.0.0/4+, 0.0.0.0/32-, 0.0.0.0/0{0,7} ]; } protocol device { scan time 15; } protocol kernel kernel_routes { scan time 60; import none; export all; kernel table 1000; # kernel routing table number } protocol static static_routes { import all; include "/opt/etc/bird4-routes.conf"; #route 192.168.X.Y/24 via 192.168.A.B; route 104.20.41.23/32 via "eth3"; #4pda.ru route 104.20.42.23/32 via "eth3"; } Пояснения 123.123.123.123 можно заменить на текущий адрес, но так как мы не используем BGP, то по сути роли не играет. Так же можно удалить строки route 104.20.41.23/32 и далее. У меня они в конфиге для исключения маршрутизации через тунель. Если хотите оставить, то убедитесь, что eth3 - это интерфейс провайдера. Для этого выполняем команду ifconfig и смотрим название интерфейса, которому присвоен адрес провайдера. 2) Далее надо создать скрипт, который создает/удаляет таблицу и запускает/останавливает службу, если впн поднялся/упал vi /opt/etc/ndm/ifstatechanged.d/010-add_antizapret_route.sh сам скрипт: #!/bin/sh [ "$1" == "hook" ] || exit [ "$id" == "L2TP0" ] || exit case ${change}-${connected}-${link}-${up} in link-no-down-down) ip rule del table 1000 /opt/etc/init.d/S04bird1-ipv4 stop ;; link-yes-up-up) if [ -z "$(ip rule | grep 1000)" ]; then ip rule add table 1000 fi /opt/etc/init.d/S04bird1-ipv4 start ;; esac Тут нужно поменять "$id" == "L2TP0" на то имя, которое у вас прописано кинетиком. Для этого выполняем: ndmc -c "show interface" Находим нужный интерфейс и смотрим на строку Interface, name = "L2TP0" В вашем случае это может быть не L2TP0, а что-то другое, соответственно в скрипте выше надо поменять название. Не забываем выполнить chmod +x /opt/etc/ndm/openvpn-route-up.d/010-add_antizapret_route.sh 3) Создаем скрипт, который будет каждый день обновлять списки блокировки vi /opt/etc/cron.daily/add-bird4_routes.sh Если у вас нет папки cron.daily, то скорее всего у вас не установлен крон, выполняем: opkg install cron Содержимое самого скрипта: #!/bin/sh curl https://antifilter.download/list/allyouneed.lst | sed 's/^/route /' | sed 's/$/ via "ppp0";/' > /opt/etc/bird4-routes.conf /opt/etc/init.d/S04bird1-ipv4 reconfigure Здесь нужно поменять ppp0 на имя интерфейса вашего впн тунеля (не путать с названием, которое мы узнавали до этого!!!) Выполняем ifconfig и смотрим, какой интерфейс указан для впн по ip адресу. Не забываем выполнить: chmod +x /opt/etc/cron.daily/add-bird4_routes.sh 4) Запуск. Выполняем только что созданный скрипт ip rule add table 1000 /opt/etc/cron.daily/add-bird4_routes.sh /opt/etc/init.d/S04bird1-ipv4 start проверить, что все работает можно выполнив ip route list table 1000 в выводе будет большой список адресов. Так же команда ip rule list Покажет, есть ли вообще таблица. На этом все! Спасибо Александру Рыжову за изначальную инструкцию по настройке bird4, на основе которой и был сделан этот мануал. Дополнение. Настроил резолвинг доменов и добавление в таблицу маршрутизации через bird Итак: 1) Нужно создать скрипт: vi /opt/root/addip.sh Содержимое: #!/bin/sh cut_local() { grep -vE 'localhost|^0\.|^127\.|^10\.|^172\.16\.|^192\.168\.|^::|^fc..:|^fd..:|^fe..:' } #Добавляем адреса без масок cat $1 | awk '{print $1}' | awk '/^[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*$/' | sed 's/^/route /' | sed 's/$/\/32 via "'$2'";/' > $3 #Добавляем адреса с масками cat $1 | awk '{print $1}' | awk '/^[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*[\/]/' | sed 's/^/route /' | sed 's/$/ via "'$2'";/' >> $3 until ADDRS=$(dig +short google.com @localhost -p 53) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done #Узнаем адреса доменов echo "$(cat $1 | awk '!/^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[1-9][0-9]/ && !/^#/ && NF {print $1}')" | { while IFS= read -r line; do dig A +short $line @localhost -p 53 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | cut_local | awk '{print "route "$1"/32 via \"'$2'\";"}' >> $3 done } Делаем его исполняемым: chmod +x /opt/root/addip.sh Скрипт получает на вход 3 аргумента: файл с доменами и адресами, название туннеля и конечный файл с маршрутами 2) Редактируем скрипт автообновления адресов в кроне vi /opt/etc/cron.daily/add-bird4_routes.sh Приводим к такому виду: #!/bin/sh ISP=eth3 VPN=ppp0 URL0=https://antifilter.download/list/allyouneed.lst ROUTE=/opt/etc/bird4-routes.list VPNTXT=/opt/etc/bird4-vpn.txt VPNLST=/opt/etc/bird4-vpn.list ISPTXT=/opt/etc/bird4-isp.txt ISPLST=/opt/etc/bird4-isp.list #Скачиваем общий список curl $URL0 | sed 's/^/route /' | sed 's/$/ via "'$VPN'";/' > $ROUTE #Добавляем вручную добавленные адреса через впн /opt/root/addip.sh $VPNTXT $VPN $VPNLST #То же что и выше, но через провайдера /opt/root/addip.sh $ISPTXT $ISP $ISPLST /opt/etc/init.d/S04bird1-ipv4 reconfigure Тут нужно изменить: ISP - это имя интерфейса провайдера VPN - это имя интерфейса туннеля Остальное не трогаем. Файл в переменной VPNTXT /opt/etc/bird4-vpn.txt заполняем, если хотим что-то перенаправить на туннель принудительно. Файл в переменной ISPTXT /opt/etc/bird4-isp.txt заполняем, если хотим направить что-то через провайдера принудительно. Пример заполнения: vi /opt/etc/bird4-isp.txt 4pda.ru speedtest.net #msstore 88.221.132.9 88.221.132.42 93.184.221.240 vi /opt/etc/bird4-vpn.txt antifilter.download В принципе если вам не хотите скачивать весь список заблокированных доменов, а настроить точечный обход, то удаляете строку curl $URL0 | sed ..., далее просто заполняете файл bird4-vpn.txt теми ресурсами, на которые вы хотите попадать через туннель. Правила заполнения. Каждая запись в новой строке. Знаки # игнорируется, можно ставить комментарии. Так же игнорируются пустые строки. Поддерживается добавление адресов вида 123.123.123.123, а так же и с масками 123.123.123.0/24. Любые записи нужно записывать с первого символа строки, то есть никаких пробелов перед адресом ставить нельзя. Далее нужно запустить скрипт автообновления, что бы создались необходимые файлы для конфига bird /opt/etc/cron.daily/add-bird4_routes.sh Файлы с расширением list этого готовые файлы конфигурации для bird. Эти файлы нужно добавить в конфиг bird 3) Редактируем конфиг bird vi /opt/etc/bird4.conf тут нужно секцию protocol static static_routes привести к виду: protocol static static_routes { import all; #route 192.168.X.Y/24 via 192.168.A.B; include "/opt/etc/bird4-routes.list"; include "/opt/etc/bird4-vpn.list"; include "/opt/etc/bird4-isp.list"; } Тут нужно внимательно смотреть. Если в этом конфиге указать файл, который не существует, то bird не запустится. Соответственно если вам что-то не нужно (общий список заблокирвоанных доменов, принудительное перенаправление в туннель или через провайдера), то в конфиг этот файл включать нельзя. Так же можно удалить или закомментировать ненужные строки в скрипте автообновления. На этом все, осталось перезапустить птичку /opt/etc/init.d/S04bird1-ipv4 restart И готово! Edited February 7, 2023 by DennoN 1 1 Quote Link to comment Share on other sites More sharing options...
zyxmon Posted May 21, 2020 Share Posted May 21, 2020 Сами придумали или у меня взяли основу? Первоисточник тут - http://forums.zyxmon.org/viewtopic.php?f=5&t=5738 Нужно бы мне переделать инструкцию через include. Вместо рестарта bird (reconfigure) лучше посылать SIGHUP. Отслеживать падение и подъем VPN туннеля большого смысла нет, если он сам поднимается. Если упал туннель, то маршрутизация к недоступным узлам кривая. Ну и что - они же при падении VPN все равно недоступны. Quote Link to comment Share on other sites More sharing options...
DennoN Posted May 21, 2020 Author Share Posted May 21, 2020 Нет, для меня первоисточником был https://keenetic-gi.ga/2019/01/22/bgp_routing.html Что можно через инклюд делать это я в мануале по берду углядел. По поводу оnслеживания впн, тут хорошо, если список не обобщенный. А если он с масками 24, 19 и тд, то часть ресурсов при падении впн просто перестанет открываться, хотя они через провайдера открываются нормально. А тут таблица грохается и маршруты идут просто через провайдера. Вот про killall -s SIGHUP bird4 спасибо, не знал, что так можно. Вот скрипт резолвинга доменов изначально был не мой, но в итоге он него осталось всего пара строк) Ну и к плюсу моего решения можно тупо не скачивать весь список, а добавить только необходимые домены/адреса и будет работать. Quote Link to comment Share on other sites More sharing options...
zyxmon Posted May 21, 2020 Share Posted May 21, 2020 39 минут назад, DennoN сказал: Ну и к плюсу моего решения можно тупо не скачивать весь список, а добавить только необходимые домены/адреса и будет работать. По крону он же у Вас тупо весь читается. По поводу скрипта резолвинга - проверяли, что будет, если в списке несуществующий домен? Это нужно обрабатывать, иначе bird не прочтет конфиг и перестанет работать. Quote Link to comment Share on other sites More sharing options...
DennoN Posted May 21, 2020 Author Share Posted May 21, 2020 (edited) Проверяли У меня все ок, строки без адреса не добавляются. Там греп отфильтровывает. Но конкретно эта строка не моя. Изначально скрипт был на форуме, но мне его просто скинули, так что кто автор я не знаю) dig A +short $line @localhost -p 53 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' Может конечно еще можно как-нибудь изуродовать файл с входными данными, но у меня идеи закончились. Базовую "защиту от дурака" я вроде бы сделал. Ну а если есть желание все поломать, то тут уже никакая защита не поможет 😁 По поводу крона, изначально я для себя сделал не 3 инклюда, а 5. в двух файлах указывал ip адреса для впн и исп, в два другие попадали адреса от доменов + общий от антифильтра. Но по итогу объединил все в одно. Не стал заморачиваться и решил пусть весь файл сразу читает и не проверяет, что уже было в нем, что нет. А так-то решение, которое я здесь выложил написано именно для моих нужд. То есть грузим весь список и добавляем пользовательские правила. Если кто-то не захочет грузить весь список, а использовать только свои адреса, то придется чуть чуть подправить крон комментированием строк curl $URL0 | sed 's/^/route /' | sed 's/$/ via "'$VPN'";/' > $ROUTE /opt/root/addip.sh $ISPTXT $ISP $ISPLST и из конфига bird убрать это include "/opt/etc/bird4-routes.list"; include "/opt/etc/bird4-isp.list"; Edited May 21, 2020 by DennoN Quote Link to comment Share on other sites More sharing options...
zyxmon Posted May 22, 2020 Share Posted May 22, 2020 На мой взгляд эффективнее сразу весь файл с доменами обработать с помощью dig (кстати на одно доменное имя может выдавать несколько IP), а потом читать ip, проверять на валидность и добавлять в конфиг. Проверьте, правильно ли обрабатывается такое доменное имя - `onlainfilm.co` dig A +short onlainfilm.co pr-suspensions.neuweb.biz. PR-Suspensions-1630320541.us-east-1.elb.amazonaws.com. 50.19.199.106 34.196.125.115 3.231.242.12 52.87.80.196 Quote Link to comment Share on other sites More sharing options...
DennoN Posted May 22, 2020 Author Share Posted May 22, 2020 (edited) ~ # dig A +short onlainfilm.co @localhost -p 53 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | awk '{print "route "$1"/32 via \"ppp0\";"}' route 34.196.125.115/32 via "ppp0"; route 3.231.242.12/32 via "ppp0"; route 50.19.199.106/32 via "ppp0"; route 52.87.80.196/32 via "ppp0"; ~ # dig A +short 4pda2.ru @localhost -p 53 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | awk '{print "route "$1"/32 via \"ppp0\";"}' ~ # dig A +short google.com @localhost -p 53 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | awk '{print "route "$1"/32 via \"ppp0\";"}' route 108.177.14.139/32 via "ppp0"; route 108.177.14.102/32 via "ppp0"; route 108.177.14.101/32 via "ppp0"; route 108.177.14.138/32 via "ppp0"; route 108.177.14.100/32 via "ppp0"; route 108.177.14.113/32 via "ppp0"; ~ # Вообще я внес кое какие правки. Оказалось, что часть IP адресов (если после адреса стоит #комментарий) попадает в резолвинг. Ничего не происходит, они просто не отвечают, как несуществующий домен, так же как и 4pda2.ru в моем примере. Тут я свои старые сообщения редактировать не могу, так что создал "проект" на гитхабе https://github.com/DennoN-RUS/Bird4Static сам файл с правками https://github.com/DennoN-RUS/Bird4Static/blob/master/root/addip.sh Так же упрощается установка самих скриптов. opkg install git bird4 cron git clone https://github.com/DennoN-RUS/Bird4Static.git chmod +x Bird4Static/root/addip.sh chmod +x Bird4Static/etc/ndm/ifstatechanged.d/010-add_antizapret_route.sh chmod +x Bird4Static/etc/cron.daily/add-bird4_routes.sh cp -rf Bird4Static/etc/ /opt/ cp -rf Bird4Static/root/ /opt/ Остается править конфиги и можно запускать. Edited May 22, 2020 by DennoN 1 Quote Link to comment Share on other sites More sharing options...
avn Posted May 27, 2020 Share Posted May 27, 2020 Как по вашему, что произойдет если DNS сервер не будет доступен на момент старта? Для эмуляции можно сделать такую правку (сделать ссылку на несуществующий сервер) и перезагрузить роутер. У "автора" скриптов такие моменты были предусмотрены. until ADDRS=$(dig +short google.com @1.2.3.4 -p 5553) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done Так добавлять правило (и удалять), тоже не совсем правильно. Что будет если данный скрипт выполнить два и более раз? ip rule add table 1000 Quote Link to comment Share on other sites More sharing options...
DennoN Posted May 28, 2020 Author Share Posted May 28, 2020 в файле addip.sh есть строка с ожиданием резолва google.com until ADDRS=$(dig +short google.com @localhost -p 53) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done По поводу правила. Вы про какой скрипт? Если тот, который мониторит впн соединение, то там есть проверка на то, что бы не добавлять правило, если оно уже есть... На гитхабе обновление https://github.com/DennoN-RUS/Bird4Static сделал автоинсталяшку (кривую немного), добавил описание. Quote Link to comment Share on other sites More sharing options...
avn Posted May 28, 2020 Share Posted May 28, 2020 33 minutes ago, DennoN said: в файле addip.sh есть строка с ожиданием резолва google.com until ADDRS=$(dig +short google.com @localhost -p 53) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done По поводу правила. Вы про какой скрипт? Если тот, который мониторит впн соединение, то там есть проверка на то, что бы не добавлять правило, если оно уже есть... На гитхабе обновление https://github.com/DennoN-RUS/Bird4Static сделал автоинсталяшку (кривую немного), добавил описание. Строка ожидания есть. Но вы читаете через слово. Я Вам предложил проэмулировать ситуацию с недоступным на момент старта роутера ДНС сервера. Что произойдет с этим ожиданием, если ДНС сервер вообще не доступен? Что произойдет с загрузкой скриптов из Entware в такой ситуации? Надо просто запуск скрипта делать в асинхронном режиме, а у Вас в синхронном. Quote Link to comment Share on other sites More sharing options...
avn Posted May 28, 2020 Share Posted May 28, 2020 38 minutes ago, DennoN said: Если тот, который мониторит впн соединение, то там есть проверка на то, что бы не добавлять правило, если оно уже есть Нету такой проверки. Quote Link to comment Share on other sites More sharing options...
DennoN Posted May 28, 2020 Author Share Posted May 28, 2020 (edited) vi /opt/etc/ndm/ifstatechanged.d/010-add_antizapret_route.sh сам скрипт: #!/bin/sh [ "$1" == "hook" ] || exit [ "$id" == "L2TP0" ] || exit case ${change}-${connected}-${link}-${up} in link-no-down-down) ip rule del table 1000 /opt/etc/init.d/S04bird1-ipv4 stop ;; link-yes-up-up) #НИЖЕ ИДЕТ ПРОВЕРКА if [ -z "$(ip rule | grep 1000)" ]; then ip rule add table 1000 fi /opt/etc/init.d/S04bird1-ipv4 start ;; esac по поводу резолва, отредактировал скрипт #!/bin/sh cut_local() { grep -vE 'localhost|^0\.|^127\.|^10\.|^172\.16\.|^192\.168\.|^::|^fc..:|^fd..:|^fe..:' } cat $1 | awk '{print $1}' | awk '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/' | sed 's/^/route /' | sed 's/$/\/32 via "'$2'";/' >> $3 cat $1 | awk '{print $1}' | awk '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}$/' | sed 's/^/route /' | sed 's/$/ via "'$2'";/' >> $3 echo 1 until ADDRS=$(dig +short google.com @localhost -p 5533) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done echo 2 .... запустил скрипт /opt/etc/cron.daily/add-bird4_routes.sh скрипт вывел цифру 1 и завис. Ждал 5 минут. Потом открыл вторую сессию ssh, отредактировал dnsmasq и повесил его на порт 5533, перезапустил днс и скрипт, который висел все это время вывел цифру 2 Да и сам скрипт резолва изначально запускается по крону в 4 ночи. Так что он не должен выполняться при запуске роутера. Сейчас добавил его в скрипт, который запускается, когда ВПН поднялся, но это тоже происходит не сразу после запуска роутера. Edited May 28, 2020 by DennoN Quote Link to comment Share on other sites More sharing options...
DennoN Posted May 28, 2020 Author Share Posted May 28, 2020 19 часов назад, avn сказал: У "автора" скриптов такие моменты были предусмотрены. А, так это ваш скрипт я взял как начальную идею по резолвингу доменов из файла. Наконец-то нашел оригинальный пост Говорю огромное спасибо, за идею чтения файла построчно и резолвинга каждой строки. Сам бы с нуля я долго бы мучался с реализацией. Quote Link to comment Share on other sites More sharing options...
avn Posted May 28, 2020 Share Posted May 28, 2020 10 hours ago, DennoN said: ip rule add table 1000 На мой взгляд так плохо делать, т.к. выполнение двух таких команд породит винегрет. А вот такая команда, не позволит сделать винегрет. ip rule add table 1000 priority 2150 ip rule | grep 1000 Найдет и таблицу 100010 и 11000, так что не совсем красиво. 10 hours ago, DennoN said: Так что он не должен выполняться при запуске роутера Если не должен выполнятся при запуске, тогда асинхронный запуск не нужен. Для общеобразовательной цели https://unix.stackexchange.com/questions/86247/what-does-ampersand-mean-at-the-end-of-a-shell-script-line 11 hours ago, DennoN said: cat $1 | awk '{print $1}' | awk '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/' | sed 's/^/route /' | sed 's/$/\/32 via "'$2'";/' >> $3 cat $1 | awk '{print $1}' | awk '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}$/' | sed 's/^/route /' | sed 's/$/ via "'$2'";/' >> $3 Можно заменить на такое: cat $1 | grep -Eo '^([0-9]{1,3}\.){3}[0-9]{1,3}($|/[0-9]{1,2}$)' | sed 's/^/route /' | sed 's/$/\/32 via "'$2'";/' >> $3 Но c ограничениями, строка должна заканчиваться на \n, не должно быть пробелов перед и после ip. Но и в Ваших скриптах они тоже есть. Quote Link to comment Share on other sites More sharing options...
DennoN Posted May 28, 2020 Author Share Posted May 28, 2020 44 минуты назад, avn сказал: ip rule add table 1000 priority 2150 Ага, отличная идея. Понял, переправлю. А по поводу грепа, в принципе одно и тоже получается. В моем варианте я еще пробовал предусмотрел момент, что будут писать 88.42.12.32 #описание что за адрес Поэтому добавил awk '{print $1}' перед всем этим безобразием. А сам запрос можно сократить, до '^([0-9]{1,3}\.){3}[0-9]{1,3}($|/[0-9]{1,2}$)' Согласен. Quote Link to comment Share on other sites More sharing options...
флегматик Posted June 21, 2020 Share Posted June 21, 2020 (edited) Попытался предотвратить маршрутизацию в тоннель по образцу стартового поста - route 88.99.95.180/32 via "eth3"; - но ничего хорошего из этого не вышло. Tracert с компьютера выдал такое: Трассировка маршрута к wikimapia.org [88.99.95.180] с максимальным числом прыжков 30: 1 <1 мс <1 мс <1 мс KEENETIC_GIGA [192.168.1.1] 2 broadband-37-110-ab-cd.ip.moscow.rt.ru [37.110.ab.cd] сообщает: Заданный узел недоступен. Тогда я ещё раз посмотрел на определение eth3 в ifconfig opkg, там у меня написано что-то такое: inet addr:37.110.ab.cd Bcast:37.110.71.255 Mask:255.255.248.0 - и заменил в route eth3 на этот самый Bcast. С такой правкой заработало. Но как-то оно неаккуратненько адреса писать, они у меня всё-таки динамические. Неужели иначе не выйдет? Edited June 21, 2020 by флегматик Quote Link to comment Share on other sites More sharing options...
Сергей «Solaris» Сидоров Posted July 10, 2020 Share Posted July 10, 2020 Добрый, подскажите, \etc\ndm\ifstatechanged.d\010-add_antizapret_route.sh не добавляет таблицу в правила. ip rule add table 1000 priority 2150 А вручную эта команда отработала и всё поднялось. И такой вопрос \etc\ndm\ifstatechanged.d\ этой папки не не было изначально, это нормально? Quote Link to comment Share on other sites More sharing options...
r13 Posted July 10, 2020 Share Posted July 10, 2020 12 минуты назад, Сергей «Solaris» Сидоров сказал: Добрый, подскажите, \etc\ndm\ifstatechanged.d\010-add_antizapret_route.sh не добавляет таблицу в правила. ip rule add table 1000 priority 2150 А вручную эта команда отработала и всё поднялось. И такой вопрос \etc\ndm\ifstatechanged.d\ этой папки не не было изначально, это нормально? Должно быть /opt/etc/ndm/ifstatechanged.d 1 Quote Link to comment Share on other sites More sharing options...
Сергей «Solaris» Сидоров Posted July 10, 2020 Share Posted July 10, 2020 (edited) 2 часа назад, r13 сказал: Должно быть /opt/etc/ndm/ifstatechanged.d Хм... странно. Каталога opt нет, все etc, root, bin и тп лежат в корне. Сразу так установилось. Сейчас в скриптах пути поправлю! Edited July 10, 2020 by Сергей «Solaris» Сидоров Quote Link to comment Share on other sites More sharing options...
r13 Posted July 10, 2020 Share Posted July 10, 2020 9 минут назад, Сергей «Solaris» Сидоров сказал: Хм... странно. Каталога opt нет, все etc, root, bin и тп лежат в корне. Сразу так установилось. Сейчас в скриптах пути поправлю! Ваша флешка с установленной entware при включении opkg монтируется в /opt Quote Link to comment Share on other sites More sharing options...
Сергей «Solaris» Сидоров Posted July 10, 2020 Share Posted July 10, 2020 1 минуту назад, r13 сказал: Ваша флешка с установленной entware при включении opkg монтируется в /opt Всё верно. Тогда вопрос остается открытым. Quote Link to comment Share on other sites More sharing options...
vitalik6243 Posted July 22, 2020 Share Posted July 22, 2020 Добрый день всем, вообщем скрипт работает как часы, только вот система route на интерфейс основного интернета не работает от слова совсем. тупо перестают идти пакеты... и единсвенный выход из положения это удалять подсети который пошли через vpn. Пытался доработать скрипт путем добавления дополнительного файла фильтрации белых ip адресов, но это не работает от слова совсем. #!/bin/sh cut_local() { grep -vE 'localhost|^0\.|^127\.|^10\.|^172\.16\.|^192\.168\.|^::|^fc..:|^fd..:|^fe..:' } cat $1 | awk '{print $1}' | awk '/^([0-9]{1,3}\.){3}[0-9]{1,3}$/' | awk -F. -v OFS=. 'NF--' | sed -i '/$1/d' $2 cat $1 | awk '{print $1}' | awk '/^([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2}$/' | awk -F. -v OFS=. 'NF--' | sed -i '/$1/d' $2 until ADDRS=$(dig +short google.com @localhost -p 53) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done echo "$(cat $1 | awk '{print $1}' | awk '!/^([0-9]{1,3}\.){3}[0-9]{1,3}/ && !/^#/')" | { while IFS= read -r line; do ips="`dig A +short $line @localhost -p 53 | awk '/^([0-9]{1,3}\.){3}[0-9]{1,3}$/' | cut_local | awk -F. -v OFS=. 'NF--'`" echo "$ips" sed -i "/$ips/d" $2 done } Может будет вариант посмотреть что сделал не так... т.к. убил более 2-ух суток и ничего дельного у меня не получилось Просто по команде echo я понимаю что ip адреса приходят команде sed для дальнейшего удаления из общего списка. Но вот команда sed удаляет вместо ip адреса символ $ips Quote Link to comment Share on other sites More sharing options...
DennoN Posted August 19, 2020 Author Share Posted August 19, 2020 @vitalik6243 Лучше разобраться почему не работает перенаправление через основной интернет. Последние версии скриптов лежат тут https://github.com/DennoN-RUS/Bird4Static там даже автоустановка прикручена. 1 Quote Link to comment Share on other sites More sharing options...
Mr.Scayger Posted December 10, 2020 Share Posted December 10, 2020 Попробовал на прошивках 3.5.2(.4) использовать полный список https://antifilter.download/list/ip.lst Полёт нормальный. Работает 😀 Тормозов нет. Соответственно скрипты можно сильно упростить. Quote Link to comment Share on other sites More sharing options...
Сергей «Solaris» Сидоров Posted January 5, 2021 Share Posted January 5, 2021 Интересно, выкладывай Quote Link to comment Share on other sites More sharing options...
Mr.Scayger Posted January 5, 2021 Share Posted January 5, 2021 Прелюдию (установку пакетов, настройку pingcheck на vpn интерфейсах, методики проверки конфигов на ошибки и т.п.) опускаю, т.к. это достаточно описано выше. Реализован следующий алгоритм работы. Есть два VPN интерфейса, ovpn_br1 основной и ovpn_br2 резервный. На IP, прописанные в файле /opt/etc/bird4-us-force.list, трафик идёт через ovpn_br2. На адреса из общего списка ip.lst через основной, если он недоступен, то через резервный. 1.Создать папку /opt/etc/blacklist 2.Остановить или установить bird, заменить файл конфигурации /opt/etc/bird4.conf следующим Spoiler #log syslog all; #log stderr all; router id 192.168.1.1; protocol direct { interface "ovpn_br1", "ovpn_br2"; } table nl_free; table us_free; table us_backup; protocol device { scan time 15; } protocol kernel { table us_free; persist; learn; scan time 900; import none; export all; kernel table 1001; # kernel routing table number } protocol kernel { table nl_free; persist; learn; scan time 900; import none; export all; kernel table 1002; # kernel routing table number } protocol kernel { table us_backup; persist; learn; scan time 900; import none; export all; kernel table 1003; # kernel routing table number } protocol static { table us_free; include "/opt/etc/bird4-us-force.list"; check link on; preference 50; } protocol static { table nl_free; include "/opt/etc/bird4-nl.list"; check link on; preference 250; } protocol static { table us_backup; include "/opt/etc/bird4-us.list"; check link on; preference 500; } Создать файл /opt/etc/bird4-us-force.list. Пример ниже, 2ip внесён для проверки работы. Spoiler route 185.85.121.0/24 via "ovpn_br2"; #Lostfilm.TV route 195.201.201.32/32 via "ovpn_br2"; #2ip.ru route 3.0.0.0/8 via "ovpn_br2"; #Amazon route 52.32.0.0/11 via "ovpn_br2"; #Amazon route 207.171.160.0/19 via "ovpn_br2"; #Amazon 3.Создать скрипт /opt/etc/init.d/S02bird-table для инициализации таблиц при незапланированных перезагрузках Spoiler #!/bin/sh PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin start() { if [ -z "$(ip rule | awk '/^30001/' )" ]; then ip rule add table 1001 priority 30001 fi if [ -z "$(ip rule | awk '/^30002/' )" ]; then ip rule add table 1002 priority 30002 fi if [ -z "$(ip rule | awk '/^30003/' )" ]; then ip rule add table 1003 priority 30003 fi } stop() { ip rule del table 1001 ip rule del table 1002 ip rule del table 1003 } case "$1" in start) start ;; stop | kill) stop ;; restart) stop sleep 5 start ;; *) echo "Usage: $0 {start|stop|kill|restart}" ;; esac 4.В папку cron.daily или cron.hourly поместить скрипт (автору ветки респект 👍) парсинга списка ip.lst и выполнить его вручную первый раз Spoiler #!/bin/sh VPN1=ovpn_br1 VPN2=ovpn_br2 URL0=https://antifilter.download/list/ip.lst ROUTE1=/opt/etc/bird4-nl.list ROUTE2=/opt/etc/bird4-us.list logger "Entering ${0##*/}." until ADDRS=$(dig +short google.com @localhost -p 53) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done cd /opt/etc/blacklist wget -N $URL0 old=$(cat /opt/etc/blacklist/md5.txt) new=$(cat /opt/etc/blacklist/*.lst | md5sum | head -c 32) if [ "$old" != "$new" ] then /opt/etc/init.d/S04bird1-ipv4 kill /opt/etc/init.d/S02bird-table kill cat /opt/etc/blacklist/ip.lst | sed 's/^/route /' | sed 's/$/\/32 via "'$VPN1'";/' > $ROUTE1 cat /opt/etc/blacklist/ip.lst | sed 's/^/route /' | sed 's/$/\/32 via "'$VPN2'";/' > $ROUTE2 echo $new > /opt/etc/blacklist/md5.txt /opt/etc/init.d/S02bird-table start /opt/etc/init.d/S04bird1-ipv4 start logger "RKN list reconfigured" fi logger "Leaving ${0##*/}." 5.Если всё прошло без ошибок, то можно пользоваться. Только подождать немного, пока bird переварит таблицы 🙂 С одним vpn подключением всё упрощается до примитивности. 1 Quote Link to comment Share on other sites More sharing options...
dsolo Posted January 5, 2021 Share Posted January 5, 2021 В родительской инструкции указано, что нужна Бета или Драфт прошивка, то есть на Релизе ваш метод работать не будет? Как продиагностировать работу системы? По инструкции с гитхаба не работает. До этого из проверок сделал следующее: установил OpenVPN, в приоритетах поставил его первым, пооткрывал сайтики, всё работает. Quote Link to comment Share on other sites More sharing options...
Mr.Scayger Posted January 6, 2021 Share Posted January 6, 2021 Диагностика ошибок для моего метода Открыть сайт 2ip.ru и посмотреть, какой ip показывает. Если с ovpn_br2, то работает. Если нет, искать ошибки. Всем скриптам естественно должны были быть даны права на выполнение командой "chmod +x". 1.Командой ps | grep bird проверить, запущен ли bird. В выводе будет строка типа "4413 root 52372 S bird4 -c /opt/etc/bird4.conf". Если не запущен, искать причины. Смотреть в логе ошибки, либо воспользоваться командой "bird4 -p -c /opt/etc/bird4.conf". 2.Командой "ip rule list" убедиться в наличии таблиц с номерами 1001,1002,1003. В выводе будут строки: 30001: from all lookup 1001 30002: from all lookup 1002 30003: from all lookup 1003 Если их нет, ошибка в скрипте /opt/etc/init.d/S02bird-table. Запустить его вручную "sh /opt/etc/init.d/S02bird-table start" и разобраться в ошибках, если есть. 3.В /opt/etc должны появиться файлы bird4-nl.list, bird4-us.list и созданный в п.2 bird4-us-force.list. В /opt/etc/blacklist файлы ip.lst и md5.txt. Если их нет, то ошибка в скрипте, созданном в п.4 1 Quote Link to comment Share on other sites More sharing options...
Mr.Scayger Posted January 6, 2021 Share Posted January 6, 2021 Важное дополнение - если на роутере включены ПРИОРИТЕТЫ ПОДКЛЮЧЕНИЙ и настроена ПРИВЯЗКА УСТРОЙСТВ К ПРОФИЛЯМ, то устройство, с которого производится проверка, должно находиться в ОСНОВНОМ ПРОФИЛЕ. Убил на это кучу времени, пока понял. Возможно, что если поиграть настройками дополнительных профилей, то заработает и с ними, но я не стал экспериментировать. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.