From 709279d6cfe10823ab29a2342bf80da25f7e6b8c Mon Sep 17 00:00:00 2001 From: Evgeny <36511477+chymaboy@users.noreply.github.com> Date: Thu, 2 Jan 2025 00:10:20 +0300 Subject: [PATCH 1/5] Update readme.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Небольшие улучшения текста без изменений логики: исправления опечаток, орфографических и пунктуационных ошибок. --- docs/readme.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index a0005d7..71fc7e0 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -2250,39 +2250,39 @@ Openwrt является одной из немногих относительн ## Почему стоит вложиться в покупку VPS -VPS - это виртуальный сервер. Существует огромное множество датацентров, предлагающих данную услугу. -На VPS могут выполняться какие угодно задачи. От простого веб сайта до навороченной системы собственной разработки. -Можно использовать VPS и для поднятия собственного vpn или прокси. -Сама широта возможных способов применения, распространенность услуги сводят к минимуму возможности +VPS — это виртуальный сервер. Существует огромное множество датацентров, предлагающих данную услугу. +На VPS могут выполняться какие угодно задачи. От простого веб-сайта до навороченной системы собственной разработки. +Можно использовать VPS и для поднятия собственного VPN или прокси. +Сама широта возможных способов применения и распространенность услуги сводят к минимуму возможности регуляторов по бану сервисов такого типа. Да, если введут белые списки, то решение загнется, но это будет уже другая реальность, в которой придется изобретать иные решения. Пока этого не сделали, никто не будет банить хостинги просто потому, что они предоставляют хостинг услуги. -Вы как индивидуум скорее всего никому не нужны. Подумайте чем вы отличаетесь от известного VPN провайдера. -VPN провайдер предоставляет _простую_ и _доступную_ услугу по обходу блокировок для масс. -Этот факт делает его первоочередной целью блокировки. РКН направит уведомление, после отказа сотрудничать +Вы, как индивидуум, скорее всего, никому не нужны. Подумайте чем вы отличаетесь от известного VPN провайдера. +VPN-провайдер предоставляет _простую_ и _доступную_ услугу по обходу блокировок для масс. +Этот факт делает его первоочередной целью блокировки. РКН направит уведомление, после отказа сотрудничать — заблокирует VPN. Предоплаченная сумма пропадет. У регуляторов нет и никогда не будет ресурсов для тотальной проверки каждого сервера в сети. -Возможен китайский расклад, при котором DPI выявляет vpn протоколы и динамически банит IP серверов, +Возможен китайский расклад, при котором DPI выявляет VPN-протоколы и динамически банит IP серверов, предоставляющих нелицензированный VPN. Но имея знания, голову, вы всегда можете обфусцировать -vpn трафик или применить другие типы VPN, более устойчивые к анализу на DPI или просто менее широкоизвестные, +VPN трафик или применить другие типы VPN, более устойчивые к анализу на DPI, или просто менее широкоизвестные, а следовательно с меньшей вероятностью обнаруживаемые регулятором. У вас есть свобода делать на вашем VPS все что вы захотите, адаптируясь к новым условиям. Да, это потребует знаний. Вам выбирать учиться и держать ситуацию под контролем, когда вам ничего запретить не могут, или покориться системе. -VPS можно прибрести в множестве мест. Существуют специализированные на поиске предложений VPS порталы.\ +VPS можно приобрести в множестве мест. Существуют специализированные на поиске предложений VPS порталы.\ Например, [вот этот](https://vps.today). Для персонального VPN сервера обычно достаточно самой минимальной конфигурации, но с безлимитным трафиком или -с большим лимитом по трафику (терабайты). Важен и тип VPS. Openvz подойдет для openvpn, но -вы не поднимете на нем wireguard, ipsec, то есть все, что требует kernel mode. +с большим лимитом по трафику (терабайты). Важен и тип VPS. OpenVZ подойдёт для OpenVPN, но +вы не поднимете на нем WireGuard, IPsec, то есть все, что требует kernel mode. Для kernel mode требуется тип виртуализации, предполагающий запуск полноценного экземпляра ОС linux -вместе с ядром. Подойдут kvm, xen, hyper-v, vmware. +вместе с ядром. Подойдут KVM, Xen, Hyper-V, VMware. По цене можно найти предложения, которые будут дешевле готовой VPN услуги, но при этом вы сам хозяин в своей лавке -и не рискуете попасть под бан регулятора, разве что "заодно" под ковровую бомбардировку с баном миллионов IP. +и не рискуете попасть под бан регулятора, разве что «заодно» — под ковровую бомбардировку с баном миллионов IP. Кроме того, если вам совсем все кажется сложным, прочитанное вызывает ступор и вы точно знаете, что ничего -из описанного сделать не сможете, то вы сможете хотя бы использовать динамическое перенаправление портов ssh -для получения шифрованного socks proxy и прописать его в броузер. Знания linux не нужны совсем. +из описанного сделать не сможете, то вы сможете хотя бы использовать динамическое перенаправление портов SSH +для получения шифрованного SOCKS-прокси и прописать его в браузер. Знания linux не нужны совсем. Это вариант наименее напряжный для чайников, хотя и не самый удобный в использовании. ## Поддержать разработчика From 77474c9f76598e62ea2ccd453bc977392e4d469e Mon Sep 17 00:00:00 2001 From: bol-van Date: Thu, 2 Jan 2025 10:43:15 +0300 Subject: [PATCH 2/5] update readme.md --- docs/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readme.md b/docs/readme.md index 71fc7e0..f036972 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -2259,7 +2259,7 @@ VPS — это виртуальный сервер. Существует огр Пока этого не сделали, никто не будет банить хостинги просто потому, что они предоставляют хостинг услуги. Вы, как индивидуум, скорее всего, никому не нужны. Подумайте чем вы отличаетесь от известного VPN провайдера. VPN-провайдер предоставляет _простую_ и _доступную_ услугу по обходу блокировок для масс. -Этот факт делает его первоочередной целью блокировки. РКН направит уведомление, после отказа сотрудничать — +Этот факт делает его первоочередной целью блокировки. РКН направит уведомление, после отказа сотрудничать заблокирует VPN. Предоплаченная сумма пропадет. У регуляторов нет и никогда не будет ресурсов для тотальной проверки каждого сервера в сети. Возможен китайский расклад, при котором DPI выявляет VPN-протоколы и динамически банит IP серверов, From 4585cc4656a93f31d5733cc45ef7bf3592ddc829 Mon Sep 17 00:00:00 2001 From: bol-van Date: Fri, 3 Jan 2025 13:55:32 +0300 Subject: [PATCH 3/5] blockcheck: batch mode, parallel scan --- blockcheck.sh | 206 ++++++++++++++++++++++++++++------------------ docs/changes.txt | 7 +- docs/readme.en.md | 2 +- docs/readme.md | 10 ++- 4 files changed, 141 insertions(+), 84 deletions(-) diff --git a/blockcheck.sh b/blockcheck.sh index 3c3d900..ea3bd10 100755 --- a/blockcheck.sh +++ b/blockcheck.sh @@ -23,6 +23,7 @@ CURL=${CURL:-curl} . "$ZAPRET_BASE/common/fwtype.sh" . "$ZAPRET_BASE/common/virt.sh" +DOMAINS_DEFAULT="rutracker.org" QNUM=${QNUM:-59780} SOCKS_PORT=${SOCKS_PORT:-1993} TPWS_UID=${TPWS_UID:-1} @@ -35,7 +36,6 @@ MDIG=${MDIG:-${ZAPRET_BASE}/mdig/mdig} DESYNC_MARK=0x10000000 IPFW_RULE_NUM=${IPFW_RULE_NUM:-1} IPFW_DIVERT_PORT=${IPFW_DIVERT_PORT:-59780} -DOMAINS=${DOMAINS:-rutracker.org} CURL_MAX_TIME=${CURL_MAX_TIME:-2} CURL_MAX_TIME_QUIC=${CURL_MAX_TIME_QUIC:-$CURL_MAX_TIME} MIN_TTL=${MIN_TTL:-1} @@ -45,8 +45,9 @@ HTTP_PORT=${HTTP_PORT:-80} HTTPS_PORT=${HTTPS_PORT:-443} QUIC_PORT=${QUIC_PORT:-443} UNBLOCKED_DOM=${UNBLOCKED_DOM:-iana.org} +PARALLEL_OUT=/tmp/zapret_parallel -HDRTEMP=/tmp/zapret-hdr.txt +HDRTEMP=/tmp/zapret-hdr NFT_TABLE=blockcheck @@ -560,7 +561,7 @@ curl_supports_tls13() [ $? = 2 ] && return 1 # curl can have tlsv1.3 key present but ssl library without TLS 1.3 support # this is online test because there's no other way to trigger library incompatibility case - $CURL --tlsv1.3 --max-time $CURL_MAX_TIME -Is -o /dev/null https://iana.org 2>/dev/null + $CURL --tlsv1.3 --max-time 1 -Is -o /dev/null https://iana.org 2>/dev/null r=$? [ $r != 4 -a $r != 35 ] } @@ -651,28 +652,28 @@ curl_test_http() # $3 - subst ip # $4 - "detail" - detail info - local code loc - curl_probe $1 $2 $HTTP_PORT "$3" -SsD "$HDRTEMP" -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT "http://$2" -o /dev/null 2>&1 || { + local code loc hdrt="${HDRTEMP}_${!:-$$}.txt" + curl_probe $1 $2 $HTTP_PORT "$3" -SsD "$hdrt" -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT "http://$2" -o /dev/null 2>&1 || { code=$? - rm -f "$HDRTEMP" + rm -f "$hdrt" return $code } if [ "$4" = "detail" ] ; then - head -n 1 "$HDRTEMP" - grep "^[lL]ocation:" "$HDRTEMP" + head -n 1 "$hdrt" + grep "^[lL]ocation:" "$hdrt" else - code=$(hdrfile_http_code "$HDRTEMP") + code=$(hdrfile_http_code "$hdrt") [ "$code" = 301 -o "$code" = 302 -o "$code" = 307 -o "$code" = 308 ] && { - loc=$(hdrfile_location "$HDRTEMP") + loc=$(hdrfile_location "$hdrt") echo "$loc" | grep -qE "^https?://.*$2(/|$)" || echo "$loc" | grep -vqE '^https?://' || { echo suspicious redirection $code to : $loc - rm -f "$HDRTEMP" + rm -f "$hdrt" return 254 } } fi - rm -f "$HDRTEMP" + rm -f "$hdrt" [ "$code" = 400 ] && { # this can often happen if the server receives fake packets it should not receive echo http code $code. likely the server receives fakes. @@ -964,18 +965,38 @@ curl_test() # $2 - domain # $3 - subst ip # $4 - param of test function - local code=0 n=0 + local code=0 n=0 p pids - while [ $n -lt $REPEATS ]; do - n=$(($n+1)) - [ $REPEATS -gt 1 ] && printf "[attempt $n] " - if $1 "$IPV" $2 $3 "$4" ; then - [ $REPEATS -gt 1 ] && echo 'AVAILABLE' - else - code=$? - [ "$SCANLEVEL" = quick ] && break - fi - done + if [ "$PARALLEL" = 1 ]; then + rm -f "${PARALLEL_OUT}"* + for n in $(seq -s ' ' 1 $REPEATS); do + $1 "$IPV" $2 $3 "$4" >"${PARALLEL_OUT}_$n" & + pids=${pids:+$pids }$! + done + n=1 + for p in $pids; do + [ $REPEATS -gt 1 ] && printf "[attempt $n] " + if wait $p; then + [ $REPEATS -gt 1 ] && echo 'AVAILABLE' + else + code=$? + cat "${PARALLEL_OUT}_$n" + fi + n=$(($n+1)) + done + rm -f "${PARALLEL_OUT}"* + else + while [ $n -lt $REPEATS ]; do + n=$(($n+1)) + [ $REPEATS -gt 1 ] && printf "[attempt $n] " + if $1 "$IPV" $2 $3 "$4" ; then + [ $REPEATS -gt 1 ] && echo 'AVAILABLE' + else + code=$? + [ "$SCANLEVEL" = quick ] && break + fi + done + fi [ "$4" = detail ] || { if [ $code = 254 ]; then echo "UNAVAILABLE" @@ -1707,76 +1728,99 @@ ask_params() exitp 1 } - - echo "specify domain(s) to test. multiple domains are space separated." - printf "domain(s) (default: $DOMAINS) : " local dom - read dom - [ -n "$dom" ] && DOMAINS="$dom" + [ -n "$DOMAINS" ] || { + DOMAINS="$DOMAINS_DEFAULT" + echo "specify domain(s) to test. multiple domains are space separated." + printf "domain(s) (default: $DOMAINS) : " + read dom + [ -n "$dom" ] && DOMAINS="$dom" + } local IPVS_def=4 - # yandex public dns - pingtest 6 2a02:6b8::feed:0ff && IPVS_def=46 - printf "ip protocol version(s) - 4, 6 or 46 for both (default: $IPVS_def) : " - read IPVS - [ -n "$IPVS" ] || IPVS=$IPVS_def - [ "$IPVS" = 4 -o "$IPVS" = 6 -o "$IPVS" = 46 ] || { - echo 'invalid ip version(s). should be 4, 6 or 46.' - exitp 1 + [ -n "$IPVS" ] || { + # yandex public dns + pingtest 6 2a02:6b8::feed:0ff && IPVS_def=46 + printf "ip protocol version(s) - 4, 6 or 46 for both (default: $IPVS_def) : " + read IPVS + [ -n "$IPVS" ] || IPVS=$IPVS_def + [ "$IPVS" = 4 -o "$IPVS" = 6 -o "$IPVS" = 46 ] || { + echo 'invalid ip version(s). should be 4, 6 or 46.' + exitp 1 + } } [ "$IPVS" = 46 ] && IPVS="4 6" configure_curl_opt - ENABLE_HTTP=1 - echo - ask_yes_no_var ENABLE_HTTP "check http" + [ -n "$ENABLE_HTTP" ] || { + ENABLE_HTTP=1 + echo + ask_yes_no_var ENABLE_HTTP "check http" + } - ENABLE_HTTPS_TLS12=1 - echo - ask_yes_no_var ENABLE_HTTPS_TLS12 "check https tls 1.2" + [ -n "$ENABLE_HTTPS_TLS12" ] || { + ENABLE_HTTPS_TLS12=1 + echo + ask_yes_no_var ENABLE_HTTPS_TLS12 "check https tls 1.2" + } - ENABLE_HTTPS_TLS13=0 - echo - if [ -n "$TLS13" ]; then - echo "TLS 1.3 uses encrypted ServerHello. DPI cannot check domain name in server response." - echo "This can allow more bypass strategies to work." - echo "What works for TLS 1.2 will also work for TLS 1.3 but not vice versa." - echo "Most sites nowadays support TLS 1.3 but not all. If you can't find a strategy for TLS 1.2 use this test." - echo "TLS 1.3 only strategy is better than nothing." - ask_yes_no_var ENABLE_HTTPS_TLS13 "check https tls 1.3" - else - echo "installed curl version does not support TLS 1.3 . tests disabled." - fi + [ -n "$ENABLE_HTTPS_TLS13" ] || { + ENABLE_HTTPS_TLS13=0 + echo + if [ -n "$TLS13" ]; then + echo "TLS 1.3 uses encrypted ServerHello. DPI cannot check domain name in server response." + echo "This can allow more bypass strategies to work." + echo "What works for TLS 1.2 will also work for TLS 1.3 but not vice versa." + echo "Most sites nowadays support TLS 1.3 but not all. If you can't find a strategy for TLS 1.2 use this test." + echo "TLS 1.3 only strategy is better than nothing." + ask_yes_no_var ENABLE_HTTPS_TLS13 "check https tls 1.3" + else + echo "installed curl version does not support TLS 1.3 . tests disabled." + fi + } - ENABLE_HTTP3=0 - echo - if [ -n "$HTTP3" ]; then - echo "make sure target domain(s) support QUIC or result will be negative in any case" - ENABLE_HTTP3=1 - ask_yes_no_var ENABLE_HTTP3 "check http3 QUIC" - else - echo "installed curl version does not support http3 QUIC. tests disabled." - fi + [ -n "$ENABLE_HTTP3" ] || { + ENABLE_HTTP3=0 + echo + if [ -n "$HTTP3" ]; then + echo "make sure target domain(s) support QUIC or result will be negative in any case" + ENABLE_HTTP3=1 + ask_yes_no_var ENABLE_HTTP3 "check http3 QUIC" + else + echo "installed curl version does not support http3 QUIC. tests disabled." + fi + } - echo - echo "sometimes ISPs use multiple DPIs or load balancing. bypass strategies may work unstable." - printf "how many times to repeat each test (default: 1) : " - read REPEATS - REPEATS=$((0+${REPEATS:-1})) - [ "$REPEATS" = 0 ] && { - echo invalid repeat count - exitp 1 + [ -n "$REPEATS" ] || { + echo + echo "sometimes ISPs use multiple DPIs or load balancing. bypass strategies may work unstable." + printf "how many times to repeat each test (default: 1) : " + read REPEATS + REPEATS=$((0+${REPEATS:-1})) + [ "$REPEATS" = 0 ] && { + echo invalid repeat count + exitp 1 + } + } + [ -z "$PARALLEL" -a $REPEATS -gt 1 ] && { + echo + echo "parallel scan can greatly increase speed but may also trigger DDoS protection and cause false result" + PARALLEL=0 + ask_yes_no_var PARALLEL "enable parallel scan" } + PARALLEL=${PARALLEL:-0} - echo - echo quick - scan as fast as possible to reveal any working strategy - echo standard - do investigation what works on your DPI - echo force - scan maximum despite of result - SCANLEVEL=${SCANLEVEL:-standard} - ask_list SCANLEVEL "quick standard force" "$SCANLEVEL" - # disable tpws checks by default in quick mode - [ "$SCANLEVEL" = quick -a -z "$SKIP_TPWS" -a "$UNAME" != Darwin ] && SKIP_TPWS=1 + [ -n "$SCANLEVEL" ] || { + echo + echo quick - scan as fast as possible to reveal any working strategy + echo standard - do investigation what works on your DPI + echo force - scan maximum despite of result + SCANLEVEL=${SCANLEVEL:-standard} + ask_list SCANLEVEL "quick standard force" "$SCANLEVEL" + # disable tpws checks by default in quick mode + [ "$SCANLEVEL" = quick -a -z "$SKIP_TPWS" -a "$UNAME" != Darwin ] && SKIP_TPWS=1 + } echo @@ -1981,14 +2025,14 @@ check_dns() unprepare_all() { # make sure we are not in a middle state that impacts connectivity - rm -f "$HDRTEMP" + ws_kill [ -n "$IPV" ] && { pktws_ipt_unprepare_tcp 80 pktws_ipt_unprepare_tcp 443 pktws_ipt_unprepare_udp 443 } - ws_kill cleanup + rm -f "${HDRTEMP}"* "${PARALLEL_OUT}"* } sigint() { diff --git a/docs/changes.txt b/docs/changes.txt index e82904b..e35efe1 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -440,4 +440,9 @@ v69.9 init.d: exclude ipban from tpws redirection macos: fix install_easy macos: fix national decimal separator in sleep -nfqws: apply relative markers to partial TLS ClientHello +ipset: scripts maintenance + +v70 + +blockcheck: override all dialog questions and enable batch mode +blockcheck: parallel attempts diff --git a/docs/readme.en.md b/docs/readme.en.md index 7f526e4..fada456 100644 --- a/docs/readme.en.md +++ b/docs/readme.en.md @@ -1,4 +1,4 @@ -# zapret v69.9 +# zapret v70 # SCAMMER WARNING diff --git a/docs/readme.md b/docs/readme.md index f036972..58e8f23 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -1,4 +1,4 @@ -# zapret v69.9 +# zapret v70 # ВНИМАНИЕ, остерегайтесь мошенников @@ -1430,6 +1430,14 @@ CURL_MAX_TIME_QUIC - время таймаута curl для quic. если не CURL_CMD=1 - показывать команды curl CURL_OPT - дополнительные параметры curl. `-k` - игнор сертификатов. `-v` - подробный вывод протокола DOMAINS - список тестируемых доменов через пробел +IPVS=4|6|46 - тестируемые версии ip протокола +ENABLE_HTTP=0|1 - включить тест plain http +ENABLE_HTTPS_TLS12=0|1 - включить тест https TLS 1.2 +ENABLE_HTTPS_TLS13=0|1 - включить тест https TLS 1.3 +ENABLE_HTTP3=0|1 - включить тест QUIC +REPEATS - количество попыток тестирования +PARALLEL=0|1 - включить параллельные попытки. может обидеть сайт из-за долбежки и привести к неверному результату +SCANLEVEL=quick|standard|force - глубина сканирования. quick - до первого результата, standard - исследование DPI, force - тестировать все HTTP_PORT, HTTPS_PORT, QUIC_PORT - номера портов для соответствующих протоколов SKIP_DNSCHECK=1 - отказ от проверки DNS SKIP_TPWS=1 - отказ от тестов tpws From e87965cd2fccaa698711f72a58bf29ffbaea3103 Mon Sep 17 00:00:00 2001 From: bol-van Date: Fri, 3 Jan 2025 13:58:25 +0300 Subject: [PATCH 4/5] update doc --- docs/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readme.md b/docs/readme.md index 58e8f23..4531d3a 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -1437,7 +1437,7 @@ ENABLE_HTTPS_TLS13=0|1 - включить тест https TLS 1.3 ENABLE_HTTP3=0|1 - включить тест QUIC REPEATS - количество попыток тестирования PARALLEL=0|1 - включить параллельные попытки. может обидеть сайт из-за долбежки и привести к неверному результату -SCANLEVEL=quick|standard|force - глубина сканирования. quick - до первого результата, standard - исследование DPI, force - тестировать все +SCANLEVEL=quick|standard|force - уровень сканирования HTTP_PORT, HTTPS_PORT, QUIC_PORT - номера портов для соответствующих протоколов SKIP_DNSCHECK=1 - отказ от проверки DNS SKIP_TPWS=1 - отказ от тестов tpws From 5e84656707d0248f22abf80f83e617b9ee108c62 Mon Sep 17 00:00:00 2001 From: bol-van Date: Fri, 3 Jan 2025 14:06:21 +0300 Subject: [PATCH 5/5] blockcheck: BATCH var --- blockcheck.sh | 8 +++++--- docs/readme.md | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/blockcheck.sh b/blockcheck.sh index ea3bd10..99b5896 100755 --- a/blockcheck.sh +++ b/blockcheck.sh @@ -78,9 +78,11 @@ exitp() { local A - echo - echo press enter to continue - read A + [ "$BATCH" = 1 ] || { + echo + echo press enter to continue + read A + } exit $1 } diff --git a/docs/readme.md b/docs/readme.md index 4531d3a..639cd76 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -1438,6 +1438,7 @@ ENABLE_HTTP3=0|1 - включить тест QUIC REPEATS - количество попыток тестирования PARALLEL=0|1 - включить параллельные попытки. может обидеть сайт из-за долбежки и привести к неверному результату SCANLEVEL=quick|standard|force - уровень сканирования +BATCH=1 - отключить "press enter to continue" HTTP_PORT, HTTPS_PORT, QUIC_PORT - номера портов для соответствующих протоколов SKIP_DNSCHECK=1 - отказ от проверки DNS SKIP_TPWS=1 - отказ от тестов tpws