Jump to content

WireGuard невыносимо тупит при выборочной маршрутизации.


Recommended Posts

 

Итак, Keenetic Hopper с Entware. Я написал несколько скриптов для выборочной маршрутизации. Все эти скрипты работают нормально, никаких ошибок во время исполнения нет, да и маршрутизация работает. Ping через Wireguard работает нормально, но проблемы возникают, когда я захожу в браузер, всё очень сильно тормозит.

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

Вот конфигурация Wireguard:

309699525_2022-10-06212400.thumb.png.2bde461468333a21e3b1401e6d8fcb0b.png

Вот мои скрипты:

# /opt/etc/ndm/fs.d/100_hirkn-ipsets.sh

#!/bin/sh

[ "$1" != "start" ] && exit 0

echo " --- HIRKN ENTRY POINT --- "

RKN_SET_FILE="/opt/root/rkn.lst"
GOOGLE_SET_FILE="/opt/root/google.lst"
CUSTOM_SET_FILE="/opt/root/custom.lst"

function create_ipset()
{
        IPSET_NAME=$1
        ipset create $IPSET_NAME hash:net family inet -!
}

function fill_ipset()
{
        FILE="$1"
        IPSET_NAME="$2"
        data=$(cat $FILE)
        for row_data in $data
        do
                ipset add $IPSET_NAME ${row_data} -!
        done
}

function create_and_fill_ipset() {
        IPSET_NAME="$1"
        FILE="$2"
        create_ipset $IPSET_NAME
        fill_ipset $FILE $IPSET_NAME
}

if [ -z "$(ip route list table 1)" ]; then
    ip rule add fwmark 1 table 1
    ip route add default dev nwg0 table 1
fi

create_ipset "HIRKN"
create_ipset "HIGOOGLE"
create_ipset "HICUSTOM"

#fill_ipset $RKN_SET_FILE "HIRKN"
#fill_ipset $GOOGLE_SET_FILE "HIGOOGLE"
#fill_ipset $CUSTOM_SET_FILE "HICUSTOM"

#create_and_fill_ipset "HIRKN" $RKN_SET_FILE
#create_and_fill_ipset "HIGOOGLE" $GOOGLE_SET_FILE
#create_and_fill_ipset "HICUSTOM" $CUSTOM_SET_FILE

exit 0

 

# /opt/etc/ndm/netfilter.d/99_hirkn-fwmarks.sh

#!/bin/sh

[ "$type" != "iptables" ] && exit 0
[ "$table" != "mangle" ] && exit 0

echo "HIRKN: Creating $type rule on table $table !"

[ -z "$(iptables-save | grep HIRKN)" ] && \
	iptables -w -A PREROUTING -t mangle -m set --match-set HIRKN dst,src -j MARK --set-mark 1
[ -z "$(iptables-save | grep HIGOOGLE)" ] && \
	iptables -w -A PREROUTING -t mangle -m set --match-set HIGOOGLE dst,src -j MARK --set-mark 1
[ -z "$(iptables-save | grep HICUSTOM)" ] && \
	iptables -w -A PREROUTING -t mangle -m set --match-set HICUSTOM dst,src -j MARK --set-mark 1

exit 0

В основном я использую сет HIRKN, в него закачивается rkn.lst, который берется отсюда: https://antifilter.download/list/allyouneed.lst

Если у кого-то есть догадки, я с радостью выслушаю! 

P.S.: Число записей в сете не влияют, хоть одна запись, хоть 10000 - одно и то же

Link to comment
Share on other sites

Ваша проблема связана с несовместимостью данного способа обхода блокировок с сетевыми ускорителями трафика (fastnat и hwnat).

Либо отключайте эти ускорители через cli, либо воспользуйтесь моим советом в другой теме:

https://forum.keenetic.com/topic/8106-выборочный-роутинг-через-vpn-туннель/?do=findComment&comment=152687

  • Upvote 1
