Jump to content

Выборочный роутинг через VPN туннель


Recommended Posts

В 11.02.2020 в 10:24, ankar84 сказал:

Сейчас попробовал установить ваши скрипты. 

Вот сразу несколько моментов для тех, кто делает это с нуля.

Ставим утилиту dig


opkg install bind-dig

Делаем скрипты исполняемыми:


chmod +x /opt/bin/unblock_vpn.sh
chmod +x /opt/etc/ndm/ifstatechanged.d/100-add_unblock_route.sh

Делаем ссылку в крон


ln -s /opt/bin/unblock_vpn.sh /opt/etc/cron.hourly/01unblock

Так же подправил шлюз, имя подключения и имя файла с целями на выборочную маршрутизацию на свои.

Дополнительно отмечу, что данная схема по умолчанию работает для устройств в Домашней сети (те устройства, что ходят через интерфейс br0)

Если вы, к примеру, подключаетесь к роутеру по L2TP и хотите так же обращаться к нужным ресурсам через VPN то необходимо добавить следующую строку:


ip rule add iif l2tp0 table 1000 priority 1778

То есть в моем случае скрипт уже будет выглядеть вот так:


#!/bin/sh

[ "$1" == "hook" ] || exit 0
[ "$change" == "link" ] || exit 0
[ "$id" == "Wireguard0" ] || exit 0

case ${id}-${change}-${connected}-${link}-${up} in
	Wireguard0-link-no-down-down)
		ip route flush table 1000
		ip rule del iif br0 table 1000 priority 1777 2>/dev/null
		ip rule del iif l2tp0 table 1000 priority 1778 2>/dev/null
	;;
	Wireguard0-link-yes-up-up)
		ip rule add iif br0 table 1000 priority 1777 2>/dev/null
		ip rule add iif l2tp0 table 1000 priority 1778 2>/dev/null
		/opt/bin/unblock_vpn.sh &
	;;
esac

exit 0

Итог:

image.png.554361a3a38329481da9600746eb8f0a.png

 

Сделал по Вашей схеме (также хочу чтобы бы обход был у l2tp клиентов) Но, не взлетело.

Ручной запуск в /opt/etc/ndm/ifstatechanged.d/ вызывает только реконект eoip/ipsec/l2tp соединений, таблица при этом остаётся пустой.

Что можно копнуть?)

Edited by karimovrt
Link to comment
Share on other sites

Немного поковырял....всё равно не завелось.

root@Onemix:~# ip rule list
0:      from all lookup local
10:     from all fwmark 0xffffcff lookup main
248:    from all lookup 248
1776:   from all lookup 1000
32766:  from all lookup main
32767:  from all lookup default
root@Onemix:~# ip route show table 1000
root@Onemix:~#

Таблица пустая почему-то...

Link to comment
Share on other sites

47 минут назад, karimovrt сказал:

Сделал по Вашей схеме (также хочу чтобы бы обход был у l2tp клиентов) Но, не взлетело.

Давайте по порядку. 

Выполнили необходимые переименования имен интерфейсов под свой VPN туннель?

В том же файле /opt/etc/ndm/ifstatechanged.d/100-add_unblock_route.sh нужно сделать замены в следующих строках вместо wireguard имя своего интерфейса

[ "$id" == "wireguard" ] || exit 0

wireguard-link-no-down-down)

wireguard-link-yes-up-up)

А в строках 10 и 13 предлагаю использовать более универсальную команду, чтобы из всех источников пакеты отправлялись в туннель, если адрес назначения из таблицы 1000

ip rule add from all table 1000 priority 1776

Скорее всего нужный вам интерфейс носит название VPNL2TPServer и тогда скрипт должен выглядеть вот так:

#!/bin/sh

[ "$1" == "hook" ] || exit 0
[ "$change" == "link" ] || exit 0
[ "$id" == "VPNL2TPServer" ] || exit 0

case ${id}-${change}-${connected}-${link}-${up} in
	VPNL2TPServer-link-no-down-down)
		ip route flush table 1000
		ip rule del from all table 1000 priority 1776 2>/dev/null
	;;
	VPNL2TPServer-link-yes-up-up)
		ip rule add from all table 1000 priority 1776 2>/dev/null
		/opt/bin/unblock_vpn.sh &
	;;
esac

exit 0

Но тут я могу и ошибаться, пробуйте.

57 минут назад, karimovrt сказал:

Ручной запуск в /opt/etc/ndm/ifstatechanged.d/ вызывает только реконект eoip/ipsec/l2tp соединений, таблица при этом остаётся пустой.

Нужно понять, заполняется ли вообще таблица.

Что дает выполнение команды /opt/bin/unblock_vpn.sh ?

Есть ли у вас файл /opt/etc/unblock-vpn.txt ? Есть ли в нем нужные вам данные?

В файле /opt/bin/unblock_vpn.sh, так же нужно провести несколько замен под свои данные:

ip route add table 1000 $cidr via 10.64.0.1 dev nwg1 2>/dev/null

ip route add table 1000 $addr via 10.64.0.1 dev nwg1 2>/dev/null

awk '{system("ip route add table 1000 "$1" via 10.64.0.1 dev nwg1 2>/dev/null")}'

Здесь нужно заменить 10.64.0.1 на IP адрес роутера интерфейса вашего L2TP туннеля, и nwg1 нужно заменить на имя вашего интерфейса L2TP туннеля.

Посмотреть имена всех интерфейсов можно командой ifconfig

Затем пробуем сначала успешно забить таблицу адресами и сетями и проверяем ее заполненность командой

ip route show table 1000

И если таблица заполнена нужными нам данными можно приступать к следующим шагам в диагностике запустить скрипт 

/opt/etc/ndm/ifstatechanged.d/100-add_unblock_route.sh

и проверить таблицу маршрутизации

ip rule list

Там должно быть правило 1776, которое направляет все пакеты на адреса и сети из таблицы 1000 в нужный туннель.

Если такое правило есть то можно приступать к последней стадии диагностики - проверять работу хука на остановку и поднятие туннеля.

В веб интерфейсе выключить тумблер туннеля. Подождать, проверить таблицу 1000 и список маршрутизации  -там должно быть чисто.

Затем снова включить тумблер туннеля и немного подождать. Затем снова проверить таблицу 1000 и список маршрутизации - таблица должна быть заполнена и на нее должен быть маршрут.

Link to comment
Share on other sites

6 минут назад, karimovrt сказал:

1776:   from all lookup 1000

Правило есть, это очень хорошо.

Осталось разобраться с заполнением таблицы. Я выше описал как это сделать.

Link to comment
Share on other sites

11 минуту назад, ankar84 сказал:

Правило есть, это очень хорошо.

Осталось разобраться с заполнением таблицы. Я выше описал как это сделать.

Интерфейсы везде поменял (nwg0); файл на месте (его удаление - вызывает ошибку скрипта - нет файла, что логично). Один раз (час назад таблица даже заполнилась, но я через vpn и фактическую работу проверить не смог, и собственно начал дальше изучать, и нашёл ip rule del from all table 1000 priority 1776 2>/dev/null).

ip route add table 1000 $cidr via 10.64.0.1 - тут именно адрес роутера? Он у меня 10.0.0.4, а адрес вышестоящего (amazon vps) 10.0.0.1

 

 

[ "$id" == "wireguard" ] || exit 0

wireguard-link-no-down-down)

 

Без нуля? Или с нулём как он написан с startup конфиге?

Edited by karimovrt
Link to comment
Share on other sites

1 час назад, karimovrt сказал:

ip route add table 1000 $cidr via 10.64.0.1 - тут именно адрес роутера? Он у меня 10.0.0.4, а адрес вышестоящего (amazon vps) 10.0.0.1

Адрес роутера на интерфейсе VPN. Видимо да, 10.0.0.4

1 час назад, karimovrt сказал:

[ "$id" == "wireguard" ] || exit 0

wireguard-link-no-down-down)

Тут я смотрел в журнале роутера когда дергал тумблер своего wireguard подключения. Что в логах написано, то и нужно в этот скрипт записать.

1 час назад, karimovrt сказал:

Без нуля? Или с нулём как он написан с startup конфиге?

В моем случае без нуля (имя брал из журнала Диагностики роутера).

