mirror of
https://github.com/bol-van/zapret.git
synced 2025-02-18 19:12:20 +03:00
Compare commits
No commits in common. "42422f479c704fa21127b0696d20267996ab5341" and "04e8106b98bf591d45ab4df57f9ee39f224a7563" have entirely different histories.
42422f479c
...
04e8106b98
@ -575,29 +575,22 @@ curl_test_http()
|
|||||||
# $1 - ip version : 4/6
|
# $1 - ip version : 4/6
|
||||||
# $2 - domain name
|
# $2 - domain name
|
||||||
# $3 - subst ip
|
# $3 - subst ip
|
||||||
# $4 - "detail" - detail info
|
|
||||||
|
|
||||||
local code loc
|
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 || {
|
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 || {
|
||||||
code=$?
|
code=$?
|
||||||
rm -f "$HDRTEMP"
|
rm -f "$HDRTEMP"
|
||||||
return $code
|
return $code
|
||||||
}
|
}
|
||||||
if [ "$4" = "detail" ] ; then
|
code=$(hdrfile_http_code "$HDRTEMP")
|
||||||
head -n 1 "$HDRTEMP"
|
[ "$code" = 301 -o "$code" = 302 -o "$code" = 307 -o "$code" = 308 ] && {
|
||||||
grep "^[lL]ocation:" "$HDRTEMP"
|
loc=$(hdrfile_location "$HDRTEMP")
|
||||||
else
|
echo "$loc" | grep -qE "^https?://.*$2(/|$)" ||
|
||||||
code=$(hdrfile_http_code "$HDRTEMP")
|
echo "$loc" | grep -vqE '^https?://' || {
|
||||||
[ "$code" = 301 -o "$code" = 302 -o "$code" = 307 -o "$code" = 308 ] && {
|
echo suspicious redirection $code to : $loc
|
||||||
loc=$(hdrfile_location "$HDRTEMP")
|
rm -f "$HDRTEMP"
|
||||||
echo "$loc" | grep -qE "^https?://.*$2(/|$)" ||
|
return 254
|
||||||
echo "$loc" | grep -vqE '^https?://' || {
|
|
||||||
echo suspicious redirection $code to : $loc
|
|
||||||
rm -f "$HDRTEMP"
|
|
||||||
return 254
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
fi
|
}
|
||||||
rm -f "$HDRTEMP"
|
rm -f "$HDRTEMP"
|
||||||
[ "$code" = 400 ] && {
|
[ "$code" = 400 ] && {
|
||||||
# this can often happen if the server receives fake packets it should not receive
|
# this can often happen if the server receives fake packets it should not receive
|
||||||
@ -827,28 +820,25 @@ curl_test()
|
|||||||
# $1 - test function
|
# $1 - test function
|
||||||
# $2 - domain
|
# $2 - domain
|
||||||
# $3 - subst ip
|
# $3 - subst ip
|
||||||
# $4 - param of test function
|
|
||||||
local code=0 n=0
|
local code=0 n=0
|
||||||
|
|
||||||
while [ $n -lt $REPEATS ]; do
|
while [ $n -lt $REPEATS ]; do
|
||||||
n=$(($n+1))
|
n=$(($n+1))
|
||||||
[ $REPEATS -gt 1 ] && printf "[attempt $n] "
|
[ $REPEATS -gt 1 ] && printf "[attempt $n] "
|
||||||
if $1 "$IPV" $2 $3 "$4" ; then
|
if $1 "$IPV" $2 $3 ; then
|
||||||
[ $REPEATS -gt 1 ] && echo 'AVAILABLE'
|
[ $REPEATS -gt 1 ] && echo 'AVAILABLE'
|
||||||
else
|
else
|
||||||
code=$?
|
code=$?
|
||||||
[ "$SCANLEVEL" = quick ] && break
|
[ "$SCANLEVEL" = quick ] && break
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
[ "$4" = detail ] || {
|
if [ $code = 254 ]; then
|
||||||
if [ $code = 254 ]; then
|
echo "UNAVAILABLE"
|
||||||
echo "UNAVAILABLE"
|
elif [ $code = 0 ]; then
|
||||||
elif [ $code = 0 ]; then
|
echo '!!!!! AVAILABLE !!!!!'
|
||||||
echo '!!!!! AVAILABLE !!!!!'
|
else
|
||||||
else
|
echo "UNAVAILABLE code=$code"
|
||||||
echo "UNAVAILABLE code=$code"
|
fi
|
||||||
fi
|
|
||||||
}
|
|
||||||
return $code
|
return $code
|
||||||
}
|
}
|
||||||
ws_curl_test()
|
ws_curl_test()
|
||||||
@ -1246,7 +1236,7 @@ check_dpi_ip_block()
|
|||||||
echo
|
echo
|
||||||
echo "- IP block tests (requires manual interpretation)"
|
echo "- IP block tests (requires manual interpretation)"
|
||||||
|
|
||||||
echo "> testing $UNBLOCKED_DOM on it's original ip"
|
echo "testing $UNBLOCKED_DOM on it's original ip"
|
||||||
if curl_test $1 $UNBLOCKED_DOM; then
|
if curl_test $1 $UNBLOCKED_DOM; then
|
||||||
unblocked_ip=$(mdig_resolve $IPV $UNBLOCKED_DOM)
|
unblocked_ip=$(mdig_resolve $IPV $UNBLOCKED_DOM)
|
||||||
[ -n "$unblocked_ip" ] || {
|
[ -n "$unblocked_ip" ] || {
|
||||||
@ -1254,13 +1244,13 @@ check_dpi_ip_block()
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "> testing $blocked_dom on $unblocked_ip ($UNBLOCKED_DOM)"
|
echo "testing $blocked_dom on $unblocked_ip ($UNBLOCKED_DOM)"
|
||||||
curl_test $1 $blocked_dom $unblocked_ip detail
|
curl_test $1 $blocked_dom $unblocked_ip
|
||||||
|
|
||||||
blocked_ips=$(mdig_resolve_all $IPV $blocked_dom)
|
blocked_ips=$(mdig_resolve_all $IPV $blocked_dom)
|
||||||
for blocked_ip in $blocked_ips; do
|
for blocked_ip in $blocked_ips; do
|
||||||
echo "> testing $UNBLOCKED_DOM on $blocked_ip ($blocked_dom)"
|
echo "testing $UNBLOCKED_DOM on $blocked_ip ($blocked_dom)"
|
||||||
curl_test $1 $UNBLOCKED_DOM $blocked_ip detail
|
curl_test $1 $UNBLOCKED_DOM $blocked_ip
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
echo $UNBLOCKED_DOM is not available. skipping this test.
|
echo $UNBLOCKED_DOM is not available. skipping this test.
|
||||||
|
@ -1123,103 +1123,6 @@ Blockcheck имеет 3 уровня сканирования.
|
|||||||
standard дает возможность провести исследование как и на что реагирует DPI в плане методов обхода.
|
standard дает возможность провести исследование как и на что реагирует DPI в плане методов обхода.
|
||||||
force дает максимум проверок даже в случаях, когда ресурс работает без обхода или с более простыми стратегиями.
|
force дает максимум проверок даже в случаях, когда ресурс работает без обхода или с более простыми стратегиями.
|
||||||
|
|
||||||
СКАН ПОРТОВ
|
|
||||||
Если в системе присутствует совместимый netcat (ncat от nmap или openbsd ncat. в openwrt по умолчанию нет.),
|
|
||||||
то выполняется сканирование портов http или https всех IP адресов домена.
|
|
||||||
Если ни один IP не отвечает, то результат очевиден. Можно останавливать сканирование.
|
|
||||||
Автоматически оно не остановится, потому что netcat-ы недостаточно подробно информируют о причинах ошибки.
|
|
||||||
Если доступна только часть IP, то можно ожидать хаотичных сбоев, т.к. подключение идет к случайному адресу
|
|
||||||
из списка.
|
|
||||||
|
|
||||||
ПРОВЕРКА НА ЧАСТИЧНЫЙ IP block
|
|
||||||
Под частичным блоком подразумевается ситуация, когда конект на порты есть, но по определенному транспортному
|
|
||||||
или прикладному протоколу всегда идет реакция DPI вне зависимости от запрашиваемого домена.
|
|
||||||
Эта проверка так же не выдаст автоматического вердикта/решения, потому что может быть очень много вариаций.
|
|
||||||
Вместо этого анализ происходящего возложен на самого пользователя или тех, кто будет читать лог.
|
|
||||||
Суть этой проверки в попытке дернуть неблокированный IP с блокированным доменом и наоборот, анализируя
|
|
||||||
при этом реакцию DPI. Реакция DPI обычно проявляется в виде таймаута (зависание запроса), connection reset
|
|
||||||
или http redirect на заглушку. Любой другой вариант скорее всего говорит об отсутствии реакции DPI.
|
|
||||||
В частности, любые http коды, кроме редиректа, ведущего именно на заглушку, а не куда-то еще.
|
|
||||||
На TLS - ошибки handshake без задержек.
|
|
||||||
Ошибка сертификата может говорить как о реакции DPI с MiTM атакой (подмена сертификата), так и
|
|
||||||
о том, что принимающий сервер неблокированного домена все равно принимает ваш TLS handshake с чужим доменом,
|
|
||||||
пытаясь при этом выдать сертификат без запрошенного домена. Требуется дополнительный анализ.
|
|
||||||
Если на заблокированный домен есть реакция на всех IP адресах, значит есть блокировака по домену.
|
|
||||||
Если на неблокированный домен есть реакция на IP адресах блокированного домена, значит имеет место блок по IP.
|
|
||||||
Соответственно, если есть и то, и другое, значит есть и блок по IP, и блок по домену.
|
|
||||||
Неблокированный домен первым делом проверяется на доступность на оригинальном адресе.
|
|
||||||
При недоступности тест отменяется, поскольку он будет неинформативен.
|
|
||||||
|
|
||||||
Если выяснено, что есть частичный блок по IP на DPI, то скорее всего все остальные тесты будут провалены
|
|
||||||
вне зависимости от стратегий обхода. Но бывают и некоторые исключения. Например, пробитие через ipv6
|
|
||||||
option headers. Или сделать так, чтобы он не мог распознать протокол прикладного уровня.
|
|
||||||
Дальнейшие тесты могут быть не лишены смысла.
|
|
||||||
|
|
||||||
ПРИМЕРЫ БЛОКИРОВКИ ТОЛЬКО ПО ДОМЕНУ БЕЗ БЛОКА ПО IP
|
|
||||||
|
|
||||||
> testing iana.org on it's original ip
|
|
||||||
!!!!! AVAILABLE !!!!!
|
|
||||||
> testing rutracker.org on 192.0.43.8 (iana.org)
|
|
||||||
curl: (28) Operation timed out after 1002 milliseconds with 0 bytes received
|
|
||||||
> testing iana.org on 172.67.182.196 (rutracker.org)
|
|
||||||
HTTP/1.1 409 Conflict
|
|
||||||
> testing iana.org on 104.21.32.39 (rutracker.org)
|
|
||||||
HTTP/1.1 409 Conflict
|
|
||||||
|
|
||||||
> testing iana.org on it's original ip
|
|
||||||
!!!!! AVAILABLE !!!!!
|
|
||||||
> testing rutracker.org on 192.0.43.8 (iana.org)
|
|
||||||
curl: (28) Connection timed out after 1001 milliseconds
|
|
||||||
> testing iana.org on 172.67.182.196 (rutracker.org)
|
|
||||||
curl: (35) OpenSSL/3.2.1: error:0A000410:SSL routines::ssl/tls alert handshake failure
|
|
||||||
> testing iana.org on 104.21.32.39 (rutracker.org)
|
|
||||||
curl: (35) OpenSSL/3.2.1: error:0A000410:SSL routines::ssl/tls alert handshake failure
|
|
||||||
|
|
||||||
> testing iana.org on it's original ip
|
|
||||||
!!!!! AVAILABLE !!!!!
|
|
||||||
> testing rutracker.org on 192.0.43.8 (iana.org)
|
|
||||||
HTTP/1.1 307 Temporary Redirect
|
|
||||||
Location: https://www.gblnet.net/blocked.php
|
|
||||||
> testing iana.org on 172.67.182.196 (rutracker.org)
|
|
||||||
HTTP/1.1 409 Conflict
|
|
||||||
> testing iana.org on 104.21.32.39 (rutracker.org)
|
|
||||||
HTTP/1.1 409 Conflict
|
|
||||||
|
|
||||||
> testing iana.org on it's original ip
|
|
||||||
!!!!! AVAILABLE !!!!!
|
|
||||||
> testing rutracker.org on 192.0.43.8 (iana.org)
|
|
||||||
curl: (35) Recv failure: Connection reset by peer
|
|
||||||
> testing iana.org on 172.67.182.196 (rutracker.org)
|
|
||||||
curl: (35) OpenSSL/3.2.1: error:0A000410:SSL routines::ssl/tls alert handshake failure
|
|
||||||
> testing iana.org on 104.21.32.39 (rutracker.org)
|
|
||||||
curl: (35) OpenSSL/3.2.1: error:0A000410:SSL routines::ssl/tls alert handshake failure
|
|
||||||
|
|
||||||
|
|
||||||
ПРИМЕР ПОЛНОГО IP БЛОКА ИЛИ БЛОКА TCP ПОРТА ПРИ ОТСУТСТВИИ БЛОКА ПО ДОМЕНУ
|
|
||||||
|
|
||||||
* port block tests ipv4 startmail.com:80
|
|
||||||
ncat -z -w 1 145.131.90.136 80
|
|
||||||
145.131.90.136 does not connect. netcat code 1
|
|
||||||
ncat -z -w 1 145.131.90.152 80
|
|
||||||
145.131.90.152 does not connect. netcat code 1
|
|
||||||
|
|
||||||
* curl_test_http ipv4 startmail.com
|
|
||||||
- checking without DPI bypass
|
|
||||||
curl: (28) Connection timed out after 2002 milliseconds
|
|
||||||
UNAVAILABLE code=28
|
|
||||||
|
|
||||||
- IP block tests (requires manual interpretation)
|
|
||||||
> testing iana.org on it's original ip
|
|
||||||
!!!!! AVAILABLE !!!!!
|
|
||||||
> testing startmail.com on 192.0.43.8 (iana.org)
|
|
||||||
HTTP/1.1 302 Found
|
|
||||||
Location: https://www.iana.org/
|
|
||||||
> testing iana.org on 145.131.90.136 (startmail.com)
|
|
||||||
curl: (28) Connection timed out after 2002 milliseconds
|
|
||||||
> testing iana.org on 145.131.90.152 (startmail.com)
|
|
||||||
curl: (28) Connection timed out after 2002 milliseconds
|
|
||||||
|
|
||||||
|
|
||||||
Выбор параметров
|
Выбор параметров
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user