bol-van / zapret

DPI bypass multi platform
5.97k stars 519 forks source link

wireguard nftables support #114

Closed cany748 closed 2 years ago

cany748 commented 2 years ago

В wireguard_iproute_openwrt.txt есть информация по настройке роутинга на iptables, но нету на nftables. У меня слишком мало опыта работы с nftables, прошу вашей помощи.

bol-van commented 2 years ago

Добавил инфу по nftables для простого варианта с masquerade.

bol-van commented 2 years ago

Добавил инфу по nftables для сложного случая без masquerade.

Alexey71 commented 2 years ago

@bol-van А если у меня нет VPS сервера с wireguard. Есть только готовый конфиг такого плана

[Interface]
PrivateKey = MNr7eDCCL5dxFlnf+tyWVXjumHK5TeBnNxfTVvEZQlk=
Address = 10.64.90.124/32

[Peer]
PublicKey = jJVG/lv7RikDG0FMsV3WJgfot5XecPm9aHDrYvU+NAM=
AllowedIPs = 0.0.0.0/0
Endpoint = 86.107.21.34:51820

На роутере сейчас поднят клиент wireguard c таким конфигом Как мне сделать локальные ип? Я создал новый интерфейс напримерwireguard_ip, не понятно какой ип писать. И параметр option ifname устарел я так понял, автоматически в option device переименовало

config interface 'wireguard_ip'
    option proto 'static'
    option device '@wireguard'
    list ipaddr 'Какой сюда надо IP писать?'

Тоже пытаюсь настроить через nftables, проброс сайтов которые будут в zapret-hosts-user-ipban.txt чтобы через wireguard пропускало

Пробовал так

config interface 'wireguard'
    option proto 'wireguard'
    option delegate '0'
    option private_key 'MNr7eDCCL5dxFlnf+tyWVXjumHK5TeBnNxfTVvEZQlk='
    list addresses '10.64.90.124/32'

config wireguard_wireguard
    option description 'antizapret'
    option persistent_keepalive '25'
    option endpoint_port '51820'
    option public_key  jJVG/lv7RikDG0FMsV3WJgfot5XecPm9aHDrYvU+NAM='
    option endpoint_host '86.107.21.34'
    list allowed_ips '0.0.0.0/0'

config interface 'wireguard_ip'
    option proto 'static'
    option device '@wireguard'
    list ipaddr '10.64.90.124/32'

config route
    option interface 'wireguard'
    option target '0.0.0.0/0'
    option table '100'

config rule
    option priority '100'
    option mark '0x800/0x800'
    option lookup '100'

/etc/firewall.zapret.hook.post_up

#!/bin/sh

ZAPRET_NFT_TABLE=zapret

cat << EOF | nft -f - 2>/dev/null
 delete chain inet $ZAPRET_NFT_TABLE my_output
 delete chain inet $ZAPRET_NFT_TABLE my_prerouting
EOF

cat << EOF | nft -f -
 add chain inet $ZAPRET_NFT_TABLE my_output { type route hook output priority mangle; }
 flush chain inet $ZAPRET_NFT_TABLE my_output
 add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif ip daddr @ipban meta mark set mark or 0x800
 add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif tcp dport 443 ip daddr @zapret meta mark set mark or 0x800

 add chain inet $ZAPRET_NFT_TABLE my_prerouting { type filter hook prerouting priority mangle; }
 flush chain inet $ZAPRET_NFT_TABLE my_prerouting
 add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif ip daddr @ipban meta mark set mark or 0x800
 add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif tcp dport 443 ip daddr @zapret meta mark set mark or 0x800
EOF

/opt/zapret/config

# this file is included from init scripts
# change values here

# can help in case /tmp has not enough space
#TMPDIR=/opt/zapret/tmp

# override firewall type : iptables,nftables,ipfw
FWTYPE=nftables

# options for ipsets
# maximum number of elements in sets. also used for nft sets
SET_MAXELEM=522288
# too low hashsize can cause memory allocation errors on low RAM systems , even if RAM is enough
# too large hashsize will waste lots of RAM
IPSET_OPT="hashsize 262144 maxelem $SET_MAXELEM"
# dynamically generate additional ip. $1 = ipset/nfset/table name
#IPSET_HOOK="/etc/zapret.ipset.hook"

# options for ip2net. "-4" or "-6" auto added by ipset create script
IP2NET_OPT4="--prefix-length=22-30 --v4-threshold=3/4"
IP2NET_OPT6="--prefix-length=56-64 --v6-threshold=5"

# number of parallel threads for domain list resolves
MDIG_THREADS=30

# ipset/*.sh can compress large lists
GZIP_LISTS=1
# command to reload ip/host lists after update
# comment or leave empty for auto backend selection : ipset or ipfw if present
# on BSD systems with PF no auto reloading happens. you must provide your own command
# set to "-" to disable reload
#LISTS_RELOAD="pfctl -f /etc/pf.conf"

