diff --git a/autoinstall/autoinstall.sh b/autoinstall/autoinstall.sh index 01f40bc..05dd414 100755 --- a/autoinstall/autoinstall.sh +++ b/autoinstall/autoinstall.sh @@ -9,10 +9,10 @@ LUA_MODULE=1 LUCI_APP=1 OWRT_VERSION="current" -RUAB_VERSION="0.9.1-3" -RUAB_MOD_LUA_VERSION="0.9.1-3" -RUAB_LUCI_APP_VERSION="0.9.1-2" -BASE_URL="https://github.com/gSpotx2f/packages-openwrt/raw/master" +RUAB_VERSION="0.9.2-0" +RUAB_MOD_LUA_VERSION="0.9.2-0" +RUAB_LUCI_APP_VERSION="0.9.2-0" +BASE_URL="https://raw.githubusercontent.com/gSpotx2f/packages-openwrt/master" PKG_DIR="/tmp" if [ -n "$1" ]; then @@ -27,10 +27,10 @@ URL_MOD_LUA_PKG="${BASE_URL}/${OWRT_VERSION}/ruantiblock-mod-lua_${RUAB_MOD_LUA_ URL_LUCI_APP_PKG="${BASE_URL}/${OWRT_VERSION}/luci-app-ruantiblock_${RUAB_LUCI_APP_VERSION}_all.ipk" URL_LUCI_APP_RU_PKG="${BASE_URL}/${OWRT_VERSION}/luci-i18n-ruantiblock-ru_${RUAB_LUCI_APP_VERSION}_all.ipk" ### tor -URL_TORRC="https://github.com/gSpotx2f/ruantiblock_openwrt/raw/master/tor/etc/tor/torrc" +URL_TORRC="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/tor/etc/tor/torrc" ### ruantiblock-mod-lua -URL_LUA_IPTOOL="https://github.com/gSpotx2f/iptool-lua/raw/master/5.1/iptool.lua" -URL_LUA_IDN="https://github.com/haste/lua-idn/raw/master/idn.lua" +URL_LUA_IPTOOL="https://raw.githubusercontent.com/gSpotx2f/iptool-lua/master/5.1/iptool.lua" +URL_LUA_IDN="https://raw.githubusercontent.com/haste/lua-idn/master/idn.lua" ### Local files @@ -248,8 +248,7 @@ InstallLuciApp() { RemoveFile "$FILE_LUCI_APP_RU_PKG" > /dev/null DlFile "$URL_LUCI_APP_PKG" "$FILE_LUCI_APP_PKG" && $OPKG_CMD install "$FILE_LUCI_APP_PKG" && \ DlFile "$URL_LUCI_APP_RU_PKG" "$FILE_LUCI_APP_RU_PKG" && $OPKG_CMD install "$FILE_LUCI_APP_RU_PKG" - rm -f /tmp/luci-modulecache/* - rm -f /tmp/luci-indexcache* + rm -f /tmp/luci-modulecache/* /tmp/luci-indexcache* /etc/init.d/rpcd restart /etc/init.d/uhttpd restart } diff --git a/autoinstall/uninstall.sh b/autoinstall/uninstall.sh index 272b965..2094496 100755 --- a/autoinstall/uninstall.sh +++ b/autoinstall/uninstall.sh @@ -98,8 +98,7 @@ RemoveAppFiles() { $OPKG_CMD remove ruantiblock-mod-py ruantiblock-mod-lua luci-i18n-ruantiblock-ru luci-app-ruantiblock ruantiblock rmdir "${RUAB_CFG_DIR}/scripts" 2> /dev/null rmdir "$HTDOCS_RUAB" 2> /dev/null - rm -f /tmp/luci-modulecache/* - rm -f /tmp/luci-indexcache + rm -f /tmp/luci-modulecache/* /tmp/luci-indexcache* /etc/init.d/rpcd restart /etc/init.d/uhttpd restart } diff --git a/luci-app-ruantiblock/Makefile b/luci-app-ruantiblock/Makefile index d56a270..a309e9b 100644 --- a/luci-app-ruantiblock/Makefile +++ b/luci-app-ruantiblock/Makefile @@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk -PKG_VERSION:=0.9.1-2 +PKG_VERSION:=0.9.2-0 LUCI_TITLE:=LuCI support for ruantiblock LUCI_DEPENDS:=+ruantiblock LUCI_PKGARCH:=all diff --git a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/service.js b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/service.js index 12078f3..b459c72 100644 --- a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/service.js +++ b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/service.js @@ -17,10 +17,9 @@ return view.extend({ disableButtons: function(bool, btn, elems=[]) { let btn_start = elems[1] || document.getElementById("btn_start"); - let btn_destroy = elems[5] || document.getElementById("btn_destroy"); + let btn_destroy = elems[4] || document.getElementById("btn_destroy"); let btn_enable = elems[2] || document.getElementById("btn_enable"); - let btn_update = elems[4] || document.getElementById("btn_update"); - let btn_tp = elems[3] || document.getElementById("btn_tp"); + let btn_update = elems[3] || document.getElementById("btn_update"); btn_start.disabled = bool; btn_update.disabled = bool; @@ -30,15 +29,11 @@ return view.extend({ } else { btn_enable.disabled = bool; }; - if(btn_tp) { - btn_tp.disabled = bool; - }; }, getAppStatus: function() { return Promise.all([ fs.exec(tools.execPath, [ 'raw-status' ]), - fs.exec(tools.execPath, [ 'total-proxy-status' ]), fs.exec(tools.execPath, [ 'vpn-route-status' ]), tools.getInitStatus(tools.appName), L.resolveDefault(fs.read(tools.tokenFile), 0), @@ -62,14 +57,12 @@ return view.extend({ }; let app_status_code = (force_app_code) ? force_app_code : status_array[0].code; - let tp_status_code = status_array[1].code; - let vpn_route_status_code = status_array[2].code; - let enabled_flag = status_array[3]; + let vpn_route_status_code = status_array[1].code; + let enabled_flag = status_array[2]; let proxy_local_clients = section.proxy_local_clients; let proxy_mode = section.proxy_mode; - let bllist_mode = section.bllist_mode; + let bllist_preset = section.bllist_preset; let bllist_module = section.bllist_module; - let bllist_source = section.bllist_source; let btn_enable = elems[2] || document.getElementById('btn_enable'); if(enabled_flag == true) { @@ -84,24 +77,9 @@ return view.extend({ btn_enable.className = btn_style_negative; }; - let btn_tp = elems[3] || document.getElementById('btn_tp'); - if(btn_tp) { - if(tp_status_code == 0) { - btn_tp.onclick = ui.createHandlerFn( - this, this.appAction, 'total-proxy-off', 'btn_tp'); - btn_tp.textContent = _('Enabled'); - btn_tp.className = btn_style_positive; - } else { - btn_tp.onclick = ui.createHandlerFn( - this, this.appAction, 'total-proxy-on', 'btn_tp'); - btn_tp.textContent = _('Disabled'); - btn_tp.className = btn_style_negative; - }; - }; - let btn_start = elems[1] || document.getElementById('btn_start'); - let btn_update = elems[4] || document.getElementById('btn_update'); - let btn_destroy = elems[5] || document.getElementById('btn_destroy'); + let btn_update = elems[3] || document.getElementById('btn_update'); + let btn_destroy = elems[4] || document.getElementById('btn_destroy'); let btnStartStateOn = () => { btn_start.onclick = ui.createHandlerFn( @@ -122,17 +100,11 @@ return view.extend({ btnStartStateOn(); btn_destroy.disabled = false; btn_update.disabled = false; - if(btn_tp) { - btn_tp.disabled = false; - }; } else if(app_status_code == 2) { this.disableButtons(false, null, elems); btnStartStateOff(); btn_update.disabled = true; - if(btn_tp) { - btn_tp.disabled = true; - }; } else if(app_status_code == 3) { btnStartStateOff(); @@ -151,10 +123,8 @@ return view.extend({ (elems[0] || document.getElementById("status")).innerHTML = tools.makeStatusString( app_status_code, proxy_mode, - bllist_mode, + bllist_preset, bllist_module, - bllist_source, - tp_status_code, vpn_route_status_code); if(!poll.active()) { @@ -291,16 +261,6 @@ return view.extend({ }, _('Enable')); layout_append(btn_enable, _('Run at startup')); - let btn_tp = E('button', { - 'id' : 'btn_tp', - 'name' : 'btn_tp', - 'class': btn_style_positive, - }, _('Enable')); - if(proxy_local_clients == '0') { - layout_append(btn_tp, _('Total-proxy'), - _('All traffic goes through the proxy without applying rules')); - }; - let btn_update = E('button', { 'id' : 'btn_update', 'name' : 'btn_update', @@ -323,7 +283,6 @@ return view.extend({ status_string, btn_start, btn_enable, - btn_tp, btn_update, btn_destroy, ]); diff --git a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/settings.js b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/settings.js index 14a322a..20f2302 100644 --- a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/settings.js +++ b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/settings.js @@ -1,9 +1,9 @@ 'use strict'; 'require fs'; -'require uci'; 'require form'; -'require ui'; 'require tools.widgets as widgets'; +'require uci'; +'require ui'; 'require view'; 'require view.ruantiblock.tools as tools'; @@ -29,20 +29,6 @@ return view.extend({ + ` ${_('One of the following:')}\n - ${_('valid IP address')}\n - ${_('valid address#port')}\n`; }, - CBIBlockTitle: form.DummyValue.extend({ - string: null, - - renderWidget: function(section_id, option_index, cfgvalue) { - this.title = this.description = null; - return E([ - E('label', { 'class': 'cbi-value-title' }), - E('div', { 'class': 'cbi-value-field' }, - E('b', {}, this.string) - ), - ]); - }, - }), - load: function() { return Promise.all([ L.resolveDefault(fs.exec(tools.execPath, [ 'raw-status' ]), 1), @@ -132,43 +118,47 @@ return view.extend({ _("Apply proxy rules to router application traffic")); proxy_local_clients.rmempty = false; - // USE_LOGGER - o = s.taboption('main_settings', form.Flag, 'use_logger', + // ENABLE_LOGGING + o = s.taboption('main_settings', form.Flag, 'enable_logging', _('Logging events')); o.rmempty = false; - // DEF_TOTAL_PROXY - o = s.taboption('main_settings', form.Flag, 'def_total_proxy', - _("Enable the 'total-proxy' option at startup")); - o.rmempty = false; - o.default = 0; - o.depends('proxy_local_clients', '0'); - // IPSET_CLEAR_SETS o = s.taboption('main_settings', form.Flag, 'ipset_clear_sets', _('Clean up ipsets before updating blacklist')); o.description = _('Reduces RAM consumption during update'); o.rmempty = false; + // ALOWED_HOSTS_MODE + o = s.taboption('main_settings', form.ListValue, 'alowed_hosts_mode', + _('Host filter')); + o.value('0', _('Disabled')); + o.value('1', _('Only listed hosts')); + o.value('2', _('All hosts except listed')); + o.description = _('Restriction of hosts that are allowed to bypass blocking'); + + // ALOWED_HOSTS_LIST + o = s.taboption('main_settings', form.DynamicList, 'alowed_hosts_list', + _('IP addresses of hosts')); + o.datatype = "ip4addr"; + if(this.appStatusCode == 1 || this.appStatusCode == 2) { /* Tor tab */ s.tab('tor_settings', _('Tor mode')); - // IF_LAN - o = s.taboption('tor_settings', widgets.DeviceSelect, 'if_lan', - _('LAN interface')); - o.multiple = false; - o.noaliases = true; - o.optional = true; - // TOR_TRANS_PORT o = s.taboption('tor_settings', form.Value, 'tor_trans_port', _('Transparent proxy port for iptables rules')); o.rmempty = false; o.datatype = "port"; + //TOR_ALLOW_UDP + o = s.taboption('tor_settings', form.Flag, 'tor_allow_udp', + _("Send UDP traffic to Tor")); + o.rmempty = false; + // ONION_DNS_ADDR o = s.taboption('tor_settings', form.Value, 'onion_dns_addr', _("Optional DNS resolver for '.onion' zone"), 'ipaddress#port'); @@ -208,32 +198,27 @@ return view.extend({ Object.entries(this.availableParsers).forEach( e => bllist_module.value(e[1], e[0])); - // BLLIST_MODE - let bllist_mode = s.taboption('parser_settings', form.ListValue, - 'bllist_mode', _('Module operation mode')); - bllist_mode.value('ip'); - bllist_mode.value('fqdn'); + // BLLIST_PRESET + let bllist_preset = s.taboption('parser_settings', form.ListValue, + 'bllist_preset', _('Blacklist update mode')); + bllist_preset.description = _("Blacklist sources") + ':'; + Object.entries(tools.blacklistPresets).forEach(e => { + bllist_preset.value(e[0], `${e[1][0]} - ${e[1][1]}`); + }); + let bllist_sources = {}; + Object.values(tools.blacklistPresets).forEach(v => {bllist_sources[v[0]] = v[2]}); + Object.entries(bllist_sources).forEach(e => { + bllist_preset.description += `
${e[0]} - ${e[1]}`; + }); - // BLLIST_SOURCE - let bllist_source = s.taboption('parser_settings', form.ListValue, - 'bllist_source', _('Blacklist source')); - bllist_source.description = _("Options") + ':'; - for(let [k, v] of Object.entries(tools.blacklistSources)) { - bllist_source.value(k); - bllist_source.description += `
${k} - ${v}`; - }; - - o = s.taboption('parser_settings', this.CBIBlockTitle, '_dummy_ip'); - o.string = _('IP configuration') + ':'; - - // IP_LIMIT - o = s.taboption('parser_settings', form.Value, 'ip_limit', _("IP limit")); + // BLLIST_IP_LIMIT + o = s.taboption('parser_settings', form.Value, 'bllist_ip_limit', _("IP limit")); o.description = _("The number of IP addresses in the subnet, upon reaching which the entire '/24' subnet is added to the list"); o.rmempty = false; o.datatype = 'uinteger'; - // OPT_EXCLUDE_NETS - o = s.taboption('parser_settings', form.DynamicList, 'opt_exclude_nets'); + // BLLIST_GR_EXCLUDED_NETS + o = s.taboption('parser_settings', form.DynamicList, 'bllist_gr_excluded_nets'); o.title = _('IP subnet patterns (/24) that are excluded from optimization'); o.description = _('e.g:') + ' 192.168.1.'; o.placeholder = _('e.g:') + ' 192.168.1.'; @@ -242,45 +227,42 @@ return view.extend({ + ' ' + _('net pattern') + ' (' + _('e.g:') + ' 192.168.3.)\n'; }; - // SUMMARIZE_IP - o = s.taboption('parser_settings', form.Flag, 'summarize_ip', + // BLLIST_SUMMARIZE_IP + o = s.taboption('parser_settings', form.Flag, 'bllist_summarize_ip', _("Summarize IP ranges")); o.rmempty = false; - // SUMMARIZE_CIDR - o = s.taboption('parser_settings', form.Flag, 'summarize_cidr', + // BLLIST_SUMMARIZE_CIDR + o = s.taboption('parser_settings', form.Flag, 'bllist_summarize_cidr', _("Summarize '/24' networks")); o.rmempty = false; - o = s.taboption('parser_settings', this.CBIBlockTitle, '_dummy_fqdn'); - o.string = _('FQDN configuration') + ':'; - - // SD_LIMIT - o = s.taboption('parser_settings', form.Value, 'sd_limit', + // BLLIST_SD_LIMIT + o = s.taboption('parser_settings', form.Value, 'bllist_sd_limit', _("Subdomains limit")); o.description = _('The number of subdomains in the domain, upon reaching which the entire 2nd level domain is added to the list'); o.rmempty = false; o.datatype = 'uinteger'; - // OPT_EXCLUDE_SLD - o = s.taboption('parser_settings', form.DynamicList, 'opt_exclude_sld', + // BLLIST_GR_EXCLUDED_SLD + o = s.taboption('parser_settings', form.DynamicList, 'bllist_gr_excluded_sld', _('2nd level domains that are excluded from optimization')); o.description = _('e.g:') + ' livejournal.com'; o.placeholder = _('e.g:') + ' livejournal.com'; o.datatype = "hostname"; - // USE_IDN - o = s.taboption('parser_settings', form.Flag, 'use_idn', + // BLLIST_ENABLE_IDN + o = s.taboption('parser_settings', form.Flag, 'bllist_enable_idn', _("Convert cyrillic domains to punycode")); o.rmempty = false; - // ALT_NSLOOKUP - o = s.taboption('parser_settings', form.Flag, 'alt_nslookup', + // BLLIST_ALT_NSLOOKUP + o = s.taboption('parser_settings', form.Flag, 'bllist_alt_nslookup', _('Use optional DNS resolver')); o.rmempty = false; - // ALT_DNS_ADDR - o = s.taboption('parser_settings', form.Value, 'alt_dns_addr', + // BLLIST_ALT_DNS_ADDR + o = s.taboption('parser_settings', form.Value, 'bllist_alt_dns_addr', _("Optional DNS resolver"), 'ipaddress[#port]'); o.rmempty = false; o.validate = this.validateIpPort; @@ -290,26 +272,26 @@ return view.extend({ s.tab('entries_filter_tab', _('Blacklist entry filters')); - // IP_FILTER - o = s.taboption('entries_filter_tab', form.Flag, 'ip_filter', + // BLLIST_IP_FILTER + o = s.taboption('entries_filter_tab', form.Flag, 'bllist_ip_filter', _("Enable IP filter")); o.description = _('Exclude IP addresses from blacklist by IP filter patterns'); o.rmempty = false; - // IP_FILTER edit dialog + // BLLIST_IP_FILTER_FILE edit dialog o = s.taboption('entries_filter_tab', form.Button, '_ip_filter_btn', _("IP filter")); o.onclick = () => ip_filter_edit.show(); o.inputtitle = _('Edit'); o.inputstyle = 'edit btn'; - // FQDN_FILTER - o = s.taboption('entries_filter_tab', form.Flag, 'fqdn_filter', + // BLLIST_FQDN_FILTER + o = s.taboption('entries_filter_tab', form.Flag, 'bllist_fqdn_filter', _("Enable FQDN filter")); o.description = _('Exclude domains from blacklist by FQDN filter patterns'); o.rmempty = false; - // FQDN_FILTER edit dialog + // BLLIST_FQDN_FILTER_FILE edit dialog o = s.taboption('entries_filter_tab', form.Button, '_fqdn_filter_btn', _("FQDN filter")); o.onclick = () => fqdn_filter_edit.show(); diff --git a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/tools.js b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/tools.js index 5eeb5b0..e1ce906 100644 --- a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/tools.js +++ b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/tools.js @@ -31,9 +31,6 @@ document.head.append(E('style', {'type': 'text/css'}, .error { background-color: #ff4e54 !important; } -.total-proxy { - background-color: #ffb937 !important; -} `)); return baseclass.extend({ @@ -52,10 +49,14 @@ return baseclass.extend({ infoLabelStopped : '' + _('Disabled') + '', infoLabelError : '' + _('Error') + '', - blacklistSources: { - 'rublacklist': 'https://rublacklist.net', - 'zapret-info': 'https://github.com/zapret-info/z-i', - 'antifilter' : 'https://antifilter.download', + blacklistPresets: { + 'zapret-info-fqdn': [ 'zapret-info', 'fqdn', 'https://github.com/zapret-info/z-i' ], + 'zapret-info-ip' : [ 'zapret-info', 'ip', 'https://github.com/zapret-info/z-i' ], + 'rublacklist-fqdn': [ 'rublacklist', 'fqdn', 'https://rublacklist.net' ], + 'rublacklist-ip' : [ 'rublacklist', 'ip', 'https://rublacklist.net' ], + 'antifilter-ip' : [ 'antifilter', 'ip', 'https://antifilter.download' ], + 'ruantiblock-fqdn': [ 'ruantiblock', 'fqdn', 'https://github.com/gSpotx2f/ruantiblock_blacklist' ], + 'ruantiblock-ip' : [ 'ruantiblock', 'ip', 'https://github.com/gSpotx2f/ruantiblock_blacklist' ], }, callInitStatus: rpc.declare({ @@ -104,10 +105,8 @@ return baseclass.extend({ makeStatusString: function( app_status_code, proxy_mode, - bllist_mode, + bllist_preset, bllist_module, - bllist_source, - tp_status_code, vpn_route_status_code) { let app_status_label; let spinning = ''; @@ -147,7 +146,7 @@ return baseclass.extend({ ${_('Status')}: - %s %s %s + %s %s @@ -166,29 +165,19 @@ return baseclass.extend({ %s - %s `.format( spinning, app_status_label, - (tp_status_code == 0) ? '' - + _('Total-proxy is on') + '' : '', (app_status_code != 2 && proxy_mode == 2 && vpn_route_status_code != 0) ? '' + _('VPN routing error! Need restart') + '' : '', (proxy_mode == 1) ? 'Tor' : 'VPN', - (!bllist_module || bllist_module === '') ? _('user entries only') : bllist_mode, - (!bllist_module || bllist_module === '') ? '' : - ` - - ${_('Blacklist source')}: - - - - ${bllist_source} - - - ` + (!bllist_module || bllist_module === '') ? _('user entries only') : + (this.blacklistPresets[bllist_preset]) ? + ` + ${this.blacklistPresets[bllist_preset][0]} - ${this.blacklistPresets[bllist_preset][1]}` + : _('Error') + '!' ); }, diff --git a/luci-app-ruantiblock/po/ru/ruantiblock.po b/luci-app-ruantiblock/po/ru/ruantiblock.po index 4807ba5..57ef334 100644 --- a/luci-app-ruantiblock/po/ru/ruantiblock.po +++ b/luci-app-ruantiblock/po/ru/ruantiblock.po @@ -25,8 +25,11 @@ msgstr "Тревога" msgid "All" msgstr "Все" -msgid "All traffic goes through the proxy without applying rules" -msgstr "Весь трафик отправляется в прокси, без применения правил" +msgid "All hosts except listed" +msgstr "Все хосты, кроме перечисленных" + +msgid "Allows you to limit the hosts that are allowed to bypass blocking" +msgstr "Позволяет ограничить хосты, которым разрешено обходить блокировки" msgid "Apply" msgstr "Применить" @@ -43,8 +46,8 @@ msgstr "Модуль блэклиста" msgid "Blacklist settings" msgstr "Настройки блэклиста" -msgid "Blacklist source" -msgstr "Источник блэклиста" +msgid "Blacklist sources" +msgstr "Источники блэклиста" msgid "Blacklist update mode" msgstr "Режим обновления блэклиста" @@ -119,9 +122,6 @@ msgstr "Включить фильтр FQDN" msgid "Enable IP filter" msgstr "Включить фильтр IP" -msgid "Enable the 'total-proxy' option at startup" -msgstr "Включать 'total-proxy' при старте" - msgid "Enabled" msgstr "Включено" @@ -140,9 +140,6 @@ msgstr "Исключение доменов из блэклиста по шаб msgid "Expecting:" msgstr "Ожидается:" -msgid "FQDN configuration" -msgstr "Конфигурация FQDN" - msgid "FQDN filter" msgstr "Фильтр FQDN" @@ -158,14 +155,14 @@ msgstr "Ошибка HTML/XML" msgid "Host" msgstr "Хост" -msgid "Hosts" -msgstr "Хосты" +msgid "Host filter" +msgstr "Фильтр хостов" msgid "Hour" msgstr "Час" -msgid "IP configuration" -msgstr "Конфигурация IP" +msgid "IP addresses of hosts" +msgstr "IP адреса хостов" msgid "IP filter" msgstr "Фильтр IP" @@ -173,6 +170,9 @@ msgstr "Фильтр IP" msgid "IP limit" msgstr "Лимит IP адресов" +msgid "IP restriction mode" +msgstr "Режим ограничения IP адресов" + msgid "IP subnet patterns (/24) that are excluded from optimization" msgstr "Шаблоны IP подсетей (/24) не подлежащих оптимизации" @@ -191,9 +191,6 @@ msgstr "Ipset" msgid "Iptables rules" msgstr "Правила iptables" -msgid "LAN interface" -msgstr "LAN интерфейс" - msgid "Last blacklist update" msgstr "Последнее обновление блэклиста" @@ -267,15 +264,15 @@ msgstr "" msgid "One of the following:" msgstr "Одно из следующих значений:" +msgid "Only listed hosts" +msgstr "Только перечисленные хосты" + msgid "Optional DNS resolver" msgstr "Альтернативный DNS резолвер" msgid "Optional DNS resolver for '.onion' zone" msgstr "Дополнительный DNS резолвер для '.onion' зоны" -msgid "Options" -msgstr "Опции" - msgid "" "Patterns can be strings or regular expressions. Each pattern in a separate " "line, the symbol # in the first position of the line - comments " @@ -306,6 +303,9 @@ msgstr "Обновить лог" msgid "Reset" msgstr "Сбросить" +msgid "Restriction of hosts that are allowed to bypass blocking" +msgstr "Ограничение хостов, которым разрешено обходить блокировки" + msgid "Ruantiblock" msgstr "Ruantiblock" @@ -315,6 +315,9 @@ msgstr "Запуск при старте системы" msgid "Save" msgstr "Сохранить" +msgid "Send UDP traffic to Tor" +msgstr "Отправлять в Tor UDP-трафик" + msgid "Service" msgstr "Служба" @@ -386,12 +389,6 @@ msgstr "Конфигурационный файл Tor" msgid "Tor mode" msgstr "Режим Tor" -msgid "Total-proxy" -msgstr "Total-proxy" - -msgid "Total-proxy is on" -msgstr "Total-proxy включен" - msgid "Transparent proxy port for iptables rules" msgstr "Порт прозрачного прокси для правил iptables" diff --git a/luci-app-ruantiblock/po/templates/ruantiblock.pot b/luci-app-ruantiblock/po/templates/ruantiblock.pot index fa66d6a..36d7c16 100644 --- a/luci-app-ruantiblock/po/templates/ruantiblock.pot +++ b/luci-app-ruantiblock/po/templates/ruantiblock.pot @@ -13,7 +13,7 @@ msgstr "" msgid "All" msgstr "" -msgid "All traffic goes through the proxy without applying rules" +msgid "All hosts except listed" msgstr "" msgid "Apply" @@ -31,7 +31,7 @@ msgstr "" msgid "Blacklist settings" msgstr "" -msgid "Blacklist source" +msgid "Blacklist sources" msgstr "" msgid "Blacklist update mode" @@ -79,6 +79,7 @@ msgstr "" msgid "Debug" msgstr "" + msgid "Disabled" msgstr "" @@ -104,13 +105,12 @@ msgstr "" msgid "Enable IP filter" msgstr "" -msgid "Enable the 'total-proxy' option at startup" -msgstr "" msgid "Enabled" msgstr "" msgid "Entries" msgstr "" + msgid "Error" msgstr "" @@ -123,9 +123,6 @@ msgstr "" msgid "Expecting:" msgstr "" -msgid "FQDN configuration" -msgstr "" - msgid "FQDN filter" msgstr "" @@ -141,13 +138,13 @@ msgstr "" msgid "Host" msgstr "" -msgid "Hosts" +msgid "Host filter" msgstr "" msgid "Hour" msgstr "" -msgid "IP configuration" +msgid "IP addresses of hosts" msgstr "" msgid "IP filter" @@ -174,9 +171,6 @@ msgstr "" msgid "Iptables rules" msgstr "" -msgid "LAN interface" -msgstr "" - msgid "Last blacklist update" msgstr "" @@ -247,15 +241,15 @@ msgstr "" msgid "One of the following:" msgstr "" +msgid "Only listed hosts" +msgstr "" + msgid "Optional DNS resolver" msgstr "" msgid "Optional DNS resolver for '.onion' zone" msgstr "" -msgid "Options" -msgstr "" - msgid "" "Patterns can be strings or regular expressions. Each pattern in a separate " "line, the symbol # in the first position of the line - comments " @@ -280,6 +274,9 @@ msgstr "" msgid "Reset" msgstr "" +msgid "Restriction of hosts that are allowed to bypass blocking" +msgstr "" + msgid "Ruantiblock" msgstr "" @@ -289,6 +286,9 @@ msgstr "" msgid "Save" msgstr "" +msgid "Send UDP traffic to Tor" +msgstr "" + msgid "Service" msgstr "" @@ -353,12 +353,6 @@ msgstr "" msgid "Tor mode" msgstr "" -msgid "Total-proxy" -msgstr "" - -msgid "Total-proxy is on" -msgstr "" - msgid "Transparent proxy port for iptables rules" msgstr "" diff --git a/ruantiblock-mod-lua/Makefile b/ruantiblock-mod-lua/Makefile index ec33335..436673c 100644 --- a/ruantiblock-mod-lua/Makefile +++ b/ruantiblock-mod-lua/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ruantiblock-mod-lua -PKG_VERSION:=0.9.1 -PKG_RELEASE:=3 +PKG_VERSION:=0.9.2 +PKG_RELEASE:=0 PKG_MAINTAINER:=gSpot include $(INCLUDE_DIR)/package.mk diff --git a/ruantiblock-mod-lua/files/usr/libexec/ruantiblock/ruab_parser.lua b/ruantiblock-mod-lua/files/usr/libexec/ruantiblock/ruab_parser.lua index 9ef6b03..392361e 100755 --- a/ruantiblock-mod-lua/files/usr/libexec/ruantiblock/ruab_parser.lua +++ b/ruantiblock-mod-lua/files/usr/libexec/ruantiblock/ruab_parser.lua @@ -37,20 +37,20 @@ local Config = Class(nil, { environ_table = { ["BLLIST_SOURCE"] = true, ["BLLIST_MODE"] = true, - ["ALT_NSLOOKUP"] = true, - ["ALT_DNS_ADDR"] = true, - ["USE_IDN"] = true, - ["OPT_EXCLUDE_SLD"] = true, - ["OPT_EXCLUDE_MASKS"] = true, - ["FQDN_FILTER"] = true, - ["FQDN_FILTER_FILE"] = true, - ["IP_FILTER"] = true, - ["IP_FILTER_FILE"] = true, - ["SD_LIMIT"] = true, - ["IP_LIMIT"] = true, - ["OPT_EXCLUDE_NETS"] = true, - ["BLLIST_MIN_ENTRS"] = true, - ["STRIP_WWW"] = true, + ["BLLIST_ALT_NSLOOKUP"] = true, + ["BLLIST_ALT_DNS_ADDR"] = true, + ["BLLIST_ENABLE_IDN"] = true, + ["BLLIST_GR_EXCLUDED_SLD"] = true, + ["BLLIST_GR_EXCLUDED_MASKS"] = true, + ["BLLIST_FQDN_FILTER"] = true, + ["BLLIST_FQDN_FILTER_FILE"] = true, + ["BLLIST_IP_FILTER"] = true, + ["BLLIST_IP_FILTER_FILE"] = true, + ["BLLIST_SD_LIMIT"] = true, + ["BLLIST_IP_LIMIT"] = true, + ["BLLIST_GR_EXCLUDED_NETS"] = true, + ["BLLIST_MIN_ENTRIES"] = true, + ["BLLIST_STRIP_WWW"] = true, ["DATA_DIR"] = true, ["IPSET_DNSMASQ"] = true, ["IPSET_IP_TMP"] = true, @@ -63,14 +63,21 @@ local Config = Class(nil, { ["ZI_ALL_URL"] = true, ["AF_IP_URL"] = true, ["AF_FQDN_URL"] = true, + ["RA_IP_IPSET_URL"] = true, + ["RA_IP_DMASK_URL"] = true, + ["RA_IP_STAT_URL"] = true, + ["RA_FQDN_IPSET_URL"] = true, + ["RA_FQDN_DMASK_URL"] = true, + ["RA_FQDN_STAT_URL"] = true, ["RBL_ENCODING"] = true, ["ZI_ENCODING"] = true, ["AF_ENCODING"] = true, - ["SUMMARIZE_IP"] = true, - ["SUMMARIZE_CIDR"] = true, + ["RA_ENCODING"] = true, + ["BLLIST_SUMMARIZE_IP"] = true, + ["BLLIST_SUMMARIZE_CIDR"] = true, }, - FQDN_FILTER_PATTERNS = {}, - IP_FILTER_PATTERNS = {}, + BLLIST_FQDN_FILTER_PATTERNS = {}, + BLLIST_IP_FILTER_PATTERNS = {}, -- iconv type: standalone iconv or lua-iconv (standalone, lua) ICONV_TYPE = "standalone", -- standalone iconv @@ -88,8 +95,8 @@ Config.wget_user_agent = (Config.http_send_headers["User-Agent"]) and ' -U "' .. function Config:load_config(t) local config_arrays = { - ["OPT_EXCLUDE_SLD"] = true, - ["OPT_EXCLUDE_NETS"] = true, + ["BLLIST_GR_EXCLUDED_SLD"] = true, + ["BLLIST_GR_EXCLUDED_NETS"] = true, } for k, v in pairs(t) do if config_arrays[k] then @@ -121,13 +128,13 @@ local function remap_bool(val) return (val ~= 0 and val ~= false and val ~= nil) and true or false end -Config.ALT_NSLOOKUP = remap_bool(Config.ALT_NSLOOKUP) -Config.USE_IDN = remap_bool(Config.USE_IDN) -Config.STRIP_WWW = remap_bool(Config.STRIP_WWW) -Config.FQDN_FILTER = remap_bool(Config.FQDN_FILTER) -Config.IP_FILTER = remap_bool(Config.IP_FILTER) -Config.SUMMARIZE_IP = remap_bool(Config.SUMMARIZE_IP) -Config.SUMMARIZE_CIDR = remap_bool(Config.SUMMARIZE_CIDR) +Config.BLLIST_ALT_NSLOOKUP = remap_bool(Config.BLLIST_ALT_NSLOOKUP) +Config.BLLIST_ENABLE_IDN = remap_bool(Config.BLLIST_ENABLE_IDN) +Config.BLLIST_STRIP_WWW = remap_bool(Config.BLLIST_STRIP_WWW) +Config.BLLIST_FQDN_FILTER = remap_bool(Config.BLLIST_FQDN_FILTER) +Config.BLLIST_IP_FILTER = remap_bool(Config.BLLIST_IP_FILTER) +Config.BLLIST_SUMMARIZE_IP = remap_bool(Config.BLLIST_SUMMARIZE_IP) +Config.BLLIST_SUMMARIZE_CIDR = remap_bool(Config.BLLIST_SUMMARIZE_CIDR) -- Loading filters @@ -143,11 +150,11 @@ function Config:load_filter_files() file_handler:close() end end - if self.FQDN_FILTER then - load_file(self.FQDN_FILTER_FILE, self.FQDN_FILTER_PATTERNS) + if self.BLLIST_FQDN_FILTER then + load_file(self.BLLIST_FQDN_FILTER_FILE, self.BLLIST_FQDN_FILTER_PATTERNS) end - if self.IP_FILTER then - load_file(self.IP_FILTER_FILE, self.IP_FILTER_PATTERNS) + if self.BLLIST_IP_FILTER then + load_file(self.BLLIST_IP_FILTER_FILE, self.BLLIST_IP_FILTER_PATTERNS) end end @@ -168,8 +175,8 @@ if not ltn12 then end local idn = prequire("idn") -if Config.USE_IDN and not idn then - error("You need to install idn.lua (github.com/haste/lua-idn) or 'USE_IDN' must be set to '0'") +if Config.BLLIST_ENABLE_IDN and not idn then + error("You need to install idn.lua (github.com/haste/lua-idn) or 'BLLIST_ENABLE_IDN' must be set to '0'") end local iconv = prequire("iconv") @@ -181,8 +188,8 @@ if prequire("bit") then end end if not si then - Config.SUMMARIZE_CIDR = false - Config.SUMMARIZE_IP = false + Config.BLLIST_SUMMARIZE_CIDR = false + Config.BLLIST_SUMMARIZE_IP = false end -- Iconv check @@ -268,10 +275,10 @@ end function BlackListParser:fill_ip_tables(val) if val and val ~= "" then for ip_entry in val:gmatch(self.ip_pattern .. "/?%d?%d?") do - if not self.IP_FILTER or (self.IP_FILTER and not self:check_filter(ip_entry, self.IP_FILTER_PATTERNS)) then + if not self.BLLIST_IP_FILTER or (self.BLLIST_IP_FILTER and not self:check_filter(ip_entry, self.BLLIST_IP_FILTER_PATTERNS)) then if ip_entry:match("^" .. self.ip_pattern .. "$") and not self.ip_table[ip_entry] then local subnet = self:get_subnet(ip_entry) - if subnet and (self.OPT_EXCLUDE_NETS[subnet] or ((not self.IP_LIMIT or self.IP_LIMIT == 0) or (not self.ip_subnet_table[subnet] or self.ip_subnet_table[subnet] < self.IP_LIMIT))) then + if subnet and (self.BLLIST_GR_EXCLUDED_NETS[subnet] or ((not self.BLLIST_IP_LIMIT or self.BLLIST_IP_LIMIT == 0) or (not self.ip_subnet_table[subnet] or self.ip_subnet_table[subnet] < self.BLLIST_IP_LIMIT))) then self.ip_table[ip_entry] = subnet self.ip_subnet_table[subnet] = (self.ip_subnet_table[subnet] or 0) + 1 self.ip_count = self.ip_count + 1 @@ -291,12 +298,12 @@ end function BlackListParser:fill_domain_tables(val) val = val:gsub("%*%.", ""):gsub("%.$", ""):lower() - if self.STRIP_WWW then + if self.BLLIST_STRIP_WWW then val = val:gsub("^www[0-9]?%.", "") end - if not self.FQDN_FILTER or (self.FQDN_FILTER and not self:check_filter(val, self.FQDN_FILTER_PATTERNS)) then + if not self.BLLIST_FQDN_FILTER or (self.BLLIST_FQDN_FILTER and not self:check_filter(val, self.BLLIST_FQDN_FILTER_PATTERNS)) then if val:match("^" .. self.fqdn_pattern .. "+$") then - elseif self.USE_IDN and val:match("^[^\\/&%?]-[^\\/&%?%.]+%.[^\\/&%?%.]+%.?$") then + elseif self.BLLIST_ENABLE_IDN and val:match("^[^\\/&%?]-[^\\/&%?%.]+%.[^\\/&%?%.]+%.?$") then val = self:convert_to_punycode(val) if not val then return false @@ -305,7 +312,7 @@ function BlackListParser:fill_domain_tables(val) return false end local sld = self:get_sld(val) - if sld and (self.OPT_EXCLUDE_SLD[sld] or ((not self.SD_LIMIT or self.SD_LIMIT == 0) or (not self.sld_table[sld] or self.sld_table[sld] < self.SD_LIMIT))) then + if sld and (self.BLLIST_GR_EXCLUDED_SLD[sld] or ((not self.BLLIST_SD_LIMIT or self.BLLIST_SD_LIMIT == 0) or (not self.sld_table[sld] or self.sld_table[sld] < self.BLLIST_SD_LIMIT))) then self.fqdn_table[val] = sld self.sld_table[sld] = (self.sld_table[sld] or 0) + 1 self.fqdn_count = self.fqdn_count + 1 @@ -323,7 +330,7 @@ function BlackListParser:optimize_ip_table() local optimized_table = {} for ipaddr, subnet in pairs(self.ip_table) do if self.ip_subnet_table[subnet] then - if (self.IP_LIMIT and self.IP_LIMIT > 0 and not self.OPT_EXCLUDE_NETS[subnet]) and self.ip_subnet_table[subnet] >= self.IP_LIMIT then + if (self.BLLIST_IP_LIMIT and self.BLLIST_IP_LIMIT > 0 and not self.BLLIST_GR_EXCLUDED_NETS[subnet]) and self.ip_subnet_table[subnet] >= self.BLLIST_IP_LIMIT then self.cidr_table[string.format("%s0/24", subnet)] = true self.ip_subnet_table[subnet] = nil self.cidr_count = self.cidr_count + 1 @@ -339,9 +346,9 @@ end function BlackListParser:optimize_fqdn_table() local optimized_table = {} - if self.OPT_EXCLUDE_MASKS and #self.OPT_EXCLUDE_MASKS > 0 then + if self.BLLIST_GR_EXCLUDED_MASKS and #self.BLLIST_GR_EXCLUDED_MASKS > 0 then for sld in pairs(self.sld_table) do - for _, pattern in ipairs(self.OPT_EXCLUDE_MASKS) do + for _, pattern in ipairs(self.BLLIST_GR_EXCLUDED_MASKS) do if sld:find(pattern) then self.sld_table[sld] = 0 break @@ -352,7 +359,7 @@ function BlackListParser:optimize_fqdn_table() for fqdn, sld in pairs(self.fqdn_table) do local key_value = fqdn if (not self.fqdn_table[sld] or fqdn == sld) and self.sld_table[sld] then - if (self.SD_LIMIT and self.SD_LIMIT > 0 and not self.OPT_EXCLUDE_SLD[sld]) and self.sld_table[sld] >= self.SD_LIMIT then + if (self.BLLIST_SD_LIMIT and self.BLLIST_SD_LIMIT > 0 and not self.BLLIST_GR_EXCLUDED_SLD[sld]) and self.sld_table[sld] >= self.BLLIST_SD_LIMIT then key_value = sld self.sld_table[sld] = nil end @@ -395,8 +402,8 @@ end function BlackListParser:write_dnsmasq_config() local file_handler = assert(io.open(self.DNSMASQ_DATA_FILE, "w"), "Could not open dnsmasq config") for fqdn in pairs(self.fqdn_table) do - if self.ALT_NSLOOKUP then - file_handler:write(string.format("server=/%s/%s\n", fqdn, self.ALT_DNS_ADDR)) + if self.BLLIST_ALT_NSLOOKUP then + file_handler:write(string.format("server=/%s/%s\n", fqdn, self.BLLIST_ALT_DNS_ADDR)) end file_handler:write(string.format("ipset=/%s/%s\n", fqdn, self.IPSET_DNSMASQ)) end @@ -455,13 +462,13 @@ end function BlackListParser:run() local return_code = 0 if self:get_http_data(self.url) then - if (self.fqdn_count + self.ip_count + self.cidr_count) > self.BLLIST_MIN_ENTRS then + if (self.fqdn_count + self.ip_count + self.cidr_count) > self.BLLIST_MIN_ENTRIES then self:optimize_fqdn_table() self:optimize_ip_table() - if self.SUMMARIZE_IP then + if self.BLLIST_SUMMARIZE_IP then self:group_ip_ranges() end - if self.SUMMARIZE_CIDR then + if self.BLLIST_SUMMARIZE_CIDR then self:group_cidr_ranges() end self:write_ipset_config() @@ -568,14 +575,65 @@ end local AfIp = Class(Af, { url = Config.AF_IP_URL, sink = ip_sink, - BLLIST_MIN_ENTRS = 100, + BLLIST_MIN_ENTRIES = 100, +}) + + -- ruantiblock + +local Ra = Class(BlackListParser, { + url_ipset = Config.RA_FQDN_IPSET_URL, + url_dnsmasq = Config.RA_FQDN_DMASK_URL, + url_stat = Config.RA_FQDN_STAT_URL, +}) + +function Ra:download_config(url, file) + local ret_val = false + self.current_file_handler = assert(io.open(file, "w"), "Could not open file") + if self:get_http_data(url) then + ret_val = true + end + self.current_file_handler:close() + return ret_val +end + +function Ra:chunk_buffer() + return function(chunk) + return chunk + end +end + +function Ra:sink() + return function(chunk) + if chunk and chunk ~= "" then + self.current_file_handler:write(chunk) + end + return true + end +end + +function Ra:run() + local return_code = 1 + if self:download_config(self.url_ipset, self.IP_DATA_FILE) then + if self:download_config(self.url_dnsmasq, self.DNSMASQ_DATA_FILE) then + if self:download_config(self.url_stat, self.UPDATE_STATUS_FILE) then + return_code = 0 + end + end + end + return return_code +end + +local RaIp = Class(Ra, { + url_ipset = Config.RA_IP_IPSET_URL, + url_dnsmasq = Config.RA_IP_DMASK_URL, + url_stat = Config.RA_IP_STAT_URL, }) ----------------------------- Main section ------------------------------ local ctx_table = { - ["ip"] = {["rublacklist"] = RblIp, ["zapret-info"] = ZiIp, ["antifilter"] = AfIp}, - ["fqdn"] = {["rublacklist"] = Rbl, ["zapret-info"] = Zi, ["antifilter"] = Af}, + ["ip"] = {["rublacklist"] = RblIp, ["zapret-info"] = ZiIp, ["antifilter"] = AfIp, ["ruantiblock"] = RaIp}, + ["fqdn"] = {["rublacklist"] = Rbl, ["zapret-info"] = Zi, ["antifilter"] = Af, ["ruantiblock"] = Ra}, } local return_code = 1 diff --git a/ruantiblock-mod-py/Makefile b/ruantiblock-mod-py/Makefile index 2b49a4a..f51c2d4 100644 --- a/ruantiblock-mod-py/Makefile +++ b/ruantiblock-mod-py/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ruantiblock-mod-py -PKG_VERSION:=0.9.1 -PKG_RELEASE:=3 +PKG_VERSION:=0.9.2 +PKG_RELEASE:=0 PKG_MAINTAINER:=gSpot include $(INCLUDE_DIR)/package.mk diff --git a/ruantiblock-mod-py/files/usr/libexec/ruantiblock/ruab_parser.py b/ruantiblock-mod-py/files/usr/libexec/ruantiblock/ruab_parser.py index a83adf0..3b0c7f9 100755 --- a/ruantiblock-mod-py/files/usr/libexec/ruantiblock/ruab_parser.py +++ b/ruantiblock-mod-py/files/usr/libexec/ruantiblock/ruab_parser.py @@ -21,20 +21,20 @@ class Config: environ_list = [ "BLLIST_SOURCE", "BLLIST_MODE", - "ALT_NSLOOKUP", - "ALT_DNS_ADDR", - "USE_IDN", - "OPT_EXCLUDE_SLD", - "OPT_EXCLUDE_MASKS", - "FQDN_FILTER", - "FQDN_FILTER_FILE", - "IP_FILTER", - "IP_FILTER_FILE", - "SD_LIMIT", - "IP_LIMIT", - "OPT_EXCLUDE_NETS", - "BLLIST_MIN_ENTRS", - "STRIP_WWW", + "BLLIST_ALT_NSLOOKUP", + "BLLIST_ALT_DNS_ADDR", + "BLLIST_ENABLE_IDN", + "BLLIST_GR_EXCLUDED_SLD", + "BLLIST_GR_EXCLUDED_MASKS", + "BLLIST_FQDN_FILTER", + "BLLIST_FQDN_FILTER_FILE", + "BLLIST_IP_FILTER", + "BLLIST_IP_FILTER_FILE", + "BLLIST_SD_LIMIT", + "BLLIST_IP_LIMIT", + "BLLIST_GR_EXCLUDED_NETS", + "BLLIST_MIN_ENTRIES", + "BLLIST_STRIP_WWW", "DATA_DIR", "IPSET_DNSMASQ", "IPSET_IP_TMP", @@ -47,14 +47,21 @@ class Config: "ZI_ALL_URL", "AF_IP_URL", "AF_FQDN_URL", + "RA_IP_IPSET_URL", + "RA_IP_DMASK_URL", + "RA_IP_STAT_URL", + "RA_FQDN_IPSET_URL", + "RA_FQDN_DMASK_URL", + "RA_FQDN_STAT_URL", "RBL_ENCODING", "ZI_ENCODING", "AF_ENCODING", - "SUMMARIZE_IP", - "SUMMARIZE_CIDR", + "RA_ENCODING", + "BLLIST_SUMMARIZE_IP", + "BLLIST_SUMMARIZE_CIDR", ] - FQDN_FILTER_PATTERNS = set() - IP_FILTER_PATTERNS = set() + BLLIST_FQDN_FILTER_PATTERNS = set() + BLLIST_IP_FILTER_PATTERNS = set() @classmethod def _load_config(cls, cfg_dict): @@ -63,8 +70,8 @@ class Config: return re.sub('"', '', string) config_arrays = { - "OPT_EXCLUDE_SLD", - "OPT_EXCLUDE_NETS", + "BLLIST_GR_EXCLUDED_SLD", + "BLLIST_GR_EXCLUDED_NETS", } try: for k, v in cfg_dict.items(): @@ -98,13 +105,13 @@ class Config: @classmethod def load_fqdn_filter(cls, file_path=None): - if cls.FQDN_FILTER: - cls._load_filter(file_path or cls.FQDN_FILTER_FILE, cls.FQDN_FILTER_PATTERNS) + if cls.BLLIST_FQDN_FILTER: + cls._load_filter(file_path or cls.BLLIST_FQDN_FILTER_FILE, cls.BLLIST_FQDN_FILTER_PATTERNS) @classmethod def load_ip_filter(cls, file_path=None): - if cls.IP_FILTER: - cls._load_filter(file_path or cls.IP_FILTER_FILE, cls.IP_FILTER_PATTERNS) + if cls.BLLIST_IP_FILTER: + cls._load_filter(file_path or cls.BLLIST_IP_FILTER_FILE, cls.BLLIST_IP_FILTER_PATTERNS) class ParserError(Exception): @@ -240,13 +247,13 @@ class BlackListParser(Config): def ip_field_processing(self, string): for i in string.split(self.ips_separator): - if self.IP_FILTER and self._check_filter(i, self.IP_FILTER_PATTERNS): + if self.BLLIST_IP_FILTER and self._check_filter(i, self.BLLIST_IP_FILTER_PATTERNS): continue if self.ip_pattern.fullmatch(i) and i not in self.ip_set: subnet = self._get_subnet(i) - if subnet in self.OPT_EXCLUDE_NETS or ( - not self.IP_LIMIT or ( - subnet not in self.ip_subnet_dict or self.ip_subnet_dict[subnet] < self.IP_LIMIT + if subnet in self.BLLIST_GR_EXCLUDED_NETS or ( + not self.BLLIST_IP_LIMIT or ( + subnet not in self.ip_subnet_dict or self.ip_subnet_dict[subnet] < self.BLLIST_IP_LIMIT ) ): self.ip_set[i] = subnet @@ -256,7 +263,7 @@ class BlackListParser(Config): def _convert_to_punycode(self, string): if self.cyr_pattern.search(string): - if self.USE_IDN: + if self.BLLIST_ENABLE_IDN: try: string = string.encode("idna").decode( self.site_encoding or self.default_site_encoding) @@ -274,17 +281,17 @@ class BlackListParser(Config): if self.ip_pattern.fullmatch(string): raise FieldValueError() string = string.strip("*.").lower() - if self.STRIP_WWW: + if self.BLLIST_STRIP_WWW: string = self.www_pattern.sub("", string) - if not self.FQDN_FILTER or ( - self.FQDN_FILTER and not self._check_filter(string, self.FQDN_FILTER_PATTERNS) + if not self.BLLIST_FQDN_FILTER or ( + self.BLLIST_FQDN_FILTER and not self._check_filter(string, self.BLLIST_FQDN_FILTER_PATTERNS) ): if self.fqdn_pattern.fullmatch(string): string = self._convert_to_punycode(string) sld = self._get_sld(string) - if sld in self.OPT_EXCLUDE_SLD or ( - not self.SD_LIMIT or ( - sld not in self.sld_dict or self.sld_dict[sld] < self.SD_LIMIT + if sld in self.BLLIST_GR_EXCLUDED_SLD or ( + not self.BLLIST_SD_LIMIT or ( + sld not in self.sld_dict or self.sld_dict[sld] < self.BLLIST_SD_LIMIT ) ): self.sld_dict[sld] = (self.sld_dict.get(sld) or 0) + 1 @@ -297,8 +304,8 @@ class BlackListParser(Config): raise NotImplementedError() def _check_sld_masks(self, sld): - if self.OPT_EXCLUDE_MASKS: - for pattern in self.OPT_EXCLUDE_MASKS: + if self.BLLIST_GR_EXCLUDED_MASKS: + for pattern in self.BLLIST_GR_EXCLUDED_MASKS: if re.fullmatch(pattern, sld): return True return False @@ -308,8 +315,8 @@ class BlackListParser(Config): for fqdn, sld in self.fqdn_set.items(): if sld and (fqdn == sld or sld not in self.fqdn_set) and self.sld_dict.get(sld): if (not self._check_sld_masks(sld) and ( - self.SD_LIMIT and sld not in self.OPT_EXCLUDE_SLD - )) and (self.sld_dict[sld] >= self.SD_LIMIT): + self.BLLIST_SD_LIMIT and sld not in self.BLLIST_GR_EXCLUDED_SLD + )) and (self.sld_dict[sld] >= self.BLLIST_SD_LIMIT): record_value = sld del(self.sld_dict[sld]) else: @@ -322,8 +329,8 @@ class BlackListParser(Config): optimized_set = set() for ip_addr, subnet in self.ip_set.items(): if subnet in self.ip_subnet_dict: - if subnet not in self.OPT_EXCLUDE_NETS and ( - self.IP_LIMIT and self.ip_subnet_dict[subnet] >= self.IP_LIMIT + if subnet not in self.BLLIST_GR_EXCLUDED_NETS and ( + self.BLLIST_IP_LIMIT and self.ip_subnet_dict[subnet] >= self.BLLIST_IP_LIMIT ): self.cidr_set.add(f"{subnet}0/24") del(self.ip_subnet_dict[subnet]) @@ -333,24 +340,24 @@ class BlackListParser(Config): self.ip_set = optimized_set def _group_ip_ranges(self): - if self.SUMMARIZE_IP: + if self.BLLIST_SUMMARIZE_IP: for i in summarize_ip_ranges(self.ip_set, True): self.cidr_set.add(i.with_prefixlen) self.ip_count = len(self.ip_set) def _group_cidr_ranges(self): - if self.SUMMARIZE_CIDR: + if self.BLLIST_SUMMARIZE_CIDR: for i in summarize_nets(self.cidr_set): self.cidr_set.add(i.with_prefixlen) self.cidr_count = len(self.cidr_set) def run(self): ret_value = 1 - self.FQDN_FILTER_PATTERNS = self._compile_filter_patterns(self.FQDN_FILTER_PATTERNS) - self.IP_FILTER_PATTERNS = self._compile_filter_patterns(self.IP_FILTER_PATTERNS) + self.BLLIST_FQDN_FILTER_PATTERNS = self._compile_filter_patterns(self.BLLIST_FQDN_FILTER_PATTERNS) + self.BLLIST_IP_FILTER_PATTERNS = self._compile_filter_patterns(self.BLLIST_IP_FILTER_PATTERNS) self.records_separator = bytes(self.records_separator, "utf-8") self.parser_func() - if (len(self.ip_set) + len(self.cidr_set) + len(self.fqdn_set)) >= self.BLLIST_MIN_ENTRS: + if (len(self.ip_set) + len(self.cidr_set) + len(self.fqdn_set)) >= self.BLLIST_MIN_ENTRIES: self._optimize_fqdn_set() self._optimize_ip_set() self._group_ip_ranges() @@ -437,12 +444,42 @@ class AfIp(BlackListParser): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.url = self.AF_IP_URL - self.BLLIST_MIN_ENTRS = 100 + self.BLLIST_MIN_ENTRIES = 100 def parser_func(self): for entry in self._split_entries(): self.ip_field_processing(entry) +class RaFQDN(BlackListParser): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.url_ipset = self.RA_FQDN_IPSET_URL + self.url_dnsmasq = self.RA_FQDN_DMASK_URL + self.url_stat = self.RA_FQDN_STAT_URL + self.current_file_handler = None + + def parser_func(self): + for chunk in self._download_data(): + if chunk: + self.current_file_handler.write(chunk) + + def download_config(self, url, cfg_file): + self.url = url + with open(cfg_file, "wb", buffering=-1) as self.current_file_handler: + self.parser_func() + + def run(self): + self.download_config(self.url_ipset, self.IP_DATA_FILE) + self.download_config(self.url_dnsmasq, self.DNSMASQ_DATA_FILE) + self.download_config(self.url_stat, self.UPDATE_STATUS_FILE) + return 0 + +class RaIp(RaFQDN): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.url_ipset = self.RA_IP_IPSET_URL + self.url_dnsmasq = self.RA_IP_DMASK_URL + self.url_stat = self.RA_IP_STAT_URL class WriteConfigFiles(Config): def __init__(self): @@ -459,8 +496,8 @@ class WriteConfigFiles(Config): with open(self.DNSMASQ_DATA_FILE, "wt", buffering=self.write_buffer) as file_handler: for fqdn in fqdn_set: file_handler.write( - f"server=/{fqdn}/{self.ALT_DNS_ADDR}\nipset=/{fqdn}/{self.IPSET_DNSMASQ}\n" - if self.ALT_NSLOOKUP else + f"server=/{fqdn}/{self.BLLIST_ALT_DNS_ADDR}\nipset=/{fqdn}/{self.IPSET_DNSMASQ}\n" + if self.BLLIST_ALT_NSLOOKUP else f"ipset=/{fqdn}/{self.IPSET_DNSMASQ}\n") def write_update_status_file(self, ip_count, cidr_count, output_fqdn_count): @@ -474,8 +511,8 @@ if __name__ == "__main__": Config.load_fqdn_filter() Config.load_ip_filter() ctx_dict = { - "ip": {"rublacklist": RblIp, "zapret-info": ZiIp, "antifilter": AfIp}, - "fqdn": {"rublacklist": RblFQDN, "zapret-info": ZiFQDN, "antifilter": AfFQDN}, + "ip": {"rublacklist": RblIp, "zapret-info": ZiIp, "antifilter": AfIp, "ruantiblock": RaIp}, + "fqdn": {"rublacklist": RblFQDN, "zapret-info": ZiFQDN, "antifilter": AfFQDN, "ruantiblock": RaFQDN}, } write_cfg_obj = WriteConfigFiles() try: @@ -485,7 +522,7 @@ if __name__ == "__main__": file=sys.stderr) sys.exit(1) ret_code = ctx.run() - if ret_code == 0: + if ret_code == 0 and Config.BLLIST_SOURCE != "ruantiblock": write_cfg_obj.write_dnsmasq_config(ctx.fqdn_set) write_cfg_obj.write_ipset_config(ctx.ip_set, ctx.cidr_set) write_cfg_obj.write_update_status_file(ctx.ip_count, ctx.cidr_count, ctx.output_fqdn_count) diff --git a/ruantiblock/Makefile b/ruantiblock/Makefile index 92d869a..5e71e6b 100644 --- a/ruantiblock/Makefile +++ b/ruantiblock/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ruantiblock -PKG_VERSION:=0.9.1 -PKG_RELEASE:=3 +PKG_VERSION:=0.9.2 +PKG_RELEASE:=0 PKG_MAINTAINER:=gSpot include $(INCLUDE_DIR)/package.mk diff --git a/ruantiblock/files/etc/config/ruantiblock b/ruantiblock/files/etc/config/ruantiblock index 5912eec..24786b3 100644 --- a/ruantiblock/files/etc/config/ruantiblock +++ b/ruantiblock/files/etc/config/ruantiblock @@ -3,32 +3,32 @@ config main 'config' option proxy_mode '1' option proxy_local_clients '1' option ipset_clear_sets '1' + option alowed_hosts_mode '0' option if_vpn 'tun0' option tor_trans_port '9040' + option tor_allow_udp '1' option onion_dns_addr '127.0.0.1#9053' option add_user_entries '0' - option use_logger '1' - option def_total_proxy '0' - option bllist_source 'zapret-info' - option bllist_mode 'fqdn' - option ip_limit '0' - option summarize_ip '1' - option summarize_cidr '1' - option ip_filter '0' - option sd_limit '16' - list opt_exclude_sld 'livejournal.com' - list opt_exclude_sld 'facebook.com' - list opt_exclude_sld 'vk.com' - list opt_exclude_sld 'blog.jp' - list opt_exclude_sld 'msk.ru' - list opt_exclude_sld 'net.ru' - list opt_exclude_sld 'org.ru' - list opt_exclude_sld 'net.ua' - list opt_exclude_sld 'com.ua' - list opt_exclude_sld 'org.ua' - list opt_exclude_sld 'co.uk' - list opt_exclude_sld 'amazonaws.com' - option fqdn_filter '1' - option use_idn '0' - option alt_nslookup '0' - option alt_dns_addr '8.8.8.8' + option enable_logging '1' + option bllist_preset 'ruantiblock-fqdn' + option bllist_ip_limit '0' + option bllist_summarize_ip '1' + option bllist_summarize_cidr '1' + option bllist_ip_filter '0' + option bllist_sd_limit '16' + list bllist_gr_excluded_sld 'livejournal.com' + list bllist_gr_excluded_sld 'facebook.com' + list bllist_gr_excluded_sld 'vk.com' + list bllist_gr_excluded_sld 'blog.jp' + list bllist_gr_excluded_sld 'msk.ru' + list bllist_gr_excluded_sld 'net.ru' + list bllist_gr_excluded_sld 'org.ru' + list bllist_gr_excluded_sld 'net.ua' + list bllist_gr_excluded_sld 'com.ua' + list bllist_gr_excluded_sld 'org.ua' + list bllist_gr_excluded_sld 'co.uk' + list bllist_gr_excluded_sld 'amazonaws.com' + option bllist_fqdn_filter '1' + option bllist_enable_idn '0' + option bllist_alt_nslookup '0' + option bllist_alt_dns_addr '8.8.8.8' diff --git a/ruantiblock/files/etc/ruantiblock/ruantiblock.conf b/ruantiblock/files/etc/ruantiblock/ruantiblock.conf index e3b0ff6..14b353b 100644 --- a/ruantiblock/files/etc/ruantiblock/ruantiblock.conf +++ b/ruantiblock/files/etc/ruantiblock/ruantiblock.conf @@ -3,7 +3,7 @@ ### Директория данных (генерируемые конфиги dnsmasq, ipset и пр.) DATA_DIR="/etc/ruantiblock/var" -### Директория исполняемых скриптов +### Директория модулей MODULES_DIR="/usr/libexec/ruantiblock" ### Команда для перезапуска dnsmasq DNSMASQ_RESTART_CMD="/etc/init.d/dnsmasq restart" @@ -16,12 +16,16 @@ PROXY_MODE=1 PROXY_LOCAL_CLIENTS=1 ### Удаление записей из основных сетов перед началом заполнения временных сетов при обновлении (для освобождения оперативной памяти перед заполнением сетов) (0 - off, 1 - on) IPSET_CLEAR_SETS=0 -### Входящий сетевой интерфейс для правил iptables -IF_LAN="" +### Режим фильтра хостов которым разрешено обходить блокировки (0 - выкл., 1 - только адреса из списка, 2 - любые адреса кроме присутствующих в списке) +export ALOWED_HOSTS_MODE=0 +### Список IP адресов хостов для фильтра, через пробел (прим.: 192.168.0.10 192.168.0.15) +export ALOWED_HOSTS_LIST="" ### VPN интерфейс для правил маршрутизации IF_VPN="tun0" ### Порт транспарентного proxy Tor (параметр TransPort в torrc) TOR_TRANS_PORT=9040 +### Отправлять в Tor UDP-трафик +TOR_ALLOW_UDP=1 ### DNS-сервер для резолвинга в домене .onion (Tor) ONION_DNS_ADDR="127.0.0.1#9053" ### Добавление в список блокировок пользовательских записей из файла $USER_ENTRIES_FILE (0 - off, 1 - on) @@ -34,11 +38,9 @@ USER_ENTRIES_DNS="" ### Файл пользовательских записей USER_ENTRIES_FILE="/etc/ruantiblock/user_entries" ### Запись событий в syslog (0 - off, 1 - on) -USE_LOGGER=1 -### Режим полного прокси при старте скрипта (0 - off, 1 - on). Если 1, то весь трафик всегда идёт через прокси. Все пакеты попадающие в цепочку $IPT_CHAIN попадают в tor или VPN, за исключением сетей из $TOTAL_PROXY_EXCLUDE_NETS. Списки блокировок не используются для фильтрации. Работает только при PROXY_LOCAL_CLIENTS=0 -DEF_TOTAL_PROXY=0 +ENABLE_LOGGING=1 ### Html-страница с инфо о текущем статусе (0 - off, 1 - on) (не используется в OpenWrt) -HTML_INFO=0 +ENABLE_HTML_INFO=0 ### --set-mark для отбора пакетов в VPN туннель VPN_PKTS_MARK=8 ### Максимальное кол-во элементов списка ipset @@ -56,54 +58,55 @@ BLLIST_MODULE="" ### Настройки модулей-парсеров ### -### Источник для обновления списка блокировок (rublacklist, zapret-info, antifilter) -BLLIST_SOURCE="zapret-info" -### Режим обхода блокировок: ip, fqdn -BLLIST_MODE="ip" +### Режим обхода блокировок: zapret-info-ip, zapret-info-fqdn, rublacklist-ip, rublacklist-fqdn, antifilter-ip, ruantiblock-ip, ruantiblock-fqdn +BLLIST_PRESET="zapret-info-fqdn" ### В случае если из источника получено менее указанного кол-ва записей, то обновления списков не происходит -BLLIST_MIN_ENTRS=30000 - +BLLIST_MIN_ENTRIES=30000 ### Лимит ip адресов. При достижении, в конфиг ipset будет добавлена вся подсеть /24 вместо множества ip-адресов пренадлежащих этой сети (0 - off) -IP_LIMIT=0 -### Подсети класса C (/24). IP адреса из этих подсетей не группируются при оптимизации (записи д.б. в виде: 68.183.221. 149.154.162. и пр.). Прим.: OPT_EXCLUDE_NETS="68.183.221. 149.154.162." -OPT_EXCLUDE_NETS="" +BLLIST_IP_LIMIT=0 +### Подсети класса C (/24). IP адреса из этих подсетей не группируются при оптимизации (записи д.б. в виде: 68.183.221. 149.154.162. и пр.). Прим.: "68.183.221. 149.154.162." +BLLIST_GR_EXCLUDED_NETS="" ### Группировать идущие подряд IP адреса в подсетях /24 в диапазоны CIDR -SUMMARIZE_IP=0 +BLLIST_SUMMARIZE_IP=0 ### Группировать идущие подряд подсети /24 в диапазоны CIDR -SUMMARIZE_CIDR=0 -### Фильтрация записей блэклиста по шаблонам из файла IP_FILTER_FILE. Записи (IP, CIDR) попадающие под шаблоны исключаются из кофига ipset (0 - off, 1 - on) -IP_FILTER=0 -### Файл с шаблонами ip для опции FQDN_FILTER (каждый шаблон в отдельной строке. # в первом символе строки - комментирует строку) -IP_FILTER_FILE="/etc/ruantiblock/ip_filter" - -### Лимит для субдоменов. При достижении, в конфиг dnsmasq будет добавлен весь домен 2-го ур-ня вместо множества субдоменов (0 - off) -SD_LIMIT=16 -### SLD не подлежащие оптимизации (через пробел) -OPT_EXCLUDE_SLD="livejournal.com facebook.com vk.com blog.jp msk.ru net.ru org.ru net.ua com.ua org.ua co.uk amazonaws.com" -### Не оптимизировать SLD попадающие под выражения (через пробел) ("[.][a-z]{2,3}[.][a-z]{2}$") -OPT_EXCLUDE_MASKS="" -### Фильтрация записей блэклиста по шаблонам из файла FQDN_FILTER_FILE. Записи (FQDN) попадающие под шаблоны исключаются из кофига dnsmasq (0 - off, 1 - on) -FQDN_FILTER=0 -### Файл с шаблонами FQDN для опции FQDN_FILTER (каждый шаблон в отдельной строке. # в первом символе строки - комментирует строку) -FQDN_FILTER_FILE="/etc/ruantiblock/fqdn_filter" +BLLIST_SUMMARIZE_CIDR=0 +### Фильтрация записей блэклиста по шаблонам из файла BLLIST_IP_FILTER_FILE. Записи (IP, CIDR) попадающие под шаблоны исключаются из кофига ipset (0 - off, 1 - on) +BLLIST_IP_FILTER=0 +### Файл с шаблонами ip для опции BLLIST_IP_FILTER (каждый шаблон в отдельной строке. # в первом символе строки - комментирует строку) +BLLIST_IP_FILTER_FILE="/etc/ruantiblock/ip_filter" +### Лимит субдоменов для группировки. При достижении, в конфиг dnsmasq будет добавлен весь домен 2-го ур-ня вместо множества субдоменов (0 - off) +BLLIST_SD_LIMIT=16 +### SLD не подлежащие группировке при оптимизации (через пробел) +BLLIST_GR_EXCLUDED_SLD="livejournal.com facebook.com vk.com blog.jp msk.ru net.ru org.ru net.ua com.ua org.ua co.uk amazonaws.com" +### Не группировать SLD попадающие под выражения (через пробел) ("[.][a-z]{2,3}[.][a-z]{2}$") +BLLIST_GR_EXCLUDED_MASKS="" +### Фильтрация записей блэклиста по шаблонам из файла ENTRIES_FILTER_FILE. Записи (FQDN) попадающие под шаблоны исключаются из кофига dnsmasq (0 - off, 1 - on) +export BLLIST_FQDN_FILTER=0 +### Файл с шаблонами FQDN для опции BLLIST_FQDN_FILTER (каждый шаблон в отдельной строке. # в первом символе строки - комментирует строку) +export BLLIST_FQDN_FILTER_FILE="/etc/ruantiblock/fqdn_filter" ### Обрезка www[0-9]. в FQDN (0 - off, 1 - on) -STRIP_WWW=1 +BLLIST_STRIP_WWW=1 ### Преобразование кириллических доменов в punycode (0 - off, 1 - on) -USE_IDN=0 +BLLIST_ENABLE_IDN=0 ### Перенаправлять DNS-запросы на альтернативный DNS-сервер для заблокированных FQDN (0 - off, 1 - on) -ALT_NSLOOKUP=0 +BLLIST_ALT_NSLOOKUP=0 ### Альтернативный DNS-сервер -ALT_DNS_ADDR="8.8.8.8" +BLLIST_ALT_DNS_ADDR="8.8.8.8" ### Источники блэклиста RBL_ALL_URL="https://reestr.rublacklist.net/api/v2/current/csv/" -#RBL_ALL_URL="https://api.reserve-rbl.ru/api/v2/current/csv/" RBL_IP_URL="https://reestr.rublacklist.net/api/v2/ips/csv/" -#RBL_IP_URL="https://api.reserve-rbl.ru/api/v2/ips/csv/" ZI_ALL_URL="https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv" #ZI_ALL_URL="https://app.assembla.com/spaces/z-i/git/source/master/dump.csv?_format=raw" AF_IP_URL="https://antifilter.download/list/allyouneed.lst" AF_FQDN_URL="https://antifilter.download/list/domains.lst" +RA_IP_IPSET_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/ip/ruantiblock.ip" +RA_IP_DMASK_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/ip/ruantiblock.dnsmasq" +RA_IP_STAT_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/ip/update_status" +RA_FQDN_IPSET_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/fqdn/ruantiblock.ip" +RA_FQDN_DMASK_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/fqdn/ruantiblock.dnsmasq" +RA_FQDN_STAT_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/fqdn/update_status" RBL_ENCODING="" ZI_ENCODING="CP1251" AF_ENCODING="" +RA_ENCODING="" diff --git a/ruantiblock/files/etc/ruantiblock/scripts/config_script b/ruantiblock/files/etc/ruantiblock/scripts/config_script index 4282422..8ea8bff 100644 --- a/ruantiblock/files/etc/ruantiblock/scripts/config_script +++ b/ruantiblock/files/etc/ruantiblock/scripts/config_script @@ -1,7 +1,6 @@ - AWK_CMD="awk" UCI_SECTION="ruantiblock.config" -UCI_VARS="proxy_mode proxy_local_clients ipset_clear_sets if_lan if_vpn tor_trans_port onion_dns_addr add_user_entries user_entries_dns use_logger def_total_proxy bllist_module bllist_source bllist_mode ip_limit opt_exclude_nets summarize_ip summarize_cidr ip_filter sd_limit opt_exclude_sld fqdn_filter use_idn alt_nslookup alt_dns_addr" +UCI_VARS="proxy_mode proxy_local_clients ipset_clear_sets alowed_hosts_mode alowed_hosts_list if_vpn tor_trans_port tor_allow_udp onion_dns_addr add_user_entries user_entries_dns enable_logging bllist_module bllist_preset bllist_ip_limit bllist_gr_excluded_nets bllist_summarize_ip bllist_summarize_cidr bllist_ip_filter bllist_sd_limit bllist_gr_excluded_sld bllist_fqdn_filter bllist_enable_idn bllist_alt_nslookup bllist_alt_dns_addr" eval `uci show "$UCI_SECTION" | $AWK_CMD -F "=" -v UCI_VARS="$UCI_VARS" ' BEGIN { diff --git a/ruantiblock/files/etc/ruantiblock/scripts/info_output b/ruantiblock/files/etc/ruantiblock/scripts/info_output index 0348882..d72e6f7 100644 --- a/ruantiblock/files/etc/ruantiblock/scripts/info_output +++ b/ruantiblock/files/etc/ruantiblock/scripts/info_output @@ -13,7 +13,7 @@ Info() { printf "\"status\":false" fi printf "}," - IptListChain | $AWK_CMD ' + IptListBllistChain | $AWK_CMD ' BEGIN { printf "\"iptables\":{" } @@ -25,7 +25,7 @@ Info() { printf "\"_dummy\":false},"; }' printf "\"ipset\":{"; - for _set in "$IPSET_TOTAL_PROXY" "$IPSET_CIDR_TMP" "$IPSET_CIDR" "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_DNSMASQ" "$IPSET_ONION" + for _set in "$IPSET_ALOWED_HOSTS" "$IPSET_CIDR_TMP" "$IPSET_CIDR" "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_DNSMASQ" "$IPSET_ONION" do $IPSET_CMD list "$_set" -terse | $AWK_CMD -F ": " ' { diff --git a/ruantiblock/files/etc/ruantiblock/scripts/ipt_functions b/ruantiblock/files/etc/ruantiblock/scripts/ipt_functions index aa3d0ab..cf5a495 100644 --- a/ruantiblock/files/etc/ruantiblock/scripts/ipt_functions +++ b/ruantiblock/files/etc/ruantiblock/scripts/ipt_functions @@ -1,26 +1,28 @@ IP_CMD="ip" IPT_CMD="iptables" -IPT_CHAIN="$NAME" +IPT_ALLOWED_HOSTS_CHAIN="${NAME}_allowed_hosts" +IPT_BLLIST_CHAIN="${NAME}_blacklist" +IPT_ACTION_CHAIN="${NAME}_action" IPT_FIRST_CHAIN="PREROUTING" -VPN_ROUTE_TABLE=99 +VPN_ROUTE_TABLE_ID=99 -### Tor -IPT_TABLE="nat" -if [ -n "$IF_LAN" ]; then - IPT_FIRST_CHAIN_RULE="-i ${IF_LAN} -j ${IPT_CHAIN}" -else - IPT_FIRST_CHAIN_RULE="-j ${IPT_CHAIN}" -fi -IPT_IPSET_TARGET="dst -p tcp -j REDIRECT --to-ports ${TOR_TRANS_PORT}" -IPT_IPSETS="${IPSET_ONION} ${IPSET_CIDR} ${IPSET_IP} ${IPSET_DNSMASQ}" +case "$ALOWED_HOSTS_MODE" in + "1") + IPT_ALLOWED_HOSTS_RULE="-m set --match-set ${IPSET_ALOWED_HOSTS} src -j ${IPT_BLLIST_CHAIN}" + ;; + "2") + IPT_ALLOWED_HOSTS_RULE="-m set ! --match-set ${IPSET_ALOWED_HOSTS} src -j ${IPT_BLLIST_CHAIN}" + ;; + *) + IPT_ALLOWED_HOSTS_RULE="-j ${IPT_BLLIST_CHAIN}" + ;; +esac if [ "$PROXY_MODE" = "2" ]; then - ### VPN IPT_TABLE="mangle" - IPT_FIRST_CHAIN_RULE="-j ${IPT_CHAIN}" - IPT_IPSET_TARGET="dst,src -j MARK --set-mark ${VPN_PKTS_MARK}" - IPT_IPSETS="${IPSET_CIDR} ${IPSET_IP} ${IPSET_DNSMASQ}" +else + IPT_TABLE="nat" fi IptCmdWrapper() { @@ -41,28 +43,43 @@ IptVpnRouteAdd() { if [ -n "$VPN_IP" ]; then echo 0 > /proc/sys/net/ipv4/conf/$IF_VPN/rp_filter IptVpnRouteDel 2> /dev/null - $IP_CMD rule add fwmark $VPN_PKTS_MARK table $VPN_ROUTE_TABLE priority 1000 - $IP_CMD route add default via $VPN_IP table $VPN_ROUTE_TABLE + $IP_CMD rule add fwmark $VPN_PKTS_MARK table $VPN_ROUTE_TABLE_ID priority 1000 + $IP_CMD route add default via $VPN_IP table $VPN_ROUTE_TABLE_ID fi } IptVpnRouteDel() { - $IP_CMD route flush table $VPN_ROUTE_TABLE - $IP_CMD rule del table $VPN_ROUTE_TABLE + $IP_CMD route flush table $VPN_ROUTE_TABLE_ID + $IP_CMD rule del table $VPN_ROUTE_TABLE_ID } IptVpnRouteStatus() { - [ -n "`$IP_CMD route show table $VPN_ROUTE_TABLE 2> /dev/null`" ] && return 0 + [ -n "`$IP_CMD route show table $VPN_ROUTE_TABLE_ID 2> /dev/null`" ] && return 0 return 1 } IptMainAdd() { local _set - $IPT_CMD -t "$IPT_TABLE" -N "$IPT_CHAIN" - $IPT_CMD -t "$IPT_TABLE" -I "$IPT_FIRST_CHAIN" 1 $IPT_FIRST_CHAIN_RULE + $IPT_CMD -t "$IPT_TABLE" -N "$IPT_ACTION_CHAIN" + $IPT_CMD -t "$IPT_TABLE" -N "$IPT_BLLIST_CHAIN" + $IPT_CMD -t "$IPT_TABLE" -N "$IPT_ALLOWED_HOSTS_CHAIN" + IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -A "$IPT_ALLOWED_HOSTS_CHAIN" $IPT_ALLOWED_HOSTS_RULE + IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -I "$IPT_FIRST_CHAIN" 1 -j "$IPT_ALLOWED_HOSTS_CHAIN" + + if [ "$PROXY_MODE" = "2" ]; then + IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -A "$IPT_ACTION_CHAIN" -j MARK --set-mark $VPN_PKTS_MARK + IPT_IPSETS="${IPSET_CIDR} ${IPSET_IP} ${IPSET_DNSMASQ}" + else + IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -A "$IPT_ACTION_CHAIN" -p tcp -j REDIRECT --to-ports ${TOR_TRANS_PORT} + if [ "$TOR_ALLOW_UDP" = "1" ]; then + IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -A "$IPT_ACTION_CHAIN" -p udp -j REDIRECT --to-ports ${TOR_TRANS_PORT} + fi + IPT_IPSETS="${IPSET_ONION} ${IPSET_CIDR} ${IPSET_IP} ${IPSET_DNSMASQ}" + fi + for _set in $IPT_IPSETS do - IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -A "$IPT_CHAIN" -m set --match-set "$_set" $IPT_IPSET_TARGET + IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -A "$IPT_BLLIST_CHAIN" -m set --match-set "$_set" dst -j "$IPT_ACTION_CHAIN" done if [ "$PROXY_MODE" = "2" ]; then IptVpnRouteAdd @@ -70,39 +87,30 @@ IptMainAdd() { } IptMainDel() { - IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -D "$IPT_FIRST_CHAIN" $IPT_FIRST_CHAIN_RULE - $IPT_CMD -t "$IPT_TABLE" -F "$IPT_CHAIN" - $IPT_CMD -t "$IPT_TABLE" -X "$IPT_CHAIN" + IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -D "$IPT_FIRST_CHAIN" -j "$IPT_ALLOWED_HOSTS_CHAIN" + $IPT_CMD -t "$IPT_TABLE" -F "$IPT_ALLOWED_HOSTS_CHAIN" + $IPT_CMD -t "$IPT_TABLE" -X "$IPT_ALLOWED_HOSTS_CHAIN" + $IPT_CMD -t "$IPT_TABLE" -F "$IPT_BLLIST_CHAIN" + $IPT_CMD -t "$IPT_TABLE" -X "$IPT_BLLIST_CHAIN" + $IPT_CMD -t "$IPT_TABLE" -F "$IPT_ACTION_CHAIN" + $IPT_CMD -t "$IPT_TABLE" -X "$IPT_ACTION_CHAIN" if [ "$PROXY_MODE" = "2" ]; then IptVpnRouteDel 2> /dev/null fi } -IPT_TP_RULE="-m set ! --match-set ${IPSET_TOTAL_PROXY} ${IPT_IPSET_TARGET}" +### Local clients -IptTotalProxyDel() { - IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -D "$IPT_CHAIN" $IPT_TP_RULE -} - -IptTotalProxyAdd() { - $IPT_CMD -t "$IPT_TABLE" -I "$IPT_CHAIN" 1 $IPT_TP_RULE -} - -IptTotalProxyStatus() { - $IPT_CMD -t "$IPT_TABLE" -L "$IPT_CHAIN" 2> /dev/null | $AWK_CMD -v IPSET_TOTAL_PROXY="$IPSET_TOTAL_PROXY" -v RET_CODE=1 '$0 ~ IPSET_TOTAL_PROXY {RET_CODE=0} END {exit RET_CODE}' - return $? -} - -IPT_OUTPUT_FIRST_RULE="-j ${IPT_CHAIN}" +IPT_OUTPUT_FIRST_RULE="-j ${IPT_BLLIST_CHAIN}" IptLocalClientsAdd() { - $IPT_CMD -t "$IPT_TABLE" -I OUTPUT 1 $IPT_OUTPUT_FIRST_RULE + IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -I OUTPUT 1 $IPT_OUTPUT_FIRST_RULE } IptLocalClientsDel() { IptCmdWrapper $IPT_CMD -t "$IPT_TABLE" -D OUTPUT $IPT_OUTPUT_FIRST_RULE } -IptListChain() { - $IPT_CMD -t "$IPT_TABLE" -v -L "$IPT_CHAIN" +IptListBllistChain() { + $IPT_CMD -t "$IPT_TABLE" -v -L "$IPT_BLLIST_CHAIN" } diff --git a/ruantiblock/files/usr/bin/ruantiblock b/ruantiblock/files/usr/bin/ruantiblock index ec2069b..62b177b 100755 --- a/ruantiblock/files/usr/bin/ruantiblock +++ b/ruantiblock/files/usr/bin/ruantiblock @@ -16,7 +16,7 @@ export LANGUAGE="en" CONFIG_DIR="/etc/${NAME}" CONFIG_FILE="${CONFIG_DIR}/${NAME}.conf" export DATA_DIR="${CONFIG_DIR}/var" -export MODULES_DIR="/usr/bin" +export MODULES_DIR="/usr/libexec/${NAME}" ### Команда для перезапуска dnsmasq export DNSMASQ_RESTART_CMD="/etc/init.d/dnsmasq restart" @@ -31,12 +31,16 @@ export PROXY_MODE=1 export PROXY_LOCAL_CLIENTS=1 ### Удаление записей из основных сетов перед началом заполнения временных сетов при обновлении (для освобождения оперативной памяти перед заполнением сетов) (0 - off, 1 - on) export IPSET_CLEAR_SETS=0 -### Входящий сетевой интерфейс для правил iptables -export IF_LAN="" +### Режим фильтра хостов которым разрешено обходить блокировки (0 - выкл., 1 - только адреса из списка, 2 - любые адреса кроме присутствующих в списке) +export ALOWED_HOSTS_MODE=0 +### Список IP адресов хостов для фильтра, через пробел (прим.: 192.168.0.10 192.168.0.15) +export ALOWED_HOSTS_LIST="" ### VPN интерфейс для правил iptables export IF_VPN="tun0" ### Порт транспарентного proxy Tor (параметр TransPort в torrc) export TOR_TRANS_PORT=9040 +### Отправлять в Tor UDP-трафик +export TOR_ALLOW_UDP=1 ### DNS-сервер для резолвинга в домене .onion (Tor) export ONION_DNS_ADDR="127.0.0.1#9053" ### Добавление в список блокировок пользовательских записей из файла $USER_ENTRIES_FILE (0 - off, 1 - on) @@ -49,13 +53,9 @@ export USER_ENTRIES_DNS="" ### Файл пользовательских записей export USER_ENTRIES_FILE="${CONFIG_DIR}/user_entries" ### Запись событий в syslog (0 - off, 1 - on) -export USE_LOGGER=1 -### Режим полного прокси при старте скрипта (0 - off, 1 - on). Если 1, то весь трафик всегда идёт через прокси. Все пакеты попадающие в цепочку $IPT_CHAIN попадают в tor или VPN, за исключением сетей из $TOTAL_PROXY_EXCLUDE_NETS. Списки блокировок не используются для фильтрации. Работает только при PROXY_LOCAL_CLIENTS=0 -export DEF_TOTAL_PROXY=0 -### Трафик в заданные сети идет напрямую, не попадая в Tor или VPN, в режиме total-proxy -export TOTAL_PROXY_EXCLUDE_NETS="10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 100.64.0.0/10" +export ENABLE_LOGGING=1 ### Html-страница с инфо о текущем статусе (0 - off, 1 - on) (не используется в OpenWrt) -export HTML_INFO=0 +export ENABLE_HTML_INFO=0 ### --set-mark для отбора пакетов в VPN туннель export VPN_PKTS_MARK=8 ### Максимальное кол-во элементов списка ipset @@ -73,44 +73,40 @@ export BLLIST_MODULE="" ############################## -### Источник для обновления списка блокировок (rublacklist, zapret-info, antifilter) -export BLLIST_SOURCE="rublacklist" -### Режим обхода блокировок: ip, fqdn -export BLLIST_MODE="ip" +### Режим обхода блокировок: zapret-info-fqdn, zapret-info-ip, rublacklist-fqdn, rublacklist-ip, antifilter-ip, ruantiblock-fqdn, ruantiblock-ip +export BLLIST_PRESET="zapret-info-fqdn" ### В случае если из источника получено менее указанного кол-ва записей, то обновления списков не происходит -export BLLIST_MIN_ENTRS=30000 - +export BLLIST_MIN_ENTRIES=30000 ### Лимит IP адресов. При достижении, в конфиг ipset будет добавлена вся подсеть /24 вместо множества IP адресов пренадлежащих этой сети (0 - off) -export IP_LIMIT=0 -### Подсети класса C (/24). IP адреса из этих подсетей не группируются при оптимизации (записи д.б. в виде: 68.183.221. 149.154.162. и пр.). Прим.: OPT_EXCLUDE_NETS="68.183.221. 149.154.162." -export OPT_EXCLUDE_NETS="" +export BLLIST_IP_LIMIT=0 +### Подсети класса C (/24). IP адреса из этих подсетей не группируются при оптимизации (записи д.б. в виде: 68.183.221. 149.154.162. и пр.). Прим.: "68.183.221. 149.154.162." +export BLLIST_GR_EXCLUDED_NETS="" ### Группировать идущие подряд IP адреса в подсетях /24 в диапазоны CIDR -export SUMMARIZE_IP=0 +export BLLIST_SUMMARIZE_IP=0 ### Группировать идущие подряд подсети /24 в диапазоны CIDR -export SUMMARIZE_CIDR=0 -### Фильтрация записей блэклиста по шаблонам из файла IP_FILTER_FILE. Записи (IP, CIDR) попадающие под шаблоны исключаются из кофига ipset (0 - off, 1 - on) -export IP_FILTER=0 -### Файл с шаблонами IP для опции FQDN_FILTER (каждый шаблон в отдельной строке. # в первом символе строки - комментирует строку) -export IP_FILTER_FILE="${CONFIG_DIR}/ip_filter" - -### Лимит для субдоменов. При достижении, в конфиг dnsmasq будет добавлен весь домен 2-го ур-ня вместо множества субдоменов (0 - off) -export SD_LIMIT=16 -### SLD не подлежащие оптимизации (через пробел) -export OPT_EXCLUDE_SLD="livejournal.com facebook.com vk.com blog.jp msk.ru net.ru org.ru net.ua com.ua org.ua co.uk amazonaws.com" -### Не оптимизировать SLD попадающие под выражения (через пробел) ("[.][a-z]{2,3}[.][a-z]{2}$") -export OPT_EXCLUDE_MASKS="" +export BLLIST_SUMMARIZE_CIDR=0 +### Фильтрация записей блэклиста по шаблонам из файла BLLIST_IP_FILTER_FILE. Записи (IP, CIDR) попадающие под шаблоны исключаются из кофига ipset (0 - off, 1 - on) +export BLLIST_IP_FILTER=0 +### Файл с шаблонами IP для опции BLLIST_IP_FILTER (каждый шаблон в отдельной строке. # в первом символе строки - комментирует строку) +export BLLIST_IP_FILTER_FILE="${CONFIG_DIR}/ip_filter" +### Лимит субдоменов для группировки. При достижении, в конфиг dnsmasq будет добавлен весь домен 2-го ур-ня вместо множества субдоменов (0 - off) +export BLLIST_SD_LIMIT=16 +### SLD не подлежащие группировке при оптимизации (через пробел) +export BLLIST_GR_EXCLUDED_SLD="livejournal.com facebook.com vk.com blog.jp msk.ru net.ru org.ru net.ua com.ua org.ua co.uk amazonaws.com" +### Не группировать SLD попадающие под выражения (через пробел) ("[.][a-z]{2,3}[.][a-z]{2}$") +export BLLIST_GR_EXCLUDED_MASKS="" ### Фильтрация записей блэклиста по шаблонам из файла ENTRIES_FILTER_FILE. Записи (FQDN) попадающие под шаблоны исключаются из кофига dnsmasq (0 - off, 1 - on) -export FQDN_FILTER=0 -### Файл с шаблонами FQDN для опции FQDN_FILTER (каждый шаблон в отдельной строке. # в первом символе строки - комментирует строку) -export FQDN_FILTER_FILE="${CONFIG_DIR}/fqdn_filter" +export BLLIST_FQDN_FILTER=0 +### Файл с шаблонами FQDN для опции BLLIST_FQDN_FILTER (каждый шаблон в отдельной строке. # в первом символе строки - комментирует строку) +export BLLIST_FQDN_FILTER_FILE="${CONFIG_DIR}/fqdn_filter" ### Обрезка www[0-9]. в FQDN (0 - off, 1 - on) -export STRIP_WWW=1 +export BLLIST_STRIP_WWW=1 ### Преобразование кириллических доменов в punycode (0 - off, 1 - on) -export USE_IDN=0 +export BLLIST_ENABLE_IDN=0 ### Перенаправлять DNS-запросы на альтернативный DNS-сервер для заблокированных FQDN (0 - off, 1 - on) -export ALT_NSLOOKUP=0 +export BLLIST_ALT_NSLOOKUP=0 ### Альтернативный DNS-сервер -export ALT_DNS_ADDR="8.8.8.8" +export BLLIST_ALT_DNS_ADDR="8.8.8.8" ### Источники блэклиста export RBL_ALL_URL="https://reestr.rublacklist.net/api/v2/current/csv/" @@ -118,9 +114,16 @@ export RBL_IP_URL="https://reestr.rublacklist.net/api/v2/ips/csv/" export ZI_ALL_URL="https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv" export AF_IP_URL="https://antifilter.download/list/allyouneed.lst" export AF_FQDN_URL="https://antifilter.download/list/domains.lst" +export RA_IP_IPSET_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/ip/ruantiblock.ip" +export RA_IP_DMASK_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/ip/ruantiblock.dnsmasq" +export RA_IP_STAT_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/ip/update_status" +export RA_FQDN_IPSET_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/fqdn/ruantiblock.ip" +export RA_FQDN_DMASK_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/fqdn/ruantiblock.dnsmasq" +export RA_FQDN_STAT_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_blacklist/master/blacklist/fqdn/update_status" export RBL_ENCODING="" export ZI_ENCODING="CP1251" export AF_ENCODING="" +export RA_ENCODING="" ############################ Configuration ############################# @@ -134,6 +137,40 @@ STOP_SCRIPT="${CONFIG_DIR}/scripts/stop_script" ### Config script [ -f "$CONFIG_SCRIPT" ] && . "$CONFIG_SCRIPT" +### Blacklist source and mode +case "$BLLIST_PRESET" in + zapret-info-ip) + ### Источник для обновления списка блокировок (zapret-info, rublacklist, antifilter, ruantiblock) + export BLLIST_SOURCE="zapret-info" + ### Режим обхода блокировок: ip, fqdn + export BLLIST_MODE="ip" + ;; + rublacklist-ip) + export BLLIST_SOURCE="rublacklist" + export BLLIST_MODE="ip" + ;; + rublacklist-fqdn) + export BLLIST_SOURCE="rublacklist" + export BLLIST_MODE="fqdn" + ;; + antifilter-ip) + export BLLIST_SOURCE="antifilter" + export BLLIST_MODE="ip" + ;; + ruantiblock-ip) + export BLLIST_SOURCE="ruantiblock" + export BLLIST_MODE="ip" + ;; + ruantiblock-fqdn) + export BLLIST_SOURCE="ruantiblock" + export BLLIST_MODE="fqdn" + ;; + *) + export BLLIST_SOURCE="zapret-info" + export BLLIST_MODE="fqdn" + ;; +esac + AWK_CMD="awk" IPSET_CMD=`which ipset` if [ $? -ne 0 ]; then @@ -141,20 +178,20 @@ if [ $? -ne 0 ]; then exit 1 fi LOGGER_CMD=`which logger` -if [ $USE_LOGGER = "1" -a $? -ne 0 ]; then +if [ $ENABLE_LOGGING = "1" -a $? -ne 0 ]; then echo " Logger doesn't exists" >&2 - USE_LOGGER=0 + ENABLE_LOGGING=0 fi LOGGER_PARAMS="-t `basename $0` -p user.notice" export DNSMASQ_DATA_FILE="${DATA_DIR}/${NAME}.dnsmasq" export IP_DATA_FILE="${DATA_DIR}/${NAME}.ip" -export IPSET_IP="${NAME}-ip" -export IPSET_IP_TMP="${IPSET_IP}-tmp" -export IPSET_CIDR="${NAME}-cidr" -export IPSET_CIDR_TMP="${IPSET_CIDR}-tmp" -export IPSET_DNSMASQ="${NAME}-dnsmasq" -export IPSET_ONION="onion" -export IPSET_TOTAL_PROXY="total-proxy" +export IPSET_ALOWED_HOSTS="${NAME}_alowed_ip" +export IPSET_IP="${NAME}_ip" +export IPSET_IP_TMP="${IPSET_IP}_tmp" +export IPSET_CIDR="${NAME}_cidr" +export IPSET_CIDR_TMP="${IPSET_CIDR}_tmp" +export IPSET_DNSMASQ="${NAME}_dnsmasq" +export IPSET_ONION="${NAME}_onion" export UPDATE_STATUS_FILE="${DATA_DIR}/update_status" UPDATE_PID_FILE="/var/run/${NAME}_update.pid" START_PID_FILE="/var/run/${NAME}_start.pid" @@ -169,14 +206,14 @@ INFO_OUTPUT_FUNCTION="${CONFIG_DIR}/scripts/info_output" if [ -f "$INFO_OUTPUT_FUNCTION" ]; then . "$INFO_OUTPUT_FUNCTION" else - HTML_INFO=0 + ENABLE_HTML_INFO=0 fi ############################## Functions ############################### Help() { cat << EOF - Usage: `basename $0` start|force-start|stop|destroy|restart|update|force-update|data-files|total-proxy-on|total-proxy-off|renew-ipt|status|status-html|--help + Usage: `basename $0` start|force-start|stop|destroy|restart|update|force-update|data-files|renew-ipt|status|status-html|--help start : Start force-start : stop : Stop @@ -186,9 +223,6 @@ cat << EOF update : Update blacklist force-update : Force update blacklist data-files : Create ${IP_DATA_FILE} & ${DNSMASQ_DATA_FILE} (without network functions) - total-proxy-on : Turn on total-proxy mode - total-proxy-off : Turn off total-proxy mode - total-proxy-status : total-proxy status status : Status & some info raw-status : Return code: 0 - enabled, 1 - error, 2 - disabled, 3 - starting, 4 - updating html-info : Return the html-info output @@ -202,16 +236,13 @@ cat << EOF `basename $0` update `basename $0` force-update `basename $0` data-files - `basename $0` total-proxy-on - `basename $0` total-proxy-off - `basename $0` total-proxy-status `basename $0` status `basename $0` html-info EOF } MakeLogRecord() { - if [ $USE_LOGGER = "1" ]; then + if [ $ENABLE_LOGGING = "1" ]; then $LOGGER_CMD $LOGGER_PARAMS -p "user.${1}" "$2" fi } @@ -241,52 +272,19 @@ DestroyIpsets() { done } -FillTotalProxySet() { +FillAllowedHostsSet() { local _entry - for _entry in $TOTAL_PROXY_EXCLUDE_NETS + for _entry in $ALOWED_HOSTS_LIST do - $IPSET_CMD add "$IPSET_TOTAL_PROXY" "$_entry" + $IPSET_CMD add "$IPSET_ALOWED_HOSTS" "$_entry" done } -TotalProxyOn() { - if [ "$PROXY_LOCAL_CLIENTS" != "1" ]; then - IptTotalProxyDel &> /dev/null - IptTotalProxyAdd - if [ $? -eq 0 ]; then - echo " ${IPSET_TOTAL_PROXY} enabled" - MakeLogRecord "notice" "${IPSET_TOTAL_PROXY} enabled" - fi - MakeToken - fi -} - -TotalProxyOff() { - if [ "$PROXY_LOCAL_CLIENTS" != "1" ]; then - IptTotalProxyDel &> /dev/null - if [ $? -ne 0 ]; then - echo " ${IPSET_TOTAL_PROXY} is already disabled" >&2 - else - echo " ${IPSET_TOTAL_PROXY} disabled" - MakeLogRecord "notice" "${IPSET_TOTAL_PROXY} disabled" - fi - MakeToken - fi -} - -TotalProxyStatus() { - IptTotalProxyStatus - return $? -} - AddIptRules() { IptMainAdd if [ "$PROXY_LOCAL_CLIENTS" = "1" ]; then IptLocalClientsAdd fi - if [ "$DEF_TOTAL_PROXY" = "1" ]; then - TotalProxyOn - fi } DelIptRules() { @@ -297,22 +295,21 @@ DelIptRules() { SetNetConfig() { local _set ### Создание списков ipset. Проверка на наличие списка с таким же именем, если нет, то создается новый - for _set in "$IPSET_TOTAL_PROXY" "$IPSET_CIDR_TMP" "$IPSET_CIDR" + for _set in "$IPSET_CIDR_TMP" "$IPSET_CIDR" do IsIpsetExists "$_set" || $IPSET_CMD create "$_set" hash:net maxelem $IPSET_MAXELEM done - for _set in "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_ONION" + for _set in "$IPSET_ALOWED_HOSTS" "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_ONION" do IsIpsetExists "$_set" || $IPSET_CMD create "$_set" hash:ip maxelem $IPSET_MAXELEM done IsIpsetExists "$IPSET_DNSMASQ" || $IPSET_CMD create "$IPSET_DNSMASQ" hash:ip maxelem $IPSET_MAXELEM timeout $IPSET_DNSMASQ_TIMEOUT - FillTotalProxySet AddIptRules } DropNetConfig() { DelIptRules - FlushIpSets "$IPSET_CIDR_TMP" "$IPSET_CIDR" "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_DNSMASQ" "$IPSET_ONION" "$IPSET_TOTAL_PROXY" + FlushIpSets "$IPSET_ALOWED_HOSTS" "$IPSET_CIDR_TMP" "$IPSET_CIDR" "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_DNSMASQ" "$IPSET_ONION" } FillIpsets() { @@ -344,14 +341,14 @@ ClearDataFiles() { CheckStatus() { local _set _ipset_return=0 _return_code=1 if [ "$1" = "ipsets" ]; then - for _set in "$IPSET_TOTAL_PROXY" "$IPSET_CIDR_TMP" "$IPSET_CIDR" "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_DNSMASQ" "$IPSET_ONION" + for _set in "$IPSET_ALOWED_HOSTS" "$IPSET_CIDR_TMP" "$IPSET_CIDR" "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_DNSMASQ" "$IPSET_ONION" do IsIpsetExists "$_set" _ipset_return=$? [ $_ipset_return -ne 0 ] && break done fi - if IptListChain &> /dev/null && [ $_ipset_return -eq 0 ]; then + if IptListBllistChain &> /dev/null && [ $_ipset_return -eq 0 ]; then _return_code=0 fi return $_return_code @@ -359,7 +356,7 @@ CheckStatus() { PreStartCheck() { [ -d "$DATA_DIR" ] || mkdir -p "$DATA_DIR" - [ "$HTML_INFO" = "1" -a ! -d "$HTML_DIR" ] && mkdir -p "$HTML_DIR" + [ "$ENABLE_HTML_INFO" = "1" -a ! -d "$HTML_DIR" ] && mkdir -p "$HTML_DIR" ### Костыль для старта dnsmasq [ -e "$DNSMASQ_DATA_FILE" ] || printf "\n" > "$DNSMASQ_DATA_FILE" } @@ -512,6 +509,7 @@ Start() { MakeLogRecord "info" "${1}..." DropNetConfig &> /dev/null SetNetConfig + FillAllowedHostsSet PreStartCheck FillIpsets _return_code=$? @@ -560,7 +558,7 @@ Reload() { Status() { local _set if CheckStatus; then - printf "\n \033[1m${NAME} status\033[m: \033[1;32mEnabled\033[m\n\n PROXY_MODE: ${PROXY_MODE}\n DEF_TOTAL_PROXY: ${DEF_TOTAL_PROXY}\n PROXY_LOCAL_CLIENTS: ${PROXY_LOCAL_CLIENTS}\n BLLIST_MODULE: ${BLLIST_MODULE}\n" + printf "\n \033[1m${NAME} status\033[m: \033[1;32mEnabled\033[m\n\n PROXY_MODE: ${PROXY_MODE}\n PROXY_LOCAL_CLIENTS: ${PROXY_LOCAL_CLIENTS}\n BLLIST_MODULE: ${BLLIST_MODULE}\n" if [ -f "$UPDATE_STATUS_FILE" ]; then $AWK_CMD '{ update_string=(NF < 4) ? "No data" : $4" (IP: "$1" | CIDR: "$2" | FQDN: "$3")"; @@ -573,15 +571,14 @@ Status() { printf "\n \033[1;31mVPN ROUTING ERROR! (NEED THE RESTART)\033[m\n" fi printf "\n \033[4mIptables rules\033[m:\n\n" - IptListChain | $AWK_CMD ' + IptListBllistChain | $AWK_CMD ' { if(NR > 2) { - match_set=(NR == 3 && $0 ~ ENVIRON["IPSET_TOTAL_PROXY"]) ? "\033[1;33m"ENVIRON["IPSET_TOTAL_PROXY"]" (Enabled!)\033[m" : $11; - printf " Match-set: %s\n Bytes: %s\n\n", match_set, $2; + printf " Match-set: %s\n Bytes: %s\n\n", $11, $2; }; }' printf " \033[4mIp sets\033[m:\n\n" - for _set in "$IPSET_TOTAL_PROXY" "$IPSET_CIDR_TMP" "$IPSET_CIDR" "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_DNSMASQ" "$IPSET_ONION" + for _set in "$IPSET_ALOWED_HOSTS" "$IPSET_CIDR_TMP" "$IPSET_CIDR" "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_DNSMASQ" "$IPSET_ONION" do $IPSET_CMD list "$_set" -terse | $AWK_CMD -F ":" ' { @@ -598,7 +595,7 @@ Status() { } StatusOutput() { - if [ "$HTML_INFO" = "1" -a -d "$HTML_DIR" ]; then + if [ "$ENABLE_HTML_INFO" = "1" -a -d "$HTML_DIR" ]; then Info fi } @@ -631,7 +628,7 @@ case "$1" in ;; destroy) Stop "$1" &> /dev/null - DestroyIpsets "$IPSET_TOTAL_PROXY" "$IPSET_CIDR_TMP" "$IPSET_CIDR" "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_DNSMASQ" "$IPSET_ONION" + DestroyIpsets "$IPSET_ALOWED_HOSTS" "$IPSET_CIDR_TMP" "$IPSET_CIDR" "$IPSET_IP_TMP" "$IPSET_IP" "$IPSET_DNSMASQ" "$IPSET_ONION" ClearDataFiles return_code=$? rm -f "$UPDATE_PID_FILE" "$START_PID_FILE" @@ -652,31 +649,6 @@ case "$1" in return_code=$? fi ;; - total-proxy-on) - if ! CheckStatus; then - echo " ${NAME} does not running" >&2 - return_code=1 - else - TotalProxyOn - return_code=$? - fi - StatusOutput - ;; - total-proxy-off) - if ! CheckStatus; then - echo " ${NAME} does not running" >&2 - return_code=1 - else - TotalProxyOff - return_code=$? - fi - StatusOutput - ;; - total-proxy-status) - TotalProxyStatus - return_code=$? - echo $return_code - ;; status) Status return_code=$? diff --git a/screenshots/01.jpg b/screenshots/01.jpg index a7d8554..61aebe2 100644 Binary files a/screenshots/01.jpg and b/screenshots/01.jpg differ diff --git a/screenshots/02.jpg b/screenshots/02.jpg index 3ce1e80..5a956df 100644 Binary files a/screenshots/02.jpg and b/screenshots/02.jpg differ diff --git a/screenshots/03.jpg b/screenshots/03.jpg index 5dc5fed..a32a0b4 100644 Binary files a/screenshots/03.jpg and b/screenshots/03.jpg differ diff --git a/screenshots/04.jpg b/screenshots/04.jpg index 4d93fd7..926e3eb 100644 Binary files a/screenshots/04.jpg and b/screenshots/04.jpg differ diff --git a/screenshots/05.jpg b/screenshots/05.jpg index ed233cb..7ba9e8f 100644 Binary files a/screenshots/05.jpg and b/screenshots/05.jpg differ diff --git a/screenshots/06.jpg b/screenshots/06.jpg index eab6a63..65a42da 100644 Binary files a/screenshots/06.jpg and b/screenshots/06.jpg differ