Jump to content

ipset-dns для выборочного роутинга


Recommended Posts

Подскажите, пожалуйста, где я ошибаюсь. Уже весь мозг сломал себе. Есть два рабочих подключения vpn wireguard. Настроен ipset-dns по методу из первого. Все прекрасно работает. Пытаюсь добавить второе подключение (нужно для одного из приложений)

Последовательность действий.

 1. Разархивирую скаченный архив

2. Вношу свои данные в файл myset.conf

3. Все 5 файлов, которые были в архиве, переношу в роутер - в папку opt/etc

4. В ssh терминале вхожу в данную папку (cd /opt/etc) и пробую запустить скрипт makefile.

Пробую команды

- make

-make start

-makefile start

 И...ничего  не происходит. Или я на каком-то этапе что-то не так делаю или я уже даже не знаю. Огромная просьба помочь, кто знает. Заранее спасибо!

Link to comment
Share on other sites

  • 2 weeks later...
  • Replies 94
  • Created
  • Last Reply

Top Posters In This Topic

В 26.04.2024 в 15:36, zako сказал:

Подскажите, пожалуйста, алгоритм действий. Куда нужно поместить эти файлы, нужно ли их распаковывать и как запустить Makefile. 

Там просто набор дубликатов скриптов исходного решения с чуть подправленными именами. Если очень хочется, можно просто положить рядом с оригинальными. 
Как мне кажется, не оптимальный вариант, проще прописать несколько вариантов ВПН сразу в исходные скрипты и запускать по копии ipset-dns на своём порту для каждого.

На коленке набросал для маршрутов через мои WG и ss-redir, вроде работает, но прошу отнестись с осторожностью:
 

Скрытый текст

тупо задваиваем конфиг  

cat /opt/etc/bypass.conf

DNS_1=1.1.1.1
SET_NAME_1=bypass_1
VPN_NAME_1=nwg0
VPN_SUBNET_1=172.16.0.2/24
DNS_2=8.8.8.8
SET_NAME_2=bypass_2
VPN_NAME_2=br0
VPN_OUTPORT_2=1082

поднимаем два экземпляра ipset-dns, каждый по своему ipset 

cat /opt/etc/init.d/S52ipset-dns

#!/bin/sh

PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

. /opt/etc/bypass.conf

if [ "$1" = "start" ]; then
    ipset create $SET_NAME_1 hash:ip timeout 86400
    ipset add $SET_NAME_1 $DNS_1
    ip rule add fwmark 1001 table 1001
    ipset-dns $SET_NAME_1 $SET_NAME_1 0.0.0.0:5353 $DNS_1
#
    ipset create $SET_NAME_2 hash:ip timeout 86400
    ipset add $SET_NAME_2 $DNS_2
    ip rule add fwmark 1002 table 1002
    ipset-dns $SET_NAME_2 $SET_NAME_2 0.0.0.0:5454 $DNS_2
fi

Добавляем маршруты при переподнятии интерфейса. На самом деле маршруты для ss-redir в этом примере не будут пересоздаваться, т.к. это прокси, а не интерфейс, и это надо привязывать или к процессу или к факту соединения, но для примера сойдёт, т.к. маршруты добавятся при старте роутера. 

 cat /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh

#!/bin/sh

. /opt/etc/bypass.conf

[ "$1" == "hook" ] || exit 0
[ "${connected}-${link}-${up}" == "yes-up-up" ] || exit 0
# do not need route to ss, usinng proxy instead
[ "$system_name" == "br0" ] && exit 0

if [ "$system_name" == "$VPN_NAME_1" ] &&
   [ -n "$(ipset --quiet list $SET_NAME_1)" ] &&
   [ -z "$(ip route list table 1001)" ]; then
    ip route add default dev $system_name table 1001
fi

if [ "$system_name" == "$VPN_NAME_2" ] &&
   [ -n "$(ipset --quiet list $SET_NAME_2)" ] &&
   [ -z "$(ip route list table 1002)" ]; then
    ip route add default dev $system_name table 1002
fi

и создаём правила, если их нет

cat /opt/etc/ndm/netfilter.d/010-bypass-netfilter.sh

#!/bin/sh

. /opt/etc/bypass.conf

[ "$type" == "ip6tables" ] && exit
[ "$table" != "mangle" ] && exit