# CHOOSE OPERATION MODE
# MODE : nfqws,tpws,tpws-socks,filter,custom
# nfqws : nfqws for dpi desync
# tpws : tpws transparent mode
# tpws-socks : tpws socks mode
# filter : no daemon, just create ipset or download hostlist
# custom : custom mode. should modify custom init script and add your own code
MODE=tpws
# apply fooling to http
MODE_HTTP=1
# for nfqws only. support http keep alives. enable only if DPI checks for http request in any outgoing packet
MODE_HTTP_KEEPALIVE=1
# apply fooling to https
MODE_HTTPS=1
# none,ipset,hostlist
MODE_FILTER=hostlist

# CHOOSE NFQWS DAEMON OPTIONS for DPI desync mode. run "nfq/nfqws --help" for option list
DESYNC_MARK=0x40000000
#NFQWS_OPT_DESYNC="--dpi-desync=fake --dpi-desync-ttl=0 --dpi-desync-ttl6=0 --dpi-desync-fooling=badsum"
#NFQWS_OPT_DESYNC_HTTP="--dpi-desync=split --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
#NFQWS_OPT_DESYNC_HTTPS="--wssize=1:6 --dpi-desync=split --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
#NFQWS_OPT_DESYNC_HTTP6="--dpi-desync=split --dpi-desync-ttl=5 --dpi-desync-fooling=none"
#NFQWS_OPT_DESYNC_HTTPS6="--wssize=1:6 --dpi-desync=split --dpi-desync-ttl=5 --dpi-desync-fooling=none"

# CHOOSE TPWS DAEMON OPTIONS. run "tpws/tpws --help" for option list
TPWS_OPT="--hostspell=HOST --split-http-req=method --split-pos=1"

# openwrt only : donttouch,none,software,hardware
FLOWOFFLOAD=donttouch

# openwrt: specify networks to be treated as LAN. default is "lan"
#OPENWRT_LAN="lan lan2 lan3"

# for routers based on desktop linux and macos. has no effect in openwrt.
# CHOOSE LAN and optinally WAN NETWORK INTERFACES
# or leave them commented if its not router
# it's possible to specify multiple interfaces like this : IFACE_LAN="eth0 eth1 eth2"
#IFACE_LAN=eth0
#IFACE_WAN=eth1

# should start/stop command of init scripts apply firewall rules ?
# not applicable to openwrt with firewall3+iptables
INIT_APPLY_FW=1
# firewall apply hooks
#INIT_FW_PRE_UP_HOOK="/etc/firewall.zapret.hook.pre_up"
INIT_FW_POST_UP_HOOK="/etc/firewall.zapret.hook.post_up"
#INIT_FW_PRE_DOWN_HOOK="/etc/firewall.zapret.hook.pre_down"
#INIT_FW_POST_DOWN_HOOK="/etc/firewall.zapret.hook.post_down"

# do not work with ipv4
#DISABLE_IPV4=1
# do not work with ipv6
DISABLE_IPV6=1

# select which init script will be used to get ip or host list
# possible values : get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh get_hostlist.sh
# comment if not required
#GETLIST=

Не завелось))

Alexey71 commented 2 years ago

Сделал бы кто нибудь инструкцию внятную как вообще можно имея nftables+wireguard+zapret, чтобы домены которые прописываешь в zapret-hosts-user-ipban.txt пропускались через wireguard. Было бы замечательно). Ну и не имея VPS, а просто конфиг уже готового клиента wireguard который уже поднят заранее и рабочий Основная цель всей этой солянки. Чтобы было удобно добавлять заблокированные сайты доменом, а не ip адреса

bol-van commented 2 years ago

Разницы по большому счету и нет. Вся разница - в отсутствии необходимости самому настраивать сервер. + невозможность выполнить вариант без masquerade.

С ходу вижу отсутствие параметра option route_allowed_ips '0' Он нужен, чтобы весь трафик не рулился на VPN

Диагностику надо проводить по понятиям поднялся ли интерфейс wireguard пингается ли что-то через него. посмотреть какие правила создались nft list inet table inet zapret все ли нужные ип внеслись в nfset ipban

my_output oifname @wanif tcp dport 443 ip daddr @zapret

вот это вообще нужно ? нужно же не копипастить, а понимать что тут написано действительно ли нужно перенаправлять https на wireguard ? действительно ли нужен режим tpws в конфиге или все по умолчанию тык тык тык ?

bol-van commented 2 years ago

На счет обновленных секций в /etc/config/network Если не применять люси - то оно и так работает Если применять люси, оно ругнется и само исправит конфиг. Потом только нажать save & apply

bol-van commented 2 years ago

zapret-hosts-user-ipban.txt требует ресолвинга хостов. сам этот файл не учитывается в процессе применения правил, из него делается zapret-ip-user-ipban.txt, который и загружается в nfset для ресолвинга надо запускать ipset/get_user.sh

Alexey71 commented 2 years ago

Блин завелось, ураа. Я не выполнил ipset/get_user.sh option route_allowed_ips '0' не будет прописываться в /etc/config/network когда выключен. Он прописывается только когда включен option route_allowed_ips '1'. На последнем снапшоте openwrt так по крайней мере

bol-van commented 2 years ago

Чтобы ipban ip периодически сами обновлялись, нужно прогнать install_easy.sh и там выбрать get_user в качестве скрипта получения списка ip. Инсталятор пропишет cron job и добавит параметр GETLIST в config. Ведь у ресурсов могут меняться IP

