diff --git a/luci-app-ruantiblock/Makefile b/luci-app-ruantiblock/Makefile index 0dbc6ef..dc9a7db 100644 --- a/luci-app-ruantiblock/Makefile +++ b/luci-app-ruantiblock/Makefile @@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk -PKG_VERSION:=1.2-0 +PKG_VERSION:=1.2-1 LUCI_TITLE:=LuCI support for ruantiblock LUCI_DEPENDS:=+ruantiblock LUCI_PKGARCH:=all diff --git a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/info.js b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/info.js index 5b3244c..5d9c030 100644 --- a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/info.js +++ b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/info.js @@ -47,10 +47,9 @@ return view.extend({ if(data.rules.nftables && data.rules.nftables.length > 1) { for(let i of data.rules.nftables) { if(!i.rule) continue; - let set, bytes; i.rule.expr.forEach(e => { - if(e.match) { + if(e.match && e.match.left && e.match.left.payload) { set = e.match.right.replace('@', ''); } else if(e.counter) { diff --git a/ruantiblock/Makefile b/ruantiblock/Makefile index 2b49288..261d839 100644 --- a/ruantiblock/Makefile +++ b/ruantiblock/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ruantiblock PKG_VERSION:=1.2 -PKG_RELEASE:=0 +PKG_RELEASE:=1 PKG_MAINTAINER:=gSpot include $(INCLUDE_DIR)/package.mk diff --git a/ruantiblock/files/etc/ruantiblock/ruantiblock.conf b/ruantiblock/files/etc/ruantiblock/ruantiblock.conf index 55ac88a..39eaca0 100644 --- a/ruantiblock/files/etc/ruantiblock/ruantiblock.conf +++ b/ruantiblock/files/etc/ruantiblock/ruantiblock.conf @@ -30,7 +30,7 @@ BYPASS_IP_LIST="" IF_VPN="tun0" ### Порт прозрачного прокси Tor (параметр TransPort в torrc) TOR_TRANS_PORT=9040 -### Отправлять в Tor UDP-трафик (0 - вкл, 1 - выкл) +### Отправлять в Tor UDP-трафик (0 - выкл, 1 - вкл) TOR_ALLOW_UDP=0 ### DNS-сервер для резолвинга в домене .onion (Tor) ONION_DNS_ADDR="127.0.0.1#9053" @@ -42,16 +42,8 @@ VPN_RULE_PRIO=1000 T_PROXY_PORT_TCP=1100 ### UDP порт прокси в режиме прозрачного прокси T_PROXY_PORT_UDP=1100 -### Отправлять в прозрачный прокси UDP-трафик (0 - вкл, 1 - выкл) +### Отправлять в прозрачный прокси UDP-трафик (0 - выкл, 1 - вкл) T_PROXY_ALLOW_UDP=0 -### Приоритет правила отбора пакетов nftables для конфигупации Tor или прозрачного прокси -NFT_PRIO_NAT="dstnat - 10" -### Приоритет правила отбора пакетов nftables для трафика локальных клиентов в конфигупации Tor или прозрачного прокси -NFT_PRIO_NAT_LOCAL="filter - 10" -### Приоритет правила отбора пакетов nftables для VPN-конфигурации -NFT_PRIO_ROUTE="mangle + 10" -### Приоритет правила отбора пакетов nftables для трафика локальных клиентов в VPN-конфигурации -NFT_PRIO_ROUTE_LOCAL="mangle + 10" ### Добавление в список блокировок пользовательских записей из файла $USER_ENTRIES_FILE (0 - выкл, 1 - вкл) ### В $DATA_DIR можно создать текстовый файл user_entries с записями IP, CIDR или FQDN (одна на строку). Эти записи будут добавлены в список блокировок ### В записях FQDN можно задать DNS-сервер для разрешения данного домена, через пробел (прим.: domain.com 8.8.8.8) @@ -77,6 +69,16 @@ NFTSET_POLICY_IP="memory" NFTSET_POLICY_DNSMASQ="performance" ### Таймаут для записей в сете $NFTSET_DNSMASQ NFTSET_DNSMASQ_TIMEOUT="1h" +### Динамическое обновление таймаута записей в сете $NFTSET_DNSMASQ (0 - выкл, 1 - вкл) +NFTSET_DNSMASQ_TIMEOUT_UPDATE=1 +### Приоритет правила отбора пакетов nftables для конфигупации Tor или прозрачного прокси +NFT_PRIO_NAT="dstnat - 10" +### Приоритет правила отбора пакетов nftables для трафика локальных клиентов в конфигупации Tor или прозрачного прокси +NFT_PRIO_NAT_LOCAL="filter - 10" +### Приоритет правила отбора пакетов nftables для VPN-конфигурации +NFT_PRIO_ROUTE="mangle + 10" +### Приоритет правила отбора пакетов nftables для трафика локальных клиентов в VPN-конфигурации +NFT_PRIO_ROUTE_LOCAL="mangle + 10" ### Кол-во попыток обновления блэклиста (в случае неудачи) MODULE_RUN_ATTEMPTS=3 ### Таймаут между попытками обновления diff --git a/ruantiblock/files/usr/bin/ruantiblock b/ruantiblock/files/usr/bin/ruantiblock index 56c76d7..8db14a1 100755 --- a/ruantiblock/files/usr/bin/ruantiblock +++ b/ruantiblock/files/usr/bin/ruantiblock @@ -59,14 +59,6 @@ export T_PROXY_PORT_TCP=1100 export T_PROXY_PORT_UDP=1100 ### Отправлять в прозрачный прокси UDP-трафик (0 - выкл, 1 - вкл) export T_PROXY_ALLOW_UDP=0 -### Приоритет правила отбора пакетов nftables для конфигупации Tor или прозрачного прокси -export NFT_PRIO_NAT="dstnat - 10" -### Приоритет правила отбора пакетов nftables для трафика локальных клиентов в конфигупации Tor или прозрачного прокси -export NFT_PRIO_NAT_LOCAL="filter - 10" -### Приоритет правила отбора пакетов nftables для VPN-конфигурации -export NFT_PRIO_ROUTE="mangle + 10" -### Приоритет правила отбора пакетов nftables для трафика локальных клиентов в VPN-конфигурации -export NFT_PRIO_ROUTE_LOCAL="mangle + 10" ### Добавление в список блокировок пользовательских записей из файла $USER_ENTRIES_FILE (0 - выкл, 1 - вкл) ### В $DATA_DIR можно создать текстовый файл user_entries с записями IP, CIDR или FQDN (одна на строку). Эти записи будут добавлены в список блокировок ### В записях FQDN можно задать DNS-сервер для разрешения данного домена, через пробел (прим.: domain.com 8.8.8.8) @@ -90,6 +82,16 @@ export NFTSET_POLICY_IP="memory" export NFTSET_POLICY_DNSMASQ="performance" ### Таймаут для записей в сете $NFTSET_DNSMASQ export NFTSET_DNSMASQ_TIMEOUT="1h" +### Динамическое обновление таймаута записей в сете $NFTSET_DNSMASQ (0 - выкл, 1 - вкл) +export NFTSET_DNSMASQ_TIMEOUT_UPDATE=1 +### Приоритет правила отбора пакетов nftables для конфигупации Tor или прозрачного прокси +export NFT_PRIO_NAT="dstnat - 10" +### Приоритет правила отбора пакетов nftables для трафика локальных клиентов в конфигупации Tor или прозрачного прокси +export NFT_PRIO_NAT_LOCAL="filter - 10" +### Приоритет правила отбора пакетов nftables для VPN-конфигурации +export NFT_PRIO_ROUTE="mangle + 10" +### Приоритет правила отбора пакетов nftables для трафика локальных клиентов в VPN-конфигурации +export NFT_PRIO_ROUTE_LOCAL="mangle + 10" ### Кол-во попыток обновления блэклиста (в случае неудачи) export MODULE_RUN_ATTEMPTS=3 ### Таймаут между попытками обновления diff --git a/ruantiblock/files/usr/share/ruantiblock/nft_functions b/ruantiblock/files/usr/share/ruantiblock/nft_functions index d8e2ff2..4ae0626 100644 --- a/ruantiblock/files/usr/share/ruantiblock/nft_functions +++ b/ruantiblock/files/usr/share/ruantiblock/nft_functions @@ -1,6 +1,7 @@ IP_CMD="ip" NFT_ALLOWED_HOSTS_CHAIN="allowed_hosts" NFT_BLLIST_CHAIN="blacklist" +NFT_DNSMASQ_TIMEOUT_UPDATE_CHAIN="dnsmasq_timeout_update" NFT_ACTION_CHAIN="action" NFT_LOCAL_CLIENTS_CHAIN="local_clients" VPN_ROUTE_TABLE_ID=99 @@ -15,24 +16,27 @@ fi case "$ALLOWED_HOSTS_MODE" in "1") - NFT_ALLOWED_HOSTS_RULE="ip saddr @${NFTSET_ALLOWED_HOSTS} jump ${NFT_BLLIST_CHAIN}" + NFT_ALLOWED_HOSTS_EXPR="ip saddr @${NFTSET_ALLOWED_HOSTS} jump ${NFT_BLLIST_CHAIN}" ;; "2") - NFT_ALLOWED_HOSTS_RULE="ip saddr != @${NFTSET_ALLOWED_HOSTS} jump ${NFT_BLLIST_CHAIN}" + NFT_ALLOWED_HOSTS_EXPR="ip saddr != @${NFTSET_ALLOWED_HOSTS} jump ${NFT_BLLIST_CHAIN}" ;; *) - NFT_ALLOWED_HOSTS_RULE="jump ${NFT_BLLIST_CHAIN}" + NFT_ALLOWED_HOSTS_EXPR="jump ${NFT_BLLIST_CHAIN}" ;; esac -case "$BYPASS_IP_MODE" in - "1") - NFT_BYPASS_IP_RULE="ip daddr @${NFTSET_BYPASS_IP} counter accept" - ;; - *) - NFT_BYPASS_IP_RULE="continue" - ;; -esac +if [ "$BYPASS_IP_MODE" = "1" ]; then + NFT_BYPASS_IP_EXPR="ip daddr @${NFTSET_BYPASS_IP} counter accept" +else + NFT_BYPASS_IP_EXPR="continue" +fi + +if [ "$NFTSET_DNSMASQ_TIMEOUT_UPDATE" = "1" ]; then + NFT_DNSMASQ_RULE_TARGET="$NFT_DNSMASQ_TIMEOUT_UPDATE_CHAIN" +else + NFT_DNSMASQ_RULE_TARGET="$NFT_ACTION_CHAIN" +fi NftCmdWrapper() { local _i=0 _attempts=10 _return_code=1 @@ -68,12 +72,15 @@ NftVpnRouteStatus() { } NftMainAdd() { - local _nft_sets="${NFTSET_CIDR} ${NFTSET_IP} ${NFTSET_DNSMASQ}" _set + local _nft_sets="${NFTSET_CIDR} ${NFTSET_IP}" _set $NFT_CMD add chain $NFT_TABLE "$NFT_LOCAL_CLIENTS_CHAIN" { $LOCAL_CLIENTS_CHAIN_TYPE } $NFT_CMD add chain $NFT_TABLE "$NFT_ACTION_CHAIN" + $NFT_CMD add chain $NFT_TABLE "$NFT_DNSMASQ_TIMEOUT_UPDATE_CHAIN" $NFT_CMD add chain $NFT_TABLE "$NFT_BLLIST_CHAIN" $NFT_CMD add chain $NFT_TABLE "$NFT_ALLOWED_HOSTS_CHAIN" { $MAIN_CHAIN_TYPE } - NftCmdWrapper $NFT_CMD add rule $NFT_TABLE "$NFT_ALLOWED_HOSTS_CHAIN" $NFT_ALLOWED_HOSTS_RULE + NftCmdWrapper $NFT_CMD add rule $NFT_TABLE "$NFT_DNSMASQ_TIMEOUT_UPDATE_CHAIN" ct state new set update ip daddr "@${NFTSET_DNSMASQ}" counter + NftCmdWrapper $NFT_CMD add rule $NFT_TABLE "$NFT_DNSMASQ_TIMEOUT_UPDATE_CHAIN" jump "$NFT_ACTION_CHAIN" + NftCmdWrapper $NFT_CMD add rule $NFT_TABLE "$NFT_ALLOWED_HOSTS_CHAIN" $NFT_ALLOWED_HOSTS_EXPR if [ "$PROXY_MODE" = "2" ]; then NftCmdWrapper $NFT_CMD add rule $NFT_TABLE "$NFT_ACTION_CHAIN" mark set $VPN_PKTS_MARK elif [ "$PROXY_MODE" = "3" ]; then @@ -88,11 +95,12 @@ NftMainAdd() { fi NftCmdWrapper $NFT_CMD add rule $NFT_TABLE "$NFT_BLLIST_CHAIN" ip daddr "@${NFTSET_ONION}" counter goto "$NFT_ACTION_CHAIN" fi - NftCmdWrapper $NFT_CMD add rule $NFT_TABLE "$NFT_BLLIST_CHAIN" $NFT_BYPASS_IP_RULE + NftCmdWrapper $NFT_CMD add rule $NFT_TABLE "$NFT_BLLIST_CHAIN" $NFT_BYPASS_IP_EXPR for _set in $_nft_sets do NftCmdWrapper $NFT_CMD add rule $NFT_TABLE "$NFT_BLLIST_CHAIN" ip daddr "@${_set}" counter goto "$NFT_ACTION_CHAIN" done + NftCmdWrapper $NFT_CMD add rule $NFT_TABLE "$NFT_BLLIST_CHAIN" ip daddr "@${NFTSET_DNSMASQ}" counter goto "$NFT_DNSMASQ_RULE_TARGET" if [ "$PROXY_MODE" = "2" ]; then NftVpnRouteAdd fi @@ -105,6 +113,8 @@ NftMainDelete() { $NFT_CMD delete chain $NFT_TABLE "$NFT_LOCAL_CLIENTS_CHAIN" $NFT_CMD flush chain $NFT_TABLE "$NFT_BLLIST_CHAIN" $NFT_CMD delete chain $NFT_TABLE "$NFT_BLLIST_CHAIN" + $NFT_CMD flush chain $NFT_TABLE "$NFT_DNSMASQ_TIMEOUT_UPDATE_CHAIN" + $NFT_CMD delete chain $NFT_TABLE "$NFT_DNSMASQ_TIMEOUT_UPDATE_CHAIN" $NFT_CMD flush chain $NFT_TABLE "$NFT_ACTION_CHAIN" $NFT_CMD delete chain $NFT_TABLE "$NFT_ACTION_CHAIN" NftVpnRouteDelete 2> /dev/null