Comments 107
А вот UDP — очень полезная вещь для туннелей, поскольку не получается ситуаций TCP over TCP с ужасным оверхедом и задержками. Да и UDP over TCP тоже не айс — убивает весь смысл UDP.
Можно найти у знакомых ненужный роутер, поддерживающий openwrt и на нём завести всё что захотите (если памяти хватит).
Но да, извращение страшное.
1. Поднять VPN до VPS
2. Создать список IP адресов
3. Создать правило в фаерволле, которое будет маркировать пакеты, попадающие в список IP
4. Пускать маркированный траффик в VPN
Как бонус, есть скрипт, который по крону выкачивает с гитхаба список запрещенных подсетей, парсит и добавляет в п.2.
Замерил с помощью iperf3, по два теста через провайдера и через туннель:
koala@x220 ~> iperf3 -c speedtest.serverius.net -p 5002
Connecting to host speedtest.serverius.net, port 5002
[ 4] local 192.168.50.232 port 59668 connected to 178.21.16.76 port 5002
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 9.49 MBytes 79.6 Mbits/sec 5 861 KBytes
[ 4] 1.00-2.00 sec 8.20 MBytes 68.8 Mbits/sec 4 246 KBytes
[ 4] 2.00-3.00 sec 4.54 MBytes 38.1 Mbits/sec 70 192 KBytes
[ 4] 3.00-4.00 sec 3.60 MBytes 30.2 Mbits/sec 38 153 KBytes
[ 4] 4.00-5.00 sec 2.80 MBytes 23.5 Mbits/sec 35 120 KBytes
[ 4] 5.00-6.00 sec 2.73 MBytes 22.9 Mbits/sec 0 134 KBytes
[ 4] 6.00-7.00 sec 2.92 MBytes 24.5 Mbits/sec 0 150 KBytes
[ 4] 7.00-8.00 sec 3.36 MBytes 28.1 Mbits/sec 0 167 KBytes
[ 4] 8.00-9.00 sec 3.67 MBytes 30.8 Mbits/sec 0 182 KBytes
[ 4] 9.00-10.00 sec 3.48 MBytes 29.2 Mbits/sec 44 146 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 44.8 MBytes 37.6 Mbits/sec 196 sender
[ 4] 0.00-10.00 sec 41.1 MBytes 34.4 Mbits/sec receiver
iperf Done.
koala@x220 ~> iperf3 -c speedtest.serverius.net -p 5002
Connecting to host speedtest.serverius.net, port 5002
[ 4] local 192.168.50.232 port 59676 connected to 178.21.16.76 port 5002
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 7.69 MBytes 64.5 Mbits/sec 10 567 KBytes
[ 4] 1.00-2.00 sec 7.77 MBytes 65.2 Mbits/sec 16 298 KBytes
[ 4] 2.00-3.00 sec 4.78 MBytes 40.1 Mbits/sec 70 230 KBytes
[ 4] 3.00-4.00 sec 3.36 MBytes 28.1 Mbits/sec 82 124 KBytes
[ 4] 4.00-5.00 sec 2.49 MBytes 20.8 Mbits/sec 0 141 KBytes
[ 4] 5.00-6.00 sec 2.73 MBytes 23.0 Mbits/sec 0 151 KBytes
[ 4] 6.00-7.00 sec 2.92 MBytes 24.5 Mbits/sec 0 167 KBytes
[ 4] 7.00-8.00 sec 3.23 MBytes 27.1 Mbits/sec 0 181 KBytes
[ 4] 8.00-9.00 sec 2.92 MBytes 24.5 Mbits/sec 38 143 KBytes
[ 4] 9.00-10.00 sec 2.92 MBytes 24.5 Mbits/sec 0 168 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 40.8 MBytes 34.2 Mbits/sec 216 sender
[ 4] 0.00-10.00 sec 37.1 MBytes 31.1 Mbits/sec receiver
iperf Done.
koala@x220 ~> iperf3 -c speedtest.serverius.net -p 5002
Connecting to host speedtest.serverius.net, port 5002
[ 4] local 192.168.50.232 port 59702 connected to 178.21.16.76 port 5002
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 3.91 MBytes 32.8 Mbits/sec 15 341 KBytes
[ 4] 1.00-2.00 sec 4.41 MBytes 37.0 Mbits/sec 0 350 KBytes
[ 4] 2.00-3.00 sec 4.35 MBytes 36.5 Mbits/sec 0 358 KBytes
[ 4] 3.00-4.00 sec 4.60 MBytes 38.6 Mbits/sec 0 367 KBytes
[ 4] 4.00-5.00 sec 3.80 MBytes 31.9 Mbits/sec 59 291 KBytes
[ 4] 5.00-6.00 sec 3.31 MBytes 27.8 Mbits/sec 24 226 KBytes
[ 4] 6.00-7.00 sec 3.31 MBytes 27.8 Mbits/sec 0 247 KBytes
[ 4] 7.00-8.00 sec 2.51 MBytes 21.1 Mbits/sec 48 132 KBytes
[ 4] 8.00-9.00 sec 1.90 MBytes 15.9 Mbits/sec 0 150 KBytes
[ 4] 9.00-10.00 sec 2.15 MBytes 18.0 Mbits/sec 0 156 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 34.3 MBytes 28.7 Mbits/sec 146 sender
[ 4] 0.00-10.00 sec 32.2 MBytes 27.0 Mbits/sec receiver
iperf Done.
koala@x220 ~> iperf3 -c speedtest.serverius.net -p 5002
Connecting to host speedtest.serverius.net, port 5002
[ 4] local 192.168.50.232 port 59708 connected to 178.21.16.76 port 5002
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 6.89 MBytes 57.8 Mbits/sec 0 880 KBytes
[ 4] 1.00-2.00 sec 8.65 MBytes 72.5 Mbits/sec 1 705 KBytes
[ 4] 2.00-3.00 sec 4.84 MBytes 40.7 Mbits/sec 381 254 KBytes
[ 4] 3.00-4.00 sec 3.00 MBytes 25.2 Mbits/sec 37 199 KBytes
[ 4] 4.00-5.00 sec 2.82 MBytes 23.7 Mbits/sec 0 216 KBytes
[ 4] 5.00-6.00 sec 3.07 MBytes 25.7 Mbits/sec 0 224 KBytes
[ 4] 6.00-7.00 sec 3.19 MBytes 26.7 Mbits/sec 0 226 KBytes
[ 4] 7.00-8.00 sec 3.19 MBytes 26.7 Mbits/sec 0 230 KBytes
[ 4] 8.00-9.00 sec 3.00 MBytes 25.2 Mbits/sec 32 174 KBytes
[ 4] 9.00-10.00 sec 2.45 MBytes 20.6 Mbits/sec 13 143 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 41.1 MBytes 34.5 Mbits/sec 464 sender
[ 4] 0.00-10.00 sec 37.4 MBytes 31.3 Mbits/sec receiver
iperf Done.
Во втором случае добавил ip speedtest.serverius.net в iptables на роутере
log syslog all;
router id 10.20.0.2;
protocol kernel {
import none;
export all;
scan time 20; # Scan kernel routing table every 20 seconds
}
protocol device {
scan time 60;
}
protocol direct {
interface "wireguard"; # Restrict network interfaces it works with
}
filter ibgp_policy {
if ( dest = RTD_UNREACHABLE ) then {
gw = 10.20.0.1;
print "Alias accepted: ",net," next hop ",bgp_next_hop;
accept;
}
reject;
}
protocol bgp OurRouter {
description "Our Router";
neighbor 10.20.0.1 as 64999;
import all;
export none;
local as 64999;
passive off;
direct;
}
На стороне vps на дебиан
log syslog all;
router id 10.20.0.1;
protocol kernel {
scan time 60;
import none;
# export all; # Actually insert routes into the kernel routing table
}
protocol device {
scan time 60;
}
protocol direct {
interface "wg*", "tun*"; # Restrict network interfaces it works with
}
protocol static static_bgp {
import all;
include "pfxlist.txt";
include "iplist.txt";
}
protocol bgp OurRouter {
description "Our Router";
neighbor 10.20.0.2 as 64999;
import none;
export where proto = "static_bgp";
local as 64999;
passive off;
#multihop;
}
protocol bgp OurRouter1 {
description "Our Router1";
neighbor 10.20.0.3 as 64999;
import none;
export where proto = "static_bgp";
local as 64999;
passive off;
#multihop;
}
Хотел бы отметить, что при использовании wireguard под openwrt перестает работать аппаратный nat offloading под чипы mtk.
добавить маршруты в bird можно так
root@scw:/etc/bird# cat /usr/local/bin/chklist.sh
#!/bin/bash
TMP_DIR=/tmp/blacklist
mkdir -p $TMP_DIR/list
cd $TMP_DIR/list
wget -N https://antifilter.download/list/ipsum.lst https://antifilter.download/list/subnet.lst
old=$(cat $TMP_DIR/md5.txt);
new=$(cat $TMP_DIR/list/*.lst | md5sum | head -c 32);
if [ "$old" != "$new" ]
then
cat $TMP_DIR/list/ipsum.lst | sed 's_.*_route & reject;_' > /etc/bird/ipsum.txt
cat $TMP_DIR/list/subnet.lst | sed 's_.*_route & reject;_' > /etc/bird/subnet.txt
/usr/sbin/birdc configure;
logger "RKN list reconfigured";
echo $new > $TMP_DIR/md5.txt;
fi
root@scw:/etc/bird# cat /etc/bird/bird.conf
log syslog all;
router id 172.24.2.2;
protocol kernel {
scan time 60;
import none;
export where proto = "OurRouter";
}
protocol device {
scan time 60;
}
protocol direct {
interface "venet*", "tun*", "ppp*"; # Restrict network interfaces it works with
}
protocol static static_bgp {
include "subnet.txt";
include "ipsum.txt";
include "custom.txt";
}
protocol bgp OurRouter {
description "Our Router";
neighbor 172.24.2.1 as 64999;
import all;
export where proto = "static_bgp";
next hop self;
local as 64998;
source address 172.24.2.2;
passive off;
}
root@scw:/etc/bird# cat subnet.txt
route 46.101.128.0/17 reject;
route 64.137.0.0/17 reject;
...
Но с полными списками возможно не всё так плохо будет на более менее домашних устройствах: я на Микротик hEX загружаю полные списки через BGP (сейчас порядка 190к маршрутов) — проглатывает не глядя.
Маршрут убирается одной командой
ip route del table vpn default dev wg0
И весь трафик идёт как обычно через провайдера. Но при любом рестарте сети он пропишется заново
Потребляет мало ресурсов роутера: заблокированные подсети содержатся в iptables, а не в таблицах маршрутизации. Что позволяет развернуть это дело даже на слабых устройствахПочему так? Это связано с какими-то особенностями маршрутизации в OpenWrt? Вроде голая маршрутизация наоборот должна быть проще.
А не пробовали загружать полный список? Судя по той статье, куча /32 маршрутов должна отрабатывать очень быстро, поскольку глубина поиска будет минимальная.
Ещё дело в том, что ipset использует hash таблицы, что ускоряет поиск. Например, он может использовать бинарный поиск.
Вроде как в ядре версии 4.4 появились снова Hash-based multipath routing. Какого-то сравнения ipset vs route table vs hash route table я не видел. Надо ставить эксперимент. Но последнее пока недоступно для моих роутеров — в 18.06 ядро 4.14.
Спасибо!
Я себе тоже на Xiaomi R3G настроил точечный обход, но средствами пакета shadowsocks-libev-ss-rules (который загружает список подсетей в ipset). Накостылял скрипт, генерирующий список из гитхаба zapret-info, мерджил и резолвил тулзой iprange.
Wireguard это, конечно, тема интереснее, нужно будет попробовать. Из вашей статьи открыл для себя сервис antifilter.download и ansible для openwrt. Попробую разобраться с BGP, раз такая полезная возможность представилась :) Давно хотел, но не знал что могу в одиночку с ним на практике замутить.
Походу мой аппарат кинули
Dir 825
12.09 стоит лет < 10
Для b1 и c1 есть свежая 18.06.2 downloads.openwrt.org/releases/18.06.2/targets/ar71xx/generic
unix.stackexchange.com/questions/80768/how-to-specify-daemon-dependency-upon-another-daemon
В Вашем случае потребуется указать, что dnscrypt предоставляет 'dnscrypt', а hirkn для работы требует запущеного 'dnscrypt'. И система при запуске сервисов разрулит всё самостоятельно.
Зато есть файл /etc/rc.local команды в котором будут выполняться в самую последнюю очередь.
Но как оказалось в файл со сценарием нужно просто добавить «START=99». Это решило проблему и теперь dnscrypt запускается раньше скрипта.
Это действительно так теперь? Дорогое удовольствие?
У Итальянцев была акция vds — по 1 Евро в месяц, минимальная оплата — за месяц. Сейчас данного варианта нет, но есть по 2.79, что весьма неплохо.
если мы дальше юзаем apt, то можно использовать
apt add-repository -y ppa:wireguard/wireguard
вместо отсутствующего add-apt-repository
Да и 18ая убунта тоже:
E: Invalid operation add-repository
Например, если гоняешь большие объемы данных — датасеты, всякие докер-образы и т.п.
Во-первых, меньшая скорость. Во-вторых, трафик на недорогих VPS, как правило, лимитирован — т.е. дополнительные затраты.
А если делить трафик — то там можно уже и анонимность прикрутить при желании (например, поставить tor-proxy за vpn).
config route 'anti_rkn'
option interface 'vpn'
option target '0.0.0.0'
option netmask '0.0.0.0'
#у меня используется L2 VPN, поэтому вручную указываю
#а для нормального VPN он сам возьмёт адрес некстхопа
#option gateway '192.168.30.1'
option table 'anti-rkn'
таким образом маршрут по умолчанию поднимется после поднятия интерфейса vpn и ему будет установлена таблица маршрутизации из /etc/iproute2/rt_tables
2) Использовать агрегированные адреса на мой взгляд не имеет смысл из-за высокой производительности при использовании ipset, там можно миллионы адресов загнать. Я у себя создал 3 ipset:
config ipset
option name 'RKN-BLOCKED'
option storage 'list'
option match 'set'
config ipset
option name 'RKN-BLOCKED-NET'
option storage 'hash'
option match 'net'
config ipset
option name 'RKN-BLOCKED-IP'
option storage 'hash'
option match 'ip'
option maxelem '256000'
Первый — это список из двух последующих
3) Обновлять списки адресов раз в сутки недостаточно, у меня стоит каждые 2 часа и очень мало случаев когда изменений не было, всё остальное время получаю новые заблокированные адреса. Поэтому я сделал свой скрипт, который и вызываю каждые 2 часа:
root@tl-wdr3600:~# cat /etc/anti-rkn/update-rkn-ip.sh
#!/bin/sh
# Скрипт не сохраняет файлы с адресами на диске, все операции проводит в памяти
start=`date +%s`
# create temporary sets
ipset create _tmp1 hash:net
ipset create _tmp2 hash:ip maxelem 256000
# load new content to ipset
curl -s https://antifilter.download/list/subnet.lst | awk '{print "add _tmp1 "$1;} END {print FNR > "/tmp/rkn_nets"}' | ipset -! restore
curl -s https://antifilter.download/list/ip.lst | awk '{print "add _tmp2 "$1;} END {print FNR > "/tmp/rkn_ips"}' | ipset -! restore
# swap content
ipset swap RKN-BLOCKED-NET _tmp1
ipset swap RKN-BLOCKED-IP _tmp2
# delete temporary sets
ipset destroy _tmp1
ipset destroy _tmp2
end=`date +%s`
logger -t update-rkn-ip "Updating the list of Anti-RKN IPs was completed, subnet="$(cat /tmp/rkn_nets)", ip="$(cat /tmp/rkn_ips)", running time="$((end-start))"sec."
4) У вас при создании правил пометки пакетов осутствует строка с OUTPUT и таким образом пакеты исходящие с самого роутера не уйдут в туннель. Мой вариант:
root@tl-wdr3600:~# cat /etc/firewall.user
# This file is interpreted as shell script.
# Put your custom iptables rules here, they will
# be executed with each firewall (re-)start.
ipset add RKN-BLOCKED RKN-BLOCKED-NET
ipset add RKN-BLOCKED RKN-BLOCKED-IP
iptables -t mangle -A PREROUTING -i br-lan -m set --match-set RKN-BLOCKED dst -j MARK --set-mark 0x1000
iptables -t mangle -A OUTPUT -m set --match-set RKN-BLOCKED dst -j MARK --set-mark 0x1000
5) Ну и при использовании hotplug можно (и наверное нужно) делать проверку на поднятие интерфейса в интернет (чтобы не вызывать загрузку адресов, если инета нет или отвалился):
root@tl-wdr3600:~# cat /etc/hotplug.d/iface/99-vpn.link-up
#!/bin/sh
# run only after WAN link up
[ "$ACTION" = ifup -a "$INTERFACE" = wan ] || exit 0
/etc/init.d/firewall enabled || exit 0
fw3 -q network "$INTERFACE" >/dev/null || exit 0
/etc/anti-rkn/update-rkn-ip.sh
1) Отлично, не подумал об этом, исправлю
2) Лично меня устраивает суммаризированый список. Я привёл это для примера, тут каждый для себя сам решает. Но да, хотя бы эксперимента надо попробовать
3) Ну тут зависит от задач же. Понятное дело, что ркн постоянно блочит что-то новенькое и antifilter обновляет списки. У меня лично нет необходимости иметь каждые два часа свежий список (%
4) Да, это сделано намерено, обход только для трафика из br-lan. Роутеру нужно только ntp и ресурсы openwrt, на какие-то запрещенные ресурсы ему ходить не нужно. Поэтому на данный момент необходимости в этом не вижу
5) Если вы о скрипте который загружает списки, то curl и сам поймет, что у него нет доступа к ресурсу, ничего не загрузит и это ничего не сломает. Ну тут тоже дело вкуса конечно
Насчет использования конфигов, вы списки для ipset в скрипте создаёте и явно уничтожаете, подскажите почему? Вроде при перезагрузке фаервола (когда ipset в firewall сконфигурён) он стирает существующий список и создаёт по новой, а не просто добавляет адреса
Если вы про скрипт /etc/firewall.user — то стандартными средствами нельзя в список ipset добавить другой ipset, только адреса/сети/… Поэтому я после каждого рестарта файрвола созадаю новый ipset, который содержит два других ipset и устанвливаю маркировку при попадании в этот ipset.
А если про скрипт для обновления адресов, то там используется встроенная возможность ipset обменять содержимое разных ipset, так чтобы список адресов ни на секунду не оставался пустым (потери пакетов в случае наличия трафика с адресами из запрещенных)
Ну и соответственно не «передергиваю» файрволл чтобы загруженные новые адреса подгрузились в ядро. Сейчас у меня уходит на выполнение скрипта по обновлению около 45-50 секунд (на tp-link wdr3600), из них большая часть времени на загрузку во временные ipset, около 190 тыс.адресов и потом мгновенно обмениваю с рабочими ipset.
Строки
ipset add RKN-BLOCKED RKN-BLOCKED-NET
ipset add RKN-BLOCKED RKN-BLOCKED-IP
можно заменить в конфиге firewall на
list entry 'RKN-BLOCKED-NET'
list entry 'RKN-BLOCKED-IP'
Если кто ещё будет мучиться с подобной же системой — главная магия была в том, что если настраивать просто отдельного neighbor — то пиринг запускался, префиксы были видны, но не применялись (prefix list и route map не наполнялись маршрутами), хоть ты тресни.
Но если сначала создать peer group, а потом добавить в неё neighbor — то всё сразу заработало.
Добавим два правила маркировки пакетов, они не вписываются в синтаксис UCI openwrt, поэтому добавляем их «как есть» в /etc/firewall.user.
Я делал нечто подобное вот так:
config ipset
option external 'VPN-Whitelist'
option match 'dest_ip'
option family 'ipv4'
option storage 'hash'
config rule
option name 'Mark-Whitelist-Packets'
option src 'lan'
option proto 'all'
option ipset 'VPN-Whitelist'
option set_mark '0x99'
option family 'ipv4'
option target 'MARK'
Здесь также нельзя?
Дело в том, что если конфигурить через UCI будет ipset-list src
1 0 0 MARK all -- * * 0.0.0.0/0 0.0.0.0/0 match-set vpn_subnets src MARK set 0x1
2 0 0 MARK all -- * * 0.0.0.0/0 0.0.0.0/0 match-set vpn_ipsum src MARK set 0x1
А нам нужно ipset-list dst
1 24 2259 MARK all -- br-lan * 0.0.0.0/0 0.0.0.0/0 match-set vpn_subnets dst MARK set 0x1
2 42 4800 MARK all -- br-lan * 0.0.0.0/0 0.0.0.0/0 match-set vpn_ipsum dst MARK set 0x1
Т.е. необходимо помечать пакеты идущие в адреса из списков, а не исходящие от адресов из списка. В вики не нашел параметр который за это отвечает
option match 'src_net'
, а option match 'dest_net'
, то как раз будет dst.На самом деле я на своём роутере уже настроил вашу схему используя конфиги UCI, без изменения в /etc/firewall.user. Вот фрагмент:
config ipset
option name 'vpn_subnets'
option match dest_net
option family ipv4
option storage hash
option loadfile '/tmp/lst/subnet.lst'
config ipset
option name 'vpn_ipsum'
option match dest_net
option family ipv4
option storage hash
option loadfile '/tmp/lst/ipsum.lst'
config rule
option name Mark-VPN-Subnets
option src lan
option proto all
option ipset 'vpn_subnets'
option set_xmark '0x1'
option family ipv4
option target MARK
config rule
option name Mark-VPN-IP-Sum
option src lan
option proto all
option ipset 'vpn_ipsum'
option set_xmark '0x1'
option family ipv4
option target MARK
#!/bin/sh
dir=/tmp/lst
mkdir -p $dir
echo "Run download lists"
curl -z $dir/subnet.lst https://antifilter.download/list/subnet.lst --output $dir/subnet.lst
curl -z $dir/ipsum.lst https://antifilter.download/list/ipsum.lst --output $dir/ipsum.lst
echo "Create temporary sets"
ipset destroy -q vpn_subnets_tmp || true
ipset destroy -q vpn_ipsum_tmp || true
ipset create vpn_subnets_tmp hash:net
ipset create vpn_ipsum_tmp hash:net
echo "Fill temporary sets"
cat $dir/subnet.lst | xargs -n1 ipset add vpn_subnets_tmp
cat $dir/ipsum.lst | xargs -n1 ipset add vpn_ipsum_tmp
echo "Swap with real sets"
ipset swap vpn_subnets_tmp vpn_subnets
ipset swap vpn_ipsum_tmp vpn_ipsum
ipset destroy vpn_subnets_tmp
ipset destroy vpn_ipsum_tmp
Разве что можно добавить, если использовать список отдельных IP адресов, то нужно задать hashsize и maxelem
ipset create vpn_ipsum_tmp hash:net hashsize 1000000 maxelem 1000000
иначе будет «ipset v7.1: Hash is full, cannot add more elements»
Не подскажите, чуть подправил ваш скрипт для списков, как у автора, но при запуске ошибки
Hidden text
/etc/init.d/hirkn_renew: line 12: ipset: not found
/etc/init.d/hirkn_renew: line 13: ipset: not found
/etc/init.d/hirkn_renew: line 14: ipset: not found
/etc/init.d/hirkn_renew: line 15: ipset: not found
/etc/init.d/hirkn_renew: line 16: ipset: not found
/etc/init.d/hirkn_renew: line 17: ipset: not found
те строчки кода, где встречаются временные списки vpn_***_tmp
что можно сделать?
Посмотреть бы на ваш скрипт, который получился в итоге.
Делался, как говорится, по образу и подобию
Hidden text
#!/bin/sh
dir=/tmp/lst
mkdir -p $dir
echo "Run download lists"
curl -z $dir/subnet.lst https://antifilter.download/list/subnet.lst --output $dir/subnet.lst
curl -z $dir/ip.lst https://antifilter.download/list/ip.lst --output $dir/ip.lst
curl -z $dir/community.lst https://antifilter.download/list/community.lst --output $dir/community.lst
echo "Create temporary sets"
ipset destroy -q vpn_subnets_tmp || true
ipset destroy -q vpn_ip_tmp || true
ipset destroy -q vpn_community_tmp || true
ipset create vpn_subnets_tmp hash:net
ipset create vpn_ip_tmp hash:net
ipset create vpn_community_tmp hash:net
echo "Fill temporary sets"
cat $dir/subnet.lst | xargs -n1 ipset add vpn_subnets_tmp
cat $dir/ip.lst | xargs -n1 ipset add vpn_ip_tmp
cat $dir/community.lst | xargs -n1 ipset add vpn_community_tmp
echo "Swap with real sets"
ipset swap vpn_subnets_tmp vpn_subnets
ipset swap vpn_ip_tmp vpn_ip
ipset swap vpn_community_tmp vpn_community
ipset destroy vpn_subnets_tmp
ipset destroy vpn_vpn_tmp
ipset destroy vpn_community_tmp
Выглядит так, как будто у вас в системе отсутствует ipset.
Попробуйте `opkg install ipset`
Странно, думал. что включал в прошивку, оказалось, что нет. Установил. В результате долго обрабатывало "Fill temporary sets". Потом вывод огромного количесва сообщений "ipset v7.15: Hash is full, cannot add more elements", закончилось на
Hidden text
ipset v7.15: Syntax error: cannot parse <html>: resolving to IPv4 address failed
ipset v7.15: Syntax error: cannot parse <head><title>404: resolving to IPv4 address failed
ipset v7.15: Syntax error: cannot parse Not: resolving to IPv4 address failed
ipset v7.15: Syntax error: 'title></head>' is invalid as number
ipset v7.15: Syntax error: cannot parse <body: resolving to IPv4 address failed
ipset v7.15: Syntax error: cannot parse bgcolor=white>: resolving to IPv4 address failed
ipset v7.15: Syntax error: cannot parse <center><h1>404: resolving to IPv4 address failed
ipset v7.15: Syntax error: cannot parse Not: resolving to IPv4 address failed
ipset v7.15: Syntax error: 'h1></center>' is invalid as number
ipset v7.15: Syntax error: '1.14.0' is invalid as number
ipset v7.15: Syntax error: 'center>' is invalid as number
ipset v7.15: Syntax error: 'body>' is invalid as number
ipset v7.15: Syntax error: 'html>' is invalid as number
Swap with real sets
ipset v7.15: Sets cannot be swapped: the second set does not exist
ipset v7.15: Sets cannot be swapped: the second set does not exist
ipset v7.15: Sets cannot be swapped: the second set does not exist
ipset v7.15: The set with the given name does not exis
Теперь выглядит так, что вы пытаетесь ipset-у скормить HTML-страницу вместо списка IP-адресов. Прошёлся по урлам из вашего скрипта. Первые два нормально отдают файлы со списками адресов, а вот третий возвращает HTTP 404 и соответствующую страницу. Похоже, в этом дело.
Что касается "Hash is full, cannot add more elements" - нужно в скрипте указать максимальный размер списка. То есть вместо ipset create vpn_subnets_tmp hash:net
прописать ipset create vpn_subnets_tmp hash:net maxelem 262144
(остальные аналогично)
Зачем отдельный скрипт? Там же в оригинальном есть start/stop/reload.
Просто порезать основной скрипт на две части. В первой - всё до firewall restart, во второй - собственно, firewall restart.
В обычном режиме делаем с рестартом.
А если запускают hirkn reload - вот там вместо рестарта можно часть вашего варианта (сразу начиная с Create temporary sets).
Кстати, вариант с xargs -n1 ipset add vpn_ipsum_tmp крайне тормозной. Потому что он на каждый элемент будет звать ipset. Лучше, как выше предложили, awk '{print "add vpn_ipsum_tmp "$1;}' | ipset -! restore. В этом случае ipset позовётся единожды, и ему зальётся всё через трубу.
А ещё простая эмпирика, вроде
lines=$(cat $dir/ip.lst | wc -l)
hash=$((lines*3/2))
позволяет гибко настроить размер хэша из скрипта в зависимости от размера списка.
Я конечно сразу извиняюсь, тему только начал изучать и назрел вопрос:
— Есть роутер на OpenWRT
— Есть VPS в Нидерландах (там уже поднят WG — серверная часть)
Как настроить VPN соединение Server-Client, чтобы анонимность и все такое?
Для тех кто прилипнет как я разбираться - чего это оно вдруг не работает, ведь в openwrt 18-19 все заводилось с пол пинка:
В firewall теперь надо дописывать dest, иначе магия не происходит
config rule
option name 'mark_unblock_list'
option src 'lan'
option dest '*'
option proto 'all'
option ipset 'unblock_list'
option set_mark '0x1'
option target 'MARK'
Ох... спасибо! Статья огонь! Работает, если все делать внимательно... Но они там совсем с ума сошли. У меня память на роутере кончилась! 256 мегабайт работают тупо на хеш таблицу О_о mi 3g едва справляется, трансмишн уже не помещается в память =\
Расход памяти можно снизить в два раза точно. А можно и вообще без списков в некоторых случаях.
UPD
Xiaomi Mi Router 3G
OpenWrt 21.02.2 r16495-bf0c965af0
спасибо автору, откликнулся ^_^ это приятно
не знаю что было у меня, в итоге моих несистематичных методов тыка получается такая картина
обновил все пакеты которые хотели обновиться - не помогло
загрузка sumip - не помогло
есть подозрение что каким-то чудом установка nft-qos резко снизило загрузку памяти с 90 до 60% - но это не точно
в итоге в правилах фаервола для ip hashsize и maxelem выставил значение '990000' а для vpn_community эти параметры вообще закоментил.
Теперь загрузка памяти в 40% с полным листом ip, меня более чем устраивает. Вот такие костыли.
Автор, спасибо за труд! Подскажите, как настроить удаленный доступ с телефона к роутеру через wireguard VPN? Есть VDS с Wireguard, на роутере и телефоне настроены клиенты.
у меня такой же роутер как у автора, но я так и не понял, где он взял на https://downloads.openwrt.org/releases/.. /mipsel_24kc нужный пакет на dnsmasqv-full. Потому что он либо версии 86 и не поддерживает nftset либо версии 2.90 и его не поставить
Точечная маршрутизация на роутере с OpenWrt. WireGuard и DNSCrypt