option route_allowed_ips '0' не будет прописываться в /etc/config/network когда выключен

Тут ничего не понял. Если этого не сделать, будет вот что :

ip route
default dev wgvps scope link

А если сделать опцию, то default не будет.

bol-van commented 2 years ago

Нет, не прав я. Это раньше по умолчанию было route_allowed_ip включено. Сейчас по умолчанию выключено. см /lib/netifd/proto/wireguard.sh Впрочем, присутствие параметра с нулевым значением - это не ошибка, а скорее для надежности compat со старыми версиями

Alexey71 commented 2 years ago

Чтобы ipban ip периодически сами обновлялись, нужно прогнать install_easy.sh и там выбрать get_user в качестве скрипта получения списка ip. Инсталятор пропишет cron job и добавит параметр GETLIST в config. Ведь у ресурсов могут меняться IP

Не найду чего то где тут

BusyBox v1.35.0 (2022-06-13 17:50:25 UTC) built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt SNAPSHOT, r19797-a7be143646
 -----------------------------------------------------
root@OpenWrt:~# /opt/zapret/install_easy.sh
* checking system
system is based on openwrt
openwrt firewall uses fw4. flow offloading requires nftables.
* checking executables
found architecture "mips32r1-lsb"
* checking privileges
* checking location
running from /opt/zapret
* installing binaries
mips32r1-lsb is OK
installing binaries ...
linking : ../binaries/mips32r1-lsb/ip2net => /opt/zapret/ip2net
linking : ../binaries/mips32r1-lsb/mdig => /opt/zapret/mdig
linking : ../binaries/mips32r1-lsb/nfqws => /opt/zapret/nfq
linking : ../binaries/mips32r1-lsb/tpws => /opt/zapret/tpws
* checking DNS
system DNS is working
* checking virtualization
cannot detect
* stopping current firewall rules/daemons
Clearing nftables

WARNING ! you are running a low RAM system
WARNING ! nft requires lots of RAM to load huge ip sets, much more than ipsets require
WARNING ! if you need large lists it may be necessary to fall back to iptables+ipset firewall
select firewall type :
1 : iptables
2 : nftables
your choice (default : nftables) :
selected : nftables

enable ipv6 support (default : N) (Y/N) ?
* checking prerequisites
everything is present

your system uses default busybox gzip. its several times slower than GNU gzip.
ip/host list scripts will run much faster with GNU gzip
installer can install GNU gzip but it requires about 100 Kb space
do you want to install GNU gzip (default : N) (Y/N) ?

your system uses default busybox sort. its much slower and consumes much more RAM than GNU sort
ip/host list scripts will run much faster with GNU sort
installer can install GNU sort but it requires about 100 Kb space
do you want to install GNU sort (default : N) (Y/N) ?

your system uses default busybox grep. its damn infinite slow with -f option
get_combined.sh will be severely impacted
installer can install GNU grep but it requires about 0.5 Mb space
do you want to install GNU grep (default : N) (Y/N) ?

select MODE :
1 : tpws
2 : tpws-socks
3 : nfqws
4 : filter
5 : custom
your choice (default : tpws) :
selected : tpws

TPWS_OPT="--hostspell=HOST --split-http-req=method --split-pos=1"
do you want to edit the options (default : N) (Y/N) ?

enable http support (default : Y) (Y/N) ?

enable https support (default : Y) (Y/N) ?

select filtering :
1 : none
2 : ipset
3 : hostlist
your choice (default : hostlist) :
selected : hostlist

do you want to auto download ip/host list (default : N) (Y/N) ?

flow offloading can greatly increase speed on slow devices and high speed links (usually 150+ mbits)
unfortuantely its not compatible with most nfqws options. nfqws traffic must be exempted from flow offloading.
donttouch = disable system flow offloading setting if nfqws mode was selected, dont touch it otherwise and dont configure selective flow offloading
none = always disable system flow offloading setting and dont configure selective flow offloading
software = always disable system flow offloading setting and configure selective software flow offloading
hardware = always disable system flow offloading setting and configure selective hardware flow offloading
offloading breaks traffic shaper
select flow offloading :
1 : donttouch
2 : none
3 : software
4 : hardware
your choice (default : donttouch) :
selected : donttouch
* installing init script
Clearing nftables
Command failed: Not found
* clearing ipset(s)
setting high oom kill priority
reloading nftables set backend (clear)
* downloading blocked ip/host list
setting high oom kill priority
clearing all known DNS caches
DNS is working
digging 6 ipv4 domains : /opt/zapret/ipset/zapret-hosts-user-exclude.txt
mdig stats : 00:00:00 : domains=0 success=0 error=0
setting high oom kill priority
reloading nftables set backend (forced-update)
Adding to nfset zapret : /opt/zapret/ipset/zapret-ip.txt /opt/zapret/ipset/zapret-ip-user.txt
Adding to nfset ipban : /opt/zapret/ipset/zapret-ip-ipban.txt /opt/zapret/ipset/zapret-ip-user-ipban.txt
Adding to nfset nozapret : /opt/zapret/ipset/zapret-ip-exclude.txt
forcing zapret daemons to reload their hostlist
* adding crontab entry
* installing ifup hook
* starting zapret service
Starting daemon 1: /opt/zapret/tpws/tpws --user=daemon --bind-addr=127.0.0.127 --port=988 --hostspell=HOST --split-http-req=method --split-pos=1 --hostlist=/opt/zapret/ipset/zapret-hosts-user.txt
Applying nftables
Creating ip list table (firewall type nftables)
setting high oom kill priority
reloading nftables set backend (no-update)
Adding nftables ipv4 rule for tpws (port 988) :  tcp dport {80,443}
* checking flow offloading
system wide software flow offloading disabled. ok
* restarting firewall