if [ -n "$(ip link list | grep $VPN_NAME_1)" ] &&
   [ -n "$(ipset --quiet list $SET_NAME_1)" ] &&
   [ -z "$(iptables-save | grep  $SET_NAME_1)" ]; then
     iptables -w -t mangle -A PREROUTING ! -s $VPN_SUBNET_1 -m conntrack --ctstate NEW -m set --match-set $SET_NAME_1 dst -j CONNMARK --set-mark 1001
     iptables -w -t mangle -A PREROUTING ! -s $VPN_SUBNET_1 -m set --match-set $SET_NAME_1 dst -j CONNMARK --restore-mark
fi
# Shadowsocks
if [ -n "$(ipset --quiet list $SET_NAME_2)" ] &&
   [ -z "$(iptables-save | grep  $SET_NAME_2)" ]; then
     iptables -I PREROUTING -w -t nat -i $VPN_NAME_2 -p tcp -m set --match-set $SET_NAME_2 dst -j REDIRECT --to-port $VPN_OUTPORT_2
     iptables -I PREROUTING -w -t nat -i $VPN_NAME_2 -p udp -m set --match-set $SET_NAME_2 dst -j REDIRECT --to-port $VPN_OUTPORT_2
fi


 

  • Thanks 1
Link to comment
Share on other sites

@Alex T Спасибо! Вечером буду пробовать настроить. Уточню еще такой момент.

А я правильно понимаю, что если у меня два подключения WG, то нужно по аналогии поменять так:

1) В bypass.conf:

22 часа назад, Alex T сказал:
VPN_OUTPORT_2=1082

Тут вместо этой строки вставляю свои данные 2го подключения: 

VPN_SUBNET_2=x.x.x.x/x

2) А в 010-bypass-netfilter.sh

22 часа назад, Alex T сказал:
# Shadowsocks
if [ -n "$(ipset --quiet list $SET_NAME_2)" ] &&
   [ -z "$(iptables-save | grep  $SET_NAME_2)" ]; then
     iptables -I PREROUTING -w -t nat -i $VPN_NAME_2 -p tcp -m set --match-set $SET_NAME_2 dst -j REDIRECT --to-port $VPN_OUTPORT_2
     iptables -I PREROUTING -w -t nat -i $VPN_NAME_2 -p udp -m set --match-set $SET_NAME_2 dst -j REDIRECT --to-port $VPN_OUTPORT_2
fi

 

Нужно будет немного исправить так (добавить еще строку [ -n "$(ip link list | grep $VPN_NAME_2)" ] &&) ?

if [ -n "$(ip link list | grep $VPN_NAME_2)" ] &&
   [ -n "$(ipset --quiet list $SET_NAME_2)" ] &&
   [ -z "$(iptables-save | grep  $SET_NAME_2)" ]; then
     iptables -I PREROUTING -w -t nat -i $VPN_NAME_2 -p tcp -m set --match-set $SET_NAME_2 dst -j REDIRECT --to-port $VPN_OUTPORT_2
     iptables -I PREROUTING -w -t nat -i $VPN_NAME_2 -p udp -m set --match-set $SET_NAME_2 dst -j REDIRECT --to-port $VPN_OUTPORT_2
fi

 

Link to comment
Share on other sites

5 минут назад, zako сказал:

то нужно по аналогии поменять так

1. Да.

2.Проще даже скопировать блок для первого  vpn и подправить _1 на _2 в переменных, и номер таблицы.

 Если уж править пример, то гораздо важнее поправить создаваемые правила iptables, в случае shadowsocks там идёт не пометка пакетов, а переадресация их на порт прокси. А для WG нужно будет --set-mark 1002. (ну или ваша таблица)
 

Скрытый текст

[ -n "$(ip link list | grep $VPN_NAME_1)" ] && в данном случае, одно из условий, выполнение которого требуется, чтобы добавить правила, а именно - что в списке интерфейсов вообще есть подстрока, которую мы обозначили переменной $VPN_NAME_1 (ну или _2)

[ -n - вот это вот, проверка на то, что команда вернула непустой ответ

[ -z  - поверка на пустой

Все три условия просто уменьшают шанс лишнего добавления или задвоения правил. Чтобы скрипт не тратил время на попытки добавить правила на несуществующий VPN и не сыпал ошибками в логи. 

Самое важное условие здесь [ -z "$(iptables-save | grep  $SET_NAME_2)" ] - оно разрешает добавить правила, только если ЕЩЁ нет правил работающих с нашим $SET_NAME_2

При этом, как часто бывает в  "наколеночных" скриптах, такое условие, может мешать, если уже существуют правила не укладывающиеся в логику скрипта. Или есть наборы, имена которых входят друг в друга(например set_1 и set_12)

 

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

  • Recently Browsing   0 members

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