Compare commits

..

7 Commits

Author SHA1 Message Date
bol-van
42422f479c readme: full ip block example 2024-06-22 16:35:29 +03:00
bol-van
7120418ba6 readme: remove unneeded line 2024-06-22 16:26:38 +03:00
bol-van
8a3e386693 readme: typo 2024-06-22 16:18:27 +03:00
bol-van
388eed652c readme: typo 2024-06-22 16:15:32 +03:00
bol-van
e5c59a1cfa readme: ip block testing 2024-06-22 16:13:49 +03:00
bol-van
89be559d04 readme: ip block testing 2024-06-22 16:09:48 +03:00
bol-van
b23b98a14b blockcheck: verbose output in ip block tests 2024-06-22 15:38:22 +03:00
2 changed files with 129 additions and 22 deletions

View File

@ -575,22 +575,29 @@ 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
} }
code=$(hdrfile_http_code "$HDRTEMP") if [ "$4" = "detail" ] ; then
[ "$code" = 301 -o "$code" = 302 -o "$code" = 307 -o "$code" = 308 ] && { head -n 1 "$HDRTEMP"
loc=$(hdrfile_location "$HDRTEMP") grep "^[lL]ocation:" "$HDRTEMP"
echo "$loc" | grep -qE "^https?://.*$2(/|$)" || else
echo "$loc" | grep -vqE '^https?://' || { code=$(hdrfile_http_code "$HDRTEMP")
echo suspicious redirection $code to : $loc [ "$code" = 301 -o "$code" = 302 -o "$code" = 307 -o "$code" = 308 ] && {
rm -f "$HDRTEMP" loc=$(hdrfile_location "$HDRTEMP")
return 254 echo "$loc" | grep -qE "^https?://.*$2(/|$)" ||
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
@ -820,25 +827,28 @@ 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 ; then if $1 "$IPV" $2 $3 "$4" ; 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
if [ $code = 254 ]; then [ "$4" = detail ] || {
echo "UNAVAILABLE" if [ $code = 254 ]; then
elif [ $code = 0 ]; then echo "UNAVAILABLE"
echo '!!!!! AVAILABLE !!!!!' elif [ $code = 0 ]; then
else echo '!!!!! AVAILABLE !!!!!'
echo "UNAVAILABLE code=$code" else
fi echo "UNAVAILABLE code=$code"
fi
}
return $code return $code
} }
ws_curl_test() ws_curl_test()
@ -1236,7 +1246,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" ] || {
@ -1244,13 +1254,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 curl_test $1 $blocked_dom $unblocked_ip detail
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 curl_test $1 $UNBLOCKED_DOM $blocked_ip detail
done done
else else
echo $UNBLOCKED_DOM is not available. skipping this test. echo $UNBLOCKED_DOM is not available. skipping this test.

View File

@ -1123,6 +1123,103 @@ 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
Выбор параметров Выбор параметров
---------------- ----------------