press enter to continue

root@OpenWrt:~#

Тут ничего не понял. Если этого не сделать, будет вот что :

ip route
default dev wgvps scope link

А если сделать опцию, то default не будет.

Я через LUCI выключил "Маршрутизировать разрешенные IP-адреса" и все. В /etc/config/network не прописало option route_allowed_ips '0' Но трафик весь не гонит через впн уже проверял, значит работает выключение пункта через LUCI просто

bol-van commented 2 years ago

MODE=filter если не нужны средства обхода DPI filtering - ipset hostlist относится только к tpws и nfqws. средствами iptables и nftables домены фильтровать невозможно

Alexey71 commented 2 years ago

Средства обхода DPI нужны. Прописываю домены в zapret-hosts-user.txt которые гнать через Zapret Прописываю домены в zapret-hosts-user-ipban.txt которые гнать через Wireguard Работает сейчас как то все это. Только надо выполнять после /opt/zapret/install_easy.sh еще /opt/zapret/ipset/get_user.sh

Alexey71 commented 2 years ago

@bol-van Можно как то сделать, чтобы после /opt/zapret/install_easy.sh не затирала все задания в кроне, которые прописаны мной. Сейчас каждый раз все удаляет и прописывает 12 0 */2 * * /opt/zapret/ipset/get_config.sh. Не должно добавлять правило к существующим?

bol-van commented 2 years ago

Действительно, с ipban некоторая путаница выходит. Он может при разных настройках фильтра либо ресолвиться, либо нет. Хотя по идее он не зависит от настроек фильтра по обходу DPI. Бан - значит бан, обходится только сторонними средствами, и нужен всегда, если сам лист присутствует. Cделал так, чтобы в любом случае ipban ресолвился при любом раскладе

bol-van commented 2 years ago

Можно как то сделать, чтобы после /opt/zapret/install_easy.sh не затирала все задания в кроне, которые прописаны мной.

Так и не должно быть. у меня такого не происходит

Alexey71 commented 2 years ago

Можно как то сделать, чтобы после /opt/zapret/install_easy.sh не затирала все задания в кроне, которые прописаны мной.

Так и не должно быть. у меня такого не происходит

Оно оказывается удаляло свои остатки запрета, я там прописывал */60 * * * * /opt/zapret/ipset/get_user.sh, теперь уже не актуально с вашими последними правками, файлик zapret-ip-user-ipban.txt создается

bol-van commented 2 years ago

Да, он сносит все кроны с $ZAPRETPREFIX/ipset/get Это нормально и является частью процедуры инсталяции/деинсталяции При инсталяции он заново прописывает крон

cany748 commented 2 years ago

Большое спасибо, всё работает отлично! Премного благодарен вам за этот прекрасный проект!

Alexey71 commented 2 years ago

@bol-van ASN поддержки нету в планах? Где ввести ASN и скрипт сам все IP адреса соберет и добавит в список. На примере vpn-policy скрипта

vpn-policy-routing.facebook_instagram.user

#!/bin/sh
# This file is heavily based on code from https://github.com/Xentrk/netflix-vpn-bypass/blob/master/IPSET_Netflix.sh
# Credits to https://forum.openwrt.org/u/dscpl for api.hackertarget.com code.
# Credits to https://github.com/kkeker and https://github.com/tophirsch for api.bgpview.io code.

TARGET_IPSET='wireguard'
TARGET_ASN='32934'
TARGET_FNAME="/var/vpn-policy-routing_tmp_AS${TARGET_ASN}"
#DB_SOURCE='ipinfo.io'
#DB_SOURCE='api.hackertarget.com'
DB_SOURCE='api.bgpview.io'

_ret=1

if [ ! -s "$TARGET_FNAME" ]; then
    if [ "$DB_SOURCE" = "ipinfo.io" ]; then
        TARGET_URL="https://ipinfo.io/AS${TARGET_ASN}"
        curl "$TARGET_URL" 2>/dev/null | grep -E "a href.*${TARGET_ASN}\/" | grep -v ":" | sed "s/^.*<a href=\"\/AS${TARGET_ASN}\///; s/\" >//" > "$TARGET_FNAME"
    fi

    if [ "$DB_SOURCE" = "api.hackertarget.com" ]; then
        TARGET_URL="https://api.hackertarget.com/aslookup/?q=AS${TARGET_ASN}"
        curl "$TARGET_URL" 2>/dev/null | sed '1d' > "$TARGET_FNAME"
    fi

    if [ "$DB_SOURCE" = "api.bgpview.io" ]; then
        TARGET_URL="https://api.bgpview.io/asn/${TARGET_ASN}/prefixes"
        curl -s "$TARGET_URL" 2>/dev/null | jsonfilter -e '@.data.ipv4_prefixes[*].prefix' > "$TARGET_FNAME"
    fi