Link to comment
Share on other sites

11 час назад, R0cky сказал:

Ваша проблема связана с несовместимостью данного способа обхода блокировок с сетевыми ускорителями трафика (fastnat и hwnat).

Либо отключайте эти ускорители через cli, либо воспользуйтесь моим советом в другой теме:

https://forum.keenetic.com/topic/8106-выборочный-роутинг-через-vpn-туннель/?do=findComment&comment=152687

Большое спасибо, информация из темы, на которую вы ссылались была весьма полезной, особенно CONNMARK.

Итак, после бессонной ночи я смог заставить это всё работать. Скрипты выложил на gist для удобства: https://gist.github.com/nukdokplex/884c7d2a213f5a10344738184c6816b2

Link to comment
Share on other sites

Рекомендую в вашем скрипте использовать вместо

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

такую редакцию команды:

iptables -t mangle -A PREROUTING -m set --match-set $IPSET dst -j CONNMARK --restore-mark

Это позволит не восстанавливать маркировку всех без исключения пакетов в цепочке PREROUTING (что черевато нарушением логики работы политик роутера), а только тех, в которых ип адрес назначения включен в нужный список ipset

Edited by R0cky
Link to comment
Share on other sites

7 часов назад, nukdokplex сказал:

Итак, после бессонной ночи я смог заставить это всё работать.

Вот еще вариант. Пост от 13 июня

Маркируем пакеты для 0xffffd02
iptables -t mangle -I _NDM_HOTSPOT_PRERT -p tcp -i br0 -s 192.168.1.2/32 -j RETURN
iptables -t mangle -I _NDM_HOTSPOT_PRERT -p tcp -i br0 -s 192.168.1.2/32 -j CONNMARK --save-mark 
iptables -t mangle -I _NDM_HOTSPOT_PRERT -p tcp -i br0 -s 192.168.1.2/32 -m set --match-set netflix dst -j MARK --set-mark 0xffffd02

Итог
Chain _NDM_HOTSPOT_PRERT (1 references)
 pkts bytes target     prot opt in     out     source               destination         
  972 85639 MARK       tcp  --  br0    *       192.168.1.2        0.0.0.0/0            match-set netflix dst MARK set 0xffffd02
 2410  305K CONNMARK   tcp  --  br0    *       192.168.1.2        0.0.0.0/0            CONNMARK save
 2418  306K RETURN     tcp  --  br0    *       192.168.1.2        0.0.0.0/0 

Описание

Цитата

Отличие CONNMARK от простого MARK в том, что первый маркирует соединения, а второй - пакеты (через ip rule пролетает именно пакет MARK).

Тут два варианта один который выше второй который описан тут

Вариант 1 - MARK -> CONNMARK --save-mark

Chain _NDM_HOTSPOT_PRERT (1 references)
 pkts bytes target     prot opt in     out     source               destination         
  972 85639 MARK       tcp  --  br0    *       192.168.1.2        0.0.0.0/0            match-set netflix dst MARK set 0xffffd02
 2410  305K CONNMARK   tcp  --  br0    *       192.168.1.2        0.0.0.0/0            CONNMARK save
 2418  306K RETURN     tcp  --  br0    *       192.168.1.2        0.0.0.0/0 

1. MARK пакета = "-j MARK --set-mark 0xffffd02"

2. CONNMARK save для сохранения метки пакета на все соединение "-j CONNMARK --save-mark"

3. "-j RETURN" в данном случае просто выйти из таблицы, так как после "--save-mark" пакет остается в данной таблице

Скрытый текст
~ # iptables -t mangle -nvL
Chain PREROUTING (policy ACCEPT 2860 packets, 725K bytes)
 pkts bytes target     prot opt in     out     source               destination         
  371  170K _NDM_PREROUTING_MC  all  --  *      *       0.0.0.0/0            224.0.0.0/4         
 2860  725K _NDM_IPSEC_PREROUTING  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 2860  725K _NDM_HOTSPOT_PRERT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 2860  725K _NDM_SSTPSERVER_MARK  all  --  *      *       0.0.0.0/0            0.0.0.0/0 