У вас, возможно и с нулем, посмотрите как определяется в логах.

 

Обновление: сейчас у себя в логах глянул, у меня тоже с нулем - а именно вот так Wireguard0 называется это подключение. Но точно было с маленькой буквы и без нуля ранее.

А вот на 3.3.10 вот так. Пойду проверю работу схемы.

Обновление 2: да, у меня и в диагностике Wireguard0 и в скрипте Wireguard0 и все работает. Вот как выглядит мой скрипт:

~ # cat /opt/etc/ndm/ifstatechanged.d/100-add_unblock_route.sh
#!/bin/sh

[ "$1" == "hook" ] || exit 0
[ "$change" == "link" ] || exit 0
[ "$id" == "Wireguard0" ] || exit 0

case ${id}-${change}-${connected}-${link}-${up} in
        Wireguard0-link-no-down-down)
                ip route flush table 1000
                ip rule del from all table 1000 priority 1777
        ;;
        Wireguard0-link-yes-up-up)
                ip rule add from all table 1000 priority 1777
                /opt/bin/unblock_vpn.sh &
        ;;
esac

exit 0

 

Edited by ankar84
Link to comment
Share on other sites

Таблица начала заполняться, но впн клиент также не открывает сайты через туннель.

Долго долго висит без ответа 

отключение wiregaurd на сервере и на клиенте vpn ожидаемо заглушка от провайдера появляется

т.е. проблема в транзите трафика между впн клиентом и wireguard интерфейсом

 

Link to comment
Share on other sites

7 минут назад, karimovrt сказал:

Долго долго висит без ответа 

Тогда давайте посмотрим traceroute до узла в списке. Как я писал выше, для проверки я добавил 2ip.ua в список обхода. Вот что получается у меня:

~ # traceroute 2ip.ua
traceroute to 2ip.ua (77.123.139.189), 30 hops max, 38 byte packets
 1  172.16.82.5 (172.16.82.5)  173.835 ms  173.622 ms  173.751 ms
2 внешний адрес туннеля

То есть сразу же первым хопом мы должны получить второй конец тоннеля (в вашем случае это кажется будет 10.0.0.1) а у меня настроено по инструкциям из базы знаний сервер 172.16.82.1 и пир 172.16.82.5

Link to comment
Share on other sites

57 минут назад, ankar84 сказал:

Тогда давайте посмотрим traceroute до узла в списке. Как я писал выше, для проверки я добавил 2ip.ua в список обхода. Вот что получается у меня:

На роутере так и есть. 

starting traceroute to rutor.info...
traceroute to rutor.info (91.132.60.13), 30 hops maximum, 84 byte packets.
1 10.0.0.1 (10.0.0.1) 76.201 ms 76.125 ms 75.846 ms
А на клиенте vpn  превышен интервал ожидания для запроса.
 
Если запустить пинг, то тоже самое. Отключаешь wireguard на роутере - пинг сразу начинает проходить.
Интерфейсы все в режиме private.
 
Попробую сейчас в l2tp до того же сервера завернуть, а не через wireguard
Edited by karimovrt
Link to comment
Share on other sites

8 минут назад, karimovrt сказал:

А на клиенте vpn  превышен интервал ожидания для запроса.

В настройках пира туннеля Wireguard должна быть вот такая разрешенная сеть 0.0.0.0/0 (весть интернет)

image.png.78234b4899c4c3a7f0d39c77fab8efa6.png

Link to comment
Share on other sites

Чертовщина какая-то... Поменял везде интерфейс на ppp0 (l2tp коннект до vps), поменял ip. Сделал ребут. Пощелкал. И таблица пустая, и в ip rule list нету записи нужной.

 

В скрипте vpn-unlock в bin нужна строка 

ip route flush table 1000

?

Или достаточно этой же строки в /opt/etc/ndm/ifstatechanged.d/100-add_unblock_route.sh?

Edited by karimovrt
Link to comment
Share on other sites

Всё. У меня мозг взорвался....

Автоматически реконект l2tp до vps сервера ничего не делает.

Когда руками запустил скрипт обновления таблицы маршрутов, и добавил их командой ip rule add from all table 1000 priority 1776

Убедился, что таблица полная, маршруты есть...получив ровно то, что было с wireguard - vpn клиенты заблокированные ресурсы вообще перестают открывать и пинговать.

Отключаешь коннект до vps - пинг начинает проходить.

Link to comment
Share on other sites

20 минут назад, karimovrt сказал:

Всё. У меня мозг взорвался....

Моих знаний сети и Linux уже тоже явно не хватает для решения вашей проблемы.

Нужно звать @avn или еще кого-то из гуру.

 

Link to comment
Share on other sites

В общем для тех кто использует 

ip rule add from all table 1000 priority 1776

и хочет правила обхода для VPN клиентов роутера, НЕ ЗАБУДЬТЕ поставить галочку "Использовать для выхода в интернет" в свойствах Вашего vpn который используется для обхода блокировок и сместить ему приоритет вниз.

  • Upvote 1
Link to comment
Share on other sites

  • 2 weeks later...

Странные вещи происходят. Сменил способ подключения к VPN  c L2TP\IPSEC на WireGuard из-за нагрузки на проц Экстры и как следствия пониженной скорости канала. 

Поменял в двух скриптах L2TP на Wireguard0 и ppp0 на wg0, и адрес шлюза, но в таблицу 1000 не попадает ни одна запись.

Сами скрипты выполняются по событиям, в журнале появляется запись что добавлено 0 айпишек.

В ручную команда ip route add table 1000 8.8.8.8 via 10.0.0.1 dev nwg0  нормально добавляет в таблицу 1000 запись, а вот скрпитом нет, отчего я делаю вывод что проблема в той части скрипта, которая преобразует имя в адрес.

Но ведь ничего кроме интерфейса не менялось. Есть мысли?

Link to comment
Share on other sites

4 hours ago, Станислав Поветьев said:

Странные вещи происходят. Сменил способ подключения к VPN  c L2TP\IPSEC на WireGuard из-за нагрузки на проц Экстры и как следствия пониженной скорости канала. 

Поменял в двух скриптах L2TP на Wireguard0 и ppp0 на wg0, и адрес шлюза, но в таблицу 1000 не попадает ни одна запись.

Сами скрипты выполняются по событиям, в журнале появляется запись что добавлено 0 айпишек.

В ручную команда ip route add table 1000 8.8.8.8 via 10.0.0.1 dev nwg0  нормально добавляет в таблицу 1000 запись, а вот скрпитом нет, отчего я делаю вывод что проблема в той части скрипта, которая преобразует имя в адрес.

Но ведь ничего кроме интерфейса не менялось. Есть мысли?

Так может надо было не на wg0, а на nwg0 поменять в скрипте?

Link to comment
Share on other sites

1 час назад, avn сказал:

Так может надо было не на wg0, а на nwg0 поменять в скрипте?

Очепятка у меня в посте. Прописано nwg0

Говорю же что если в терминале лапками набрать ip route add table 1000 1.1.1.1 via 10.0.0.3 dev nwg0 то таблица заполнится.

А вот при вызове из скрипта нет. Не понимаю где собака зарыта

Link to comment
Share on other sites

Может кому будет интересно - я использую такой вариант - http://forums.zyxmon.org/viewtopic.php?f=5&t=5738&p=19019

Скрипт преобразовывает доменные имена в ip - сколько есть, столько ip и "маршрутизируется".

Работал раньше через openvpn, сейчас через wireguard. Про самостоятельную настройку wireguard сервака на VPS хостинге тут - http://forums.zyxmon.org/viewtopic.php?f=14&t=5758

  • Thanks 1
Link to comment
Share on other sites

Заработало, я сменил таблицу с 1000 на 1010 и айпишки стали добавляться в таблицу. Видимо где то старый сетевой интерфейс ppp0 прикипел к таблице 1000.

А разве после перезагрузки таблицы не очищаются и не создаются заново?

Link to comment
Share on other sites

  • 4 weeks later...

Накидал телеграмм бота на коленке для добавления новых адресов на основе  Управление роутером по Telegram

 

Если кто сам не хочет разбираться вот содержимое bashbot.sh :

#!/opt/bin/bash

UNBLOCKSCRIPT='/opt/bin/unblock_vpn.sh'
UNBLOCKLIST='/opt/etc/unblock_ips.txt'
UNAME=''
TOKEN=''
USEPROXY=''
URL='https://api.telegram.org/bot'$TOKEN
MSG_URL=$URL'/sendMessage?chat_id='
UPD_URL=$URL'/getUpdates?offset='
OFFSET=0
TIMEOUT='&timeout=30'

function send_message {
        res=$(curl $USEPROXY --insecure --data-urlencode "text=$2" "$MSG_URL$1&")
}

while true; do {
        res=$(curl $USEPROXY --insecure $UPD_URL$OFFSET$TIMEOUT)
        TARGET=$(echo $res | JSON.sh | egrep '\["result",0,"message","chat","id"\]' | cut -f 2)
        OFFSET=$(echo $res | JSON.sh | egrep '\["result",0,"update_id"\]' | cut -f 2)
        MESSAGE=$(echo $res | JSON.sh -s | egrep '\["result",0,"message","text"\]' | cut -f 2 | cut -d '"' -f 2)
        USER=$(echo $res | JSON.sh | egrep '\["result",0,"message","from","username"\]' | cut -f 2 | cut -d '"' -f 2)
        [ -z "$MESSAGE" ] || echo "[$(date +%Y.%m.%d_%H:%M:%S)][$USER] $MESSAGE" >> /opt/var/log/bashbot.log
        OFFSET=$((OFFSET+1))

        if [[ "$USER" != "$UNAME" ]]; then
                continue
        fi
        if [ $OFFSET != 1 ]; then
                if echo "$MESSAGE" | grep 'add .*'; then
                        addr=$(echo "$MESSAGE" | grep 'add .*' | sed 's|.* ||')
                        if grep "$addr" "$UNBLOCKLIST"; then
                                msg="Has already."
                        else
                           echo "$addr" >> "$UNBLOCKLIST"
                           source "$UNBLOCKSCRIPT" &
                           msg="$addr has been added."
                        fi
                elif  echo "$MESSAGE" | grep 'list'; then
                        msg="$(cat /opt/etc/unblock_ips.txt)"
                elif  echo "$MESSAGE" | grep 'table'; then
                        msg="$(ip route show table 1000)"
                else
                        msg="$MESSAGE"
                fi

                send_message "$TARGET" "$msg"
        fi

} &>/dev/null; done

 

UNAME - имя в телеграмм

USEPROXY - если используем прокси, как я ("--proxy <server>:<port> -U <login>:<password>"), либо оставляем пустым и перенаправляем все запросы через table 1000

Link to comment
Share on other sites

  • 5 months later...

Добрый день прошу помощи

Есть OpenVPN, название:  FFF-opvpn, Шлюз: 10.12.1.90

Что сделал:

1) opkg install bind-dig

2 ) mcedit /opt/bin/unblock_vpn.sh

#!/bin/sh

cut_local() {
	grep -vE 'localhost|^0\.|^127\.|^10\.|^172\.16\.|^192\.168\.|^::|^fc..:|^fd..:|^fe..:'
}

until ADDRS=$(dig +short google.com @localhost -p 53) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done
ip route flush table 1000

while read line || [ -n "$line" ]; do

	[ -z "$line" ] && continue
	[ "${line:0:1}" = "#" ] && continue

	cidr=$(echo $line | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}')
	if [ ! -z "$cidr" ]; then
		ip route add table 1000 $cidr via 10.12.1.90 dev ovpn_br0 2>/dev/null
		continue
	fi

	addr=$(echo $line | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')
	if [ ! -z "$addr" ]; then
		ip route add table 1000 $addr via 10.12.1.90 dev ovpn_br0 2>/dev/null
		continue
	fi

	dig A +short $line @localhost -p 53 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | cut_local | awk '{system("ip route add table 1000 "$1" via 10.12.1.90 dev ovpn_br0 2>/dev/null")}'

done < /opt/etc/unblock-vpn.txt

 

3) chmod +x /opt/bin/unblock_vpn.sh

4) mcedit /opt/etc/ndm/ifstatechanged.d/100-add_antizapret_route.sh 

#!/bin/sh

[ "$1" == "hook" ] || exit 0
[ "$change" == "link" ] || exit 0
[ "$id" == "FFF-opvpn" ] || exit 0

case ${id}-${change}-${connected}-${link}-${up} in
	FFF-opvpn-link-no-down-down)
		ip route flush table 1000
		ip rule del iif br0 table 1000 priority 1777 2>/dev/null
	;;
	FFF-opvpn-link-yes-up-up)
		ip rule add iif br0 table 1000 priority 1777 2>/dev/null
		/opt/bin/unblock_vpn.sh &
	;;
esac

exit 0

5) chmod +x mcedit /opt/etc/ndm/ifstatechanged.d/100-add_antizapret_route.sh 

6) mcedit /opt/etc/unblock-vpn.txt

kinogo.by
z1.fm

 

И не работает, сайты заблокированы. При выполнении: ip route show table 1000 ничего не отображается  

Edited by nurman
Link to comment
Share on other sites

Получилось сделать  ip route show table 1000

~ # ip route show table 1000
104.18.56.14 via 10.12.0.78 dev ovpn_br0
104.18.57.14 via 10.12.0.78 dev ovpn_br0
104.31.86.209 via 10.12.0.78 dev ovpn_br0
104.31.87.209 via 10.12.0.78 dev ovpn_br0
172.67.137.2 via 10.12.0.78 dev ovpn_br0
172.67.168.48 via 10.12.0.78 dev ovpn_br0
186.2.163.245 via 10.12.0.78 dev ovpn_br0
 

Где 10.12.0.78  это шлюз opvpn (в Статических маршрутах), но обход блокировки не работает

Link to comment
Share on other sites

Добрый день, всем! Прошу помощи. Настроил скрипт unblock-static-route - работал хорошо (не считая, что постоянно приходилоь наполнять vpnsitelist.txt. Подключение было через PPPOE (МТС) + OpenVPN-клиент. Сейчас переключился на другого провайдера - ДОМ.РУ, у которого какое-то хитрое подключение (не нужно указывать никакие настройки в роутере, типа PPPOE, L2TP и так далее, а привязка идет через start.domru.ru, какое-то хитрое DHCP). Я вижу, что на роутере поднялось OpenVPN-соединение, также вижу, что маршруты добавились скриптом, но реально не проходит соединение к выбранным адресам через клиента OpenVPN. Подскажите, что еще нужно сделать?

  • Upvote 1
Link to comment
Share on other sites

  • 1 month later...
  • 2 months later...

Коллеги, подскажите!!!

Скрипт из первого поста темы отлично работал два года. Но флешка сломалась.

Пришлось переустановить entware полностью.

И неожиданно обнаружилось, что в последнем entware больше нет egrep. Есть только grep.

~ # egrep
-sh: egrep: not found

И эта сточка 

    for j in `nslookup $i | egrep -v 127.0.0.1 | awk '/Addr/ {print $3}' | egrep -v ":"`; do

 

Выдает вот такую ошибку:

Opkg::Manager: /opt/etc/ndm/ifstatechanged.d/addroute.sh: /opt/etc/ndm/ifstatechanged.d/addroute.sh: line 1: egrep: not found.

Заменил egrep тупо на grep. Оно в целом работает, но цикл выполняется несколько лишних раз:

Янв 14 18:50:51 root
Add 37.252.15.56 host to static route to unblock kino.pub
Янв 14 18:50:52 root
Add 195.82.146.214 host to static route to unblock rutracker.org
...

Янв 14 18:50:57 root
Host 37.252.15.56 is already in static route to unblock kino.pub
Янв 14 18:50:58 root
Host 195.82.146.214 is already in static route to unblock rutracker.org

И вроде бы страшного-то ничего нет, но как-то не аккуратно. 

Есть какое-нибудь решение проблемы? Как добавить egrep?

Ну или как-то можно скрипт доработать под чистый grep?

 

ЗЫ. Хотя, я может чего и не понял, может так и задумано? Может egrep тут и не виноват?

Спасибо

 

Edited by Макс Грибков
Link to comment
Share on other sites

  • 1 month later...

Все здравствуйте)

Во первых, позвольте поблагодарить авторов за труды - очень полезные скрипты в наше время.
Благодарю Вас.

Теперь, пару слов о собственном опыте установки данных скриптов.
Основные затруднения были вызваны тем, что не было понимания какой конкретно адрес шлюза вставлять необходимо и какое название интерфейса вписывать.
Задача моя тем более усложнялась, что я выбрал вариант туннеля c IKEV2.
Так же, проблема возникала при добавлении "хостов" или имен сайтов в файл /opt/etc/unblock-vpn.txt - их адреса просто не добавлялись в таблицу 1000 (возможно я что-то делал не так).

Ниже привожу немного усовершенствованный скрипт /opt/bin/unblock_vpn.sh, созданный исключительно на основе двух предыдущих (еще раз благодарность авторам)

Усовершенствования следующие:

  1. Автоматическая подстановка адреса шлюза и названия интерфейса туннеля (нет необходимости в ручную что-либо подставлять).
  2. Вывод дополнительной отладочной информации в консоль и в файл лога самого устройства
  3. В файл /opt/etc/unblock-vpn.txt можно добавлять 
    1. IP адреса, например 37.252.15.56 (было ранее)
    2. Целые сегменты сети, например 91.108.16.0/22 (было ранее)
    3. Имена хостов/сайтов, например kinogo.by (ранее не всегда в таблицу прописывались их адреса). 

Ограничения скрипта следующие:

  1. Подстановка IP адреса шлюза и названия интерфейса туннеля будут работать корректно ТОЛЬКО в случае, если было поднято не более одного VPN туннеля, адрес, которого отображается при исполнении команды ip rule list
  2. Сам скрипт исполняется с небольшой задержкой из-за возврата к предыдущему варианту поиска IP адресов для названия сайтов при помощи команды nslookup, вместо dig.
  3. В связи с использованием команды nslookup иногда у меня появлялась ошибка "nslookup: can't resolve 'XXXX.XX': Temporary failure in name resolution". Лечил перезагрузкой устройства.

Доработанный код скрипта /opt/bin/unblock_vpn.sh:

#!/bin/sh

log_mess="========== The route table 1000 is being filled in ============"
echo $log_mess                                                                                

IP_ROUTE="$(ip rule list | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')"      
INFACE="$(ifconfig | grep "$IP_ROUTE" -B1 | head -1 |cut -d " " -f1)"

log_mess="Interface is $INFACE and gateway is $IP_ROUTE"
echo $log_mess

until ADDRS=$(dig +short google.com @localhost -p 53) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done
ip route flush table 1000

while read line || [ -n "$line" ]; do

	[ -z "$line" ] && continue
	[ "${line:0:1}" = "#" ] && continue

	cidr=$(echo $line | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}')
	if [ ! -z "$cidr" ]; then
		ip route add table 1000 $cidr via "$IP_ROUTE" dev "$INFACE" 2>/dev/null
		log_mess="Add $cidr NET to static route to unblock" 
                echo $log_mess                                                                                                
		logger $log_mess
		continue
	fi

	addr=$(echo $line | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')
	if [ -z "$addr" ]; then
		addr=$(nslookup "$line" | grep -Ev 127.0.0.1 | awk '/Addr/ {print $3}' | grep -Ev ":" )
	fi
	if [ ! -z "$addr" ]; then
		for ip_host in $addr
		do
			ip route add table 1000 $ip_host via "$IP_ROUTE" dev "$INFACE" 2>/dev/null
			log_mess="Add $ip_host HOST to static route to unblock $line site"
			echo $log_mess
			logger $log_mess
			continue
		done
	fi

done < /opt/etc/unblock-vpn.txt

echo "---------------------------------------------------"
log="$(ip route show table 1000 | wc -l) ips added to route table 1000"
echo $log
logger $log

log_mess="========== The route table is filled in ============"
echo $log_mess  

 

Скрипт /opt/etc/ndm/ifstatechanged.d/100-add_antizapret_route.sh не менял, так как не ведаю пока, как автоматом получить название интерфейса туннеля из CLI в Entware.
Если такая возможность существует - прошу знающих людей поделиться. Возможно есть и иные варианты.

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...