fi

if [ -s "$TARGET_FNAME" ]; then
    awk -v ipset="$TARGET_IPSET" '{print "add " ipset " " $1}' "$TARGET_FNAME" | ipset restore -! && _ret=0
fi
rm -f "$TARGET_FNAME"

return $_ret
bol-van commented 2 years ago

Специальной поддержки нет, но для этого есть механизм расширения ipset

# dynamically generate additional ip. $1 = ipset/nfset/table name # IPSET_HOOK="/etc/zapret.ipset.hook"

скрипт должен проанализировать $1 и наплевать в стдоут ip адреса

эту задачу крайне важно решать именно хуком, потому что ладно ипсет, но в нфсет нельзя вставлять пересекающиеся записи. будет ошибка. плевок скрипта в stdout и имеющиеся списки автоматически auto-merg-атся и загоняются в один присест

bol-van commented 2 years ago
#!/bin/sh

# AS32934 - facebook,instagram
# multiple ASN separated by space

AS="32934"

aslist()
{
    whois -h whois.radb.net -- "-i origin AS$1" | sed -nre 's/^route: *(.*)/\1/p'
}

[ "$1" = "ipban" ] && {
    for as in $AS; do
        aslist $as
    done
}

нужен установленный whois

Alexey71 commented 2 years ago

А какой командой запускать хук? Раскоментировал в конфиге IPSET_HOOK="/etc/zapret.ipset.hook" создал файл соответственно /etc/zapret.ipset.hook 0755 Запустил /opt/zapret/install_easy.sh ничего не добавило. И попутный вопрос, если надо несколько ASN, в один файл как то можно zapret.ipset.hook?

bol-van commented 2 years ago

Хук вызывается когда выполняется загрузка сета через create_ipset.sh. А она выполняется точно после загрузки системы (механизмы вызова разнятся) и после обновления листов через крон или install_easy.

если надо несколько ASN

Скрипт предельно простой. Там же все написано. В коментах.

С этим скриптом может быть такой косяк. Что при перезагрузке может еще не быть инета, когда вызывается create_ipset, и в итоге ничего не сработает. Тут решения 2. Либо устраивать промежуточную буферизацию в файл, то есть перенести код в свой скрипт, вызывать его отдельно через крон, а в хуке просто сделать cat на сохраненный файл Либо , если достаточно лишь ASN + userlist, то есть загрузка листов с antizapret, например, неактуальна, можно самому написать код ipset/get_myasnlist.sh по аналогии с другими скриптами, загружающими ip листы (не хост листы), и указать его в GETLIST в config Главное сохранить вызов getuser и create_ipset.sh

bol-van commented 2 years ago

$ZIPLIST, $ZIPLIST_IPBAN - это файлы, в которые помещается основной (не юзер) лист для сетов zapret и ipban соответственно. Скрипт ipset/get_xxxxx.sh должен в соответствии со своей логикой заполнить эти файлы. Если ожидается большой лист, можно воспользоваться gzip сжатием - функция zz. При этом желательно удостовериться, что полученная инфа валидна, прежде чем переписывать файл. Не возникла ли ошибка получения. Чтобы не затереть старую копию. Для этого можно сохранить результат сначала в /tmp, проверить размер, затем уже его переместить куда надо, в ином случае удалить из /tmp файл с плохой попыткой

Alexey71 commented 6 months ago

@bol-van Здравтсвуйте. Можете помочь. Почему то перестал работать zapret.ipset.hook, не добавляет адреса zapret.ipset.hook файл такой

#!/bin/sh

# AS32934 - facebook,instagram
# multiple ASN separated by space

AS="212238"

aslist()
{
    whois -h whois.radb.net -- "-i origin AS$1" | sed -nre 's/^route: *(.*)/\1/p'
}

[ "$1" = "ipban" ] && {
    for as in $AS; do
        aslist $as
    done
}

В config так

# this file is included from init scripts
# change values here

# can help in case /tmp has not enough space
#TMPDIR=/opt/zapret/tmp

# override firewall type : iptables,nftables,ipfw
FWTYPE=nftables

# options for ipsets
# maximum number of elements in sets. also used for nft sets
SET_MAXELEM=522288
# too low hashsize can cause memory allocation errors on low RAM systems , even if RAM is enough
# too large hashsize will waste lots of RAM
IPSET_OPT="hashsize 262144 maxelem $SET_MAXELEM"
# dynamically generate additional ip. $1 = ipset/nfset/table name
IPSET_HOOK="/opt/zapret/zapret.ipset.hook"

# options for ip2net. "-4" or "-6" auto added by ipset create script
IP2NET_OPT4="--prefix-length=22-30 --v4-threshold=3/4"
IP2NET_OPT6="--prefix-length=56-64 --v6-threshold=5"
# options for auto hostlist
AUTOHOSTLIST_RETRANS_THRESHOLD=3
AUTOHOSTLIST_FAIL_THRESHOLD=3
AUTOHOSTLIST_FAIL_TIME=60
# 1 = debug autohostlist positives to ipset/zapret-hosts-auto-debug.log
AUTOHOSTLIST_DEBUGLOG=0