...
Chain _NDM_HOTSPOT_PRERT (1 references)
 pkts bytes target     prot opt in     out     source    
...

 

Примечание порядок именно такой из-за ключа "iptables -I ...."

**********

В вашем случае Вариант 2 - "CONNMARK --set-mark" -> "CONNMARK --restore-mark"

iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -m set --match-set $IPSET dst -j CONNMARK --set-mark 0x1000
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

где CONNMARK --restore-mark = восстановить метку пакета из метки всего соединения, заданного в CONNMARK.

  • Thanks 2
Link to comment
Share on other sites

8 часов назад, R0cky сказал:

Рекомендую в вашем скрипте использовать вместо

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

такую редакцию команды:

iptables -t mangle -A PREROUTING -m set --match-set $IPSET dst -j CONNMARK --restore-mark

Это позволит не восстанавливать маркировку всех без исключения пакетов в цепочке PREROUTING (что черевато нарушением логики работы политик роутера), а только тех, в которых ип адрес назначения включен в нужный список ipset

Действительно, так и сделаю. Кое о чём я еще умолчал. Wireguard у меня поднят на Ubuntu-сервере, там надо было добавить в /etc/sysctl.conf вот эти строчки: 

net.ipv4.ip_forward=1
net.ipv4.tcp_fwmark_accept=1
net.ipv4.netfilter.ip_conntrack_fastnat=0

Последняя, как я понял, выключает Fastnat. Кстати говоря, некоторые сайты почему-то перестали открываться через выборочный роутинг, например speedtest.com.

2 часа назад, vasek00 сказал:

Вариант 1 - MARK -> CONNMARK --save-mark

Этот вариант тоже обязательно попробую, звучит неплохо.

Link to comment
Share on other sites

Цитата

нужен рабочий клиент который будет висеть в профиле WG2

Это ужасный костыль. Достаточно этому клиенту по каким либо причинам отвалиться и как я понимаю весь обход блокировок тут же упадет. Так?

Link to comment
Share on other sites

3 часа назад, R0cky сказал:

Это ужасный костыль. Достаточно этому клиенту по каким либо причинам отвалиться и как я понимаю весь обход блокировок тут же упадет. Так?

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

Не хотите " костыль " можно создать таблицу ручквми, суть была просто взять уже готовую таблицу маршрутизации которая промаркирована.

  • Thanks 1
Link to comment
Share on other sites

7 часов назад, vasek00 сказал:

Не хотите " костыль " можно создать таблицу ручквми, суть была просто взять уже готовую таблицу маршрутизации которая промаркирована.

Зачем нужен гемор с созданием своих таблиц, когда есть вполне рабочий вариант 2 (по сути, использующий тот же метод)  без всяких таблиц и заворачивания в них пакетов?

Link to comment
Share on other sites

8 часов назад, vasek00 сказал:

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

 

Использовать наработки прошивки это правильно и здорово. Но не ценой постоянного поддержания аптайма дополнительного устройства в домашней сети только для целей обхода блокировок. Это вносит очень большую не стабильность и общую не надежность метода. Особенно когда обходом блокировок пользуешься не только из домашней сети, но и не находясь дома при помощи впн подключений к роутеру.

Edited by R0cky
Link to comment
Share on other sites

2 часа назад, R0cky сказал:

Зачем нужен гемор с созданием своих таблиц, когда есть вполне рабочий вариант 2 (по сути, использующий тот же метод)  без всяких таблиц и заворачивания в них пакетов?

Удачи вам в данном варианте.

Каждый решает сам что и как использовать.

  • Thanks 1
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.

 Share

  • Recently Browsing   0 members

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