# number of parallel threads for domain list resolves
MDIG_THREADS=30

# ipset/*.sh can compress large lists
GZIP_LISTS=1
# command to reload ip/host lists after update
# comment or leave empty for auto backend selection : ipset or ipfw if present
# on BSD systems with PF no auto reloading happens. you must provide your own command
# set to "-" to disable reload
#LISTS_RELOAD="pfctl -f /etc/pf.conf"

# override ports
#HTTP_PORTS=80-81,85
#HTTPS_PORTS=443,500-501
#QUIC_PORTS=443,444

# CHOOSE OPERATION MODE
# MODE : nfqws,tpws,tpws-socks,filter,custom
# nfqws : nfqws for dpi desync
# tpws : tpws transparent mode
# tpws-socks : tpws socks mode
# filter : no daemon, just create ipset or download hostlist
# custom : custom mode. should modify custom init script and add your own code
MODE=nfqws
# apply fooling to http
MODE_HTTP=1
# for nfqws only. support http keep alives. enable only if DPI checks for http request in any outgoing packet
MODE_HTTP_KEEPALIVE=0
# apply fooling to https
MODE_HTTPS=1
# apply fooling to quic
MODE_QUIC=0
# none,ipset,hostlist,autohostlist
MODE_FILTER=hostlist

# CHOOSE NFQWS DAEMON OPTIONS for DPI desync mode. run "nfq/nfqws --help" for option list
DESYNC_MARK=0x40000000
DESYNC_MARK_POSTNAT=0x20000000
#NFQWS_OPT_DESYNC="--dpi-desync=fake,split2 --dpi-desync-ttl=2 --dpi-desync-fooling=badsum"
NFQWS_OPT_DESYNC_HTTP="--dpi-desync=fake,split --dpi-desync-ttl=8"
NFQWS_OPT_DESYNC_HTTPS="--dpi-desync=fake,split2 --dpi-desync-ttl=2"
#NFQWS_OPT_DESYNC_DHT="--dpi-desync=fake --dpi-desync-ttl=5"
#NFQWS_OPT_DESYNC_HTTP6="--dpi-desync=split --dpi-desync-ttl=5 --dpi-desync-fooling=none"
#NFQWS_OPT_DESYNC_HTTPS6="--wssize=1:6 --dpi-desync=split --dpi-desync-ttl=5 --dpi-desync-fooling=none"
#NFQWS_OPT_DESYNC_QUIC="--dpi-desync=fake"
#NFQWS_OPT_DESYNC_QUIC6="--dpi-desync=hopbyhop"

# CHOOSE TPWS DAEMON OPTIONS. run "tpws/tpws --help" for option list
TPWS_OPT="--hostspell=HOST --split-http-req=method --split-pos=1"

# openwrt only : donttouch,none,software,hardware
FLOWOFFLOAD=donttouch

# openwrt: specify networks to be treated as LAN. default is "lan"
#OPENWRT_LAN="lan lan2 lan3"
# openwrt: specify networks to be treated as WAN. default wans are interfaces with default route
#OPENWRT_WAN4="wan vpn"
#OPENWRT_WAN6="wan6 vpn6"

# for routers based on desktop linux and macos. has no effect in openwrt.
# CHOOSE LAN and optinally WAN/WAN6 NETWORK INTERFACES
# or leave them commented if its not router
# it's possible to specify multiple interfaces like this : IFACE_LAN="eth0 eth1 eth2"
# if IFACE_WAN6 is not defined it take the value of IFACE_WAN
#IFACE_LAN=eth0
#IFACE_WAN=eth1
#IFACE_WAN6="ipsec0 wireguard0 he_net"

# should start/stop command of init scripts apply firewall rules ?
# not applicable to openwrt with firewall3+iptables
INIT_APPLY_FW=1
# firewall apply hooks
#INIT_FW_PRE_UP_HOOK="/etc/firewall.zapret.hook.pre_up"
INIT_FW_POST_UP_HOOK="/opt/zapret/firewall.zapret.hook.post_up"
#INIT_FW_PRE_DOWN_HOOK="/etc/firewall.zapret.hook.pre_down"
#INIT_FW_POST_DOWN_HOOK="/etc/firewall.zapret.hook.post_down"

# do not work with ipv4
#DISABLE_IPV4=1
# do not work with ipv6
DISABLE_IPV6=1

# select which init script will be used to get ip or host list
# possible values : get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh get_hostlist.sh
# comment if not required
#GETLIST=

whois установлен 2024-03-07_110829

root@OpenWrt:~# whois -h whois.radb.net AS212238
aut-num:        AS212238
as-name:        CDNEXT
org:            ORG-DL201-RIPE
import:         from AS60068 accept ANY
export:         to AS60068 announce AS212238
import:         from AS39392 accept ANY
export:         to AS39392 announce AS212238
member-of:      AS3320:AS-AUTH-ROUTEPRIO-FROM-AS33891
admin-c:        DUMY-RIPE
tech-c:         DUMY-RIPE
status:         ASSIGNED
mnt-by:         RIPE-NCC-END-MNT
mnt-by:         DATACAMP-MNT
created:        2020-12-02T09:57:07Z
last-modified:  2023-12-12T15:07:58Z
source:         RIPE
remarks:        ****************************
remarks:        * THIS OBJECT IS MODIFIED
remarks:        * Please note that all data that is generally regarded as personal
remarks:        * data has been removed from this object.
remarks:        * To view the original object, please query the RIPE Database at:
remarks:        * http://www.ripe.net/whois
remarks:        ****************************
Alexey71 commented 6 months ago

А можете подсказать как поправить скрипт для сайта whois -h riswhois.ripe.net На нем проверил работает так whois -h riswhois.ripe.net AS212238

Alexey71 commented 6 months ago

@bol-van Проверил отдельно комманду whois -h riswhois.ripe.net -- "-i origin AS212238" | sed -nre 's/^route: *(.*)/\1/p' Выводит список ип в консоли. Но сам скрипт не хочет, он даже не создает ничего в /tmp

#!/bin/sh

# AS32934 - facebook,instagram
# multiple ASN separated by space

AS="212238"

aslist()
{
    whois -h riswhois.ripe.net -- "-i origin AS$1" | sed -nre 's/^route: *(.*)/\1/p'
}

[ "$1" = "ipban" ] && {
    for as in $AS; do
        aslist $as
    done
}
bol-van commented 6 months ago

Сейчас он работает. В качестве параметра надо передать "ipban" Имя ipset-а

Alexey71 commented 6 months ago

Я не понял если честно). Можете скинуть выше исправленный скрипт,?)

bol-van commented 6 months ago

Я ошибся, radb выдает информацию Можно использовать старый скрипт

Суть его в том, чтобы он выдал в stdout список IP и подсетей, которые нужно внести в ipset/nfset с именем, которое передано в качестве первого параметра ($1) Если вы ожидаете, что по этим IP будет работать zapret, то вы ошибаетесь. ipban - это ipset, который вручную перенаправляется на VPN средствами policy routing Если скрипту не передать 1-й параметр "ipban", вывода не будет никакого

Alexey71 commented 6 months ago

Мне и надо через впн пускать. Раньше работало. Сейчас не создается в /tmp файл просто. Не пойму в чем дело. И соотвественно ничего не добавляется в запрет. Пробовал запускать /opt/zapret/install_easy.sh и /opt/zapret/ipset/create_ipset.sh и/opt/zapret/ipset/get_config.sh, ребутил роутер..

bol-van commented 6 months ago

Этот скрипт ничего не создает в /tmp. Вся логика заполнения ipset-а находится в ipset/create_ipset.sh Он и вызывает хук

в zapret ничего и не будет добавляться, тем более что у вас hostlist фильтр, а не ipset

bol-van commented 6 months ago

Еще раз пояcняю

nozapret - исключение IP адресов. работает всегда zapret - включение IP адресов. работает только при MODE_FILTER=ipset ipban - перенаправление IP на VPN, заполняется всегда, но требует ручной настройки policy routing

Alexey71 commented 6 months ago

Да. Извините, думал адреса будут добавляться в txt файлы которые zapret-ip-user-ipban.txt или zapret-hosts-user-ipban.txt. Добавляются тут все хорошо, работает)

root@OpenWrt:~# nft list set inet zapret ipban
table inet zapret {
        set ipban {
                type ipv4_addr
                policy memory
                size 522288
                flags interval
                auto-merge
                elements = { 2.56.148.0-2.56.150.255, 2.59.60.0/24,
                             5.42.203.0/24, 5.62.34.0/24,
                             5.157.136.0/24, 5.157.139.0/24,
                             5.180.76.0/22, 5.181.4.0/23,
                             5.181.166.0/24, 5.182.108.0/24,
                             5.182.110.0/23, 5.183.100.0/23,
                             5.183.103.0/24, 5.183.176.0/23,
                             . . . . . . . . . . . . . . . . . . . . . . . . .
                             . . . . . . . . . . . . . . . . 
                             217.145.225.0/24, 217.197.160.0-217.197.162.255,
                             220.158.199.0/24 }
        }
}
root@OpenWrt:~#
bol-van commented 6 months ago

create_ipset берет несколько источников несколько имеющихся файлов из директории ipset, вывод stdout хука и единым загоном загоняет это в ipset/nfset в nfset под другому вообще загнать невозможно из-за возможных пересечений

Alexey71 commented 6 months ago

@bol-van Здравствуйте. Поставил tailscale на роутер c openwrt, в телефон тоже поставил и выбрал в приложении using exit node. Теперь через 4г оператора как бы через мой роутер и IP провайдера в роутере используется. Работает обход через zapret, используется список zapret-hosts-user.txt все хорошо. Но вот в запрете у меня еще есть список сайток который через VPN в роутере идет zapret-hosts-user-ipban.txt. Почему то в телефоне не хочет заходить на сайты такие через tailscale. Можете подсказать, где поправить чего?

Alexey71 commented 6 months ago

Пробовал в конфиге так прописать, не помогло

# openwrt: specify networks to be treated as LAN. default is "lan"
#OPENWRT_LAN="lan lan2 tailscale0"
# openwrt: specify networks to be treated as WAN. default wans are interfaces with default route
OPENWRT_WAN4="wan tailscale0"

firewall.zapret.hook.post_up такой

#!/bin/sh

ZAPRET_NFT_TABLE=zapret

cat << EOF | nft -f - 2>/dev/null
 delete chain inet $ZAPRET_NFT_TABLE my_output
 delete chain inet $ZAPRET_NFT_TABLE my_prerouting
EOF

cat << EOF | nft -f -
 add chain inet $ZAPRET_NFT_TABLE my_output { type route hook output priority mangle; }
 flush chain inet $ZAPRET_NFT_TABLE my_output
 add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif ip daddr @ipban ip daddr != @nozapret meta mark set mark or 0x800
 add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif tcp dport 443 ip daddr @zapret ip daddr != @nozapret meta mark set mark or 0x800

 add chain inet $ZAPRET_NFT_TABLE my_prerouting { type filter hook prerouting priority mangle; }
 flush chain inet $ZAPRET_NFT_TABLE my_prerouting
 add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif ip daddr @ipban ip daddr != @nozapret meta mark set mark or 0x800
 add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif tcp dport 443 ip daddr @zapret ip daddr != @nozapret meta mark set mark or 0x800
EOF
bol-van commented 6 months ago

1) tailscale0 это название интерфейса linux или интерфейса openwrt ? 2) как я понимаю tailscale - это входной интерфейс. как бы LAN, а не WAN. так зачем его в wan пишете ? его надо в LAN писать, чтобы он попал в set @lanif

Проверить сеты можно так : /etc/init.d/zapret list_ifsets

bol-van commented 6 months ago

И еще я вижу вы тут скопипастили, видимо не разобравшись Это всего лишь пример. Тут идет перенаправление ipban и любых обращений на порт 443. То есть zapret перестает полностью работать на https, вместо этого идет на VPN

Alexey71 commented 6 months ago

В интерфесе он так 2024-03-17_181506

OPENWRT_LAN="lan lan2 lan3 tailscale0" не помогло lan1 если что это wan, просто wan порт сгорел, теперь на lan1

root@OpenWrt:~# /etc/init.d/zapret list_ifsets
table inet zapret {
        set lanif {
                type ifname
                elements = { "br-lan" }
        }
}
table inet zapret {
        set wanif {
                type ifname
                elements = { "lan1" }
        }
}
table inet zapret {
        set wanif6 {
                type ifname
        }
}
table inet zapret {
        map link_local {
                type ifname : ipv6_addr
        }
}
root@OpenWrt:~#

Отсюда копировал, https://github.com/bol-van/zapret/blob/master/docs/wireguard/wireguard_iproute_openwrt.txt#L299-L319 уже год так). Работает в сети дома

bol-van commented 6 months ago

Работает, только неправильно работает. Я все время пишу, что все мои инструкции не для копипаста. Их надо понимать, хотя бы основные принципиальные вещи. Да, работало, но работало не так, как задумано, не так ли ? ФАктически вы весь веб трафик направили на VPN. Это так задумывалось ? Тогда нет проблем. Только зачем тогда zapret ?

И да, разницы между интерфейсами openwrt и linux вы так же не понимаете. Потому того что надо в сетах и нет.

Надо вот так делать

OPENWRT_LAN="lan tailscale"

OPENWRT_WAN4="wan"

Alexey71 commented 6 months ago

Спасибо теперь на телефоне заработал. Так не весь трафик то идет через VPN Сайты которые в zapret-hosts-user.txt - идут через zapret минутя vpn Сайты которые в zapret-hosts-user-ipban.txt - идут через vpn Остальные сайты которые не добавлены в списки, идут через родной ип без всего же

bol-van commented 6 months ago

add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif tcp dport 443 ip daddr @zapret ip daddr != @nozapret meta mark set mark or 0x800

Вот это правило говорит об обратном. Вы понимаете что там написано ? Направить все из ipset zapret на порт 443 на VPN

bol-van commented 6 months ago

Хотя, если у вас фильтрация по hostist, а не по ipset, то да, это правило не имеет вообще никакого эффекта, потому что ipset zapret не будет заполняться Оно по сути не нужно.

Alexey71 commented 6 months ago

Да

# none,ipset,hostlist,autohostlist
MODE_FILTER=hostlist

В этой теме я с вами переписывался год назад https://github.com/bol-van/zapret/issues/114#issuecomment-1159440143

bol-van commented 6 months ago

Когда режим фильтра hostlist, то на zapret идет все, кроме ipban. И по списку доменов уже принимается решение на уровне nfqws или tpws применять ли дурение к конкретному сайту.

Вам нужно удалить оба правила с 443

Alexey71 commented 6 months ago

Спасибо, удалил. Извините я не очень в правилах, только что подсказывали ранее. А в маршрутизации все так прописано? 1 2 3 4 5 6

bol-van commented 6 months ago

Было бы более информативно сделать ip rule ip route show table 100

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