diff --git a/blockcheck2.sh b/blockcheck2.sh index 1b37de4..f2eed49 100755 --- a/blockcheck2.sh +++ b/blockcheck2.sh @@ -240,7 +240,7 @@ mdig_vars() # $1 - ip version 4/6 # $2 - hostname - hostvar=$(echo $2 | sed -e 's/[\./?&#@%*$^:~=!()+-]/_/g') + hostvar=$(echo $2 | sed -e 's/[\./?&#@%*$^:~=!()+-]/_/g' | tr 'A-Z' 'a-z') cachevar=DNSCACHE_${hostvar}_$1 countvar=${cachevar}_COUNT eval count=\$${countvar} @@ -297,7 +297,7 @@ mdig_resolve_all() mdig_vars "$1" "$sdom" if [ -n "$count" ]; then n=0 - while [ "$n" -le $count ]; do + while [ "$n" -lt $count ]; do eval ip__=\$${cachevar}_$n if [ -n "$ips__" ]; then ips__="$ips__ $ip__" @@ -406,10 +406,10 @@ zp_already_running() { case "$UNAME" in CYGWIN) - win_process_exists $PKTWSD || win_process_exists winws || win_process_exists goodbyedpi + win_process_exists $PKTWSD || win_process_exists winws || win_process_exists winws2 || win_process_exists goodbyedpi ;; *) - process_exists $PKTWSD || process_exists tpws || process_exists nfqws + process_exists $PKTWSD || process_exists tpws || process_exists nfqws || process_exists nfqws2 esac } check_already() @@ -633,11 +633,11 @@ curl_with_dig() # $2 - domain name # $3 - port # $4+ - curl params - local dom=$2 port=$3 + local dom="$2" port=$3 local sdom suri ip split_by_separator "$dom" / sdom suri - mdig_resolve $1 ip $sdom + mdig_resolve $1 ip "$sdom" shift ; shift ; shift if [ -n "$ip" ]; then curl_with_subst_ip "$sdom" "$port" "$ip" "$@" @@ -652,12 +652,12 @@ curl_probe() # $3 - port # $4 - subst ip # $5+ - curl params - local ipv=$1 dom=$2 port=$3 subst=$4 + local ipv=$1 dom="$2" port=$3 subst=$4 shift; shift; shift; shift if [ -n "$subst" ]; then - curl_with_subst_ip $dom $port $subst "$@" + curl_with_subst_ip "$dom" $port $subst "$@" else - curl_with_dig $ipv $dom $port "$@" + curl_with_dig $ipv "$dom" $port "$@" fi } curl_test_http() @@ -668,7 +668,7 @@ curl_test_http() # $4 - "detail" - detail info local code loc hdrt="${HDRTEMP}_${!:-$$}.txt" dom="$(tolower "$2")" - 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 || { + 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 "$hdrt" return $code @@ -680,6 +680,7 @@ curl_test_http() code=$(hdrfile_http_code "$hdrt") [ "$code" = 301 -o "$code" = 302 -o "$code" = 307 -o "$code" = 308 ] && { loc=$(hdrfile_location "$hdrt") + split_by_separator "$dom" / dom tolower "$loc" | grep -qE "^https?://.*$dom(/|$)" || tolower "$loc" | grep -vqE '^https?://' || { echo suspicious redirection $code to : $loc @@ -703,7 +704,7 @@ curl_test_https_tls12() # $3 - subst ip # do not use tls 1.3 to make sure server certificate is not encrypted - curl_probe $1 $2 $HTTPS_PORT "$3" $HTTPS_HEAD -Ss -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT --tlsv1.2 $TLSMAX12 "https://$2" -o /dev/null 2>&1 + curl_probe $1 "$2" $HTTPS_PORT "$3" $HTTPS_HEAD -Ss -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT --tlsv1.2 $TLSMAX12 "https://$2" -o /dev/null 2>&1 } curl_test_https_tls13() { @@ -712,7 +713,7 @@ curl_test_https_tls13() # $3 - subst ip # force TLS1.3 mode - curl_probe $1 $2 $HTTPS_PORT "$3" $HTTPS_HEAD -Ss -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT --tlsv1.3 $TLSMAX13 "https://$2" -o /dev/null 2>&1 + curl_probe $1 "$2" $HTTPS_PORT "$3" $HTTPS_HEAD -Ss -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT --tlsv1.3 $TLSMAX13 "https://$2" -o /dev/null 2>&1 } curl_test_http3() @@ -721,7 +722,7 @@ curl_test_http3() # $2 - domain name # force QUIC only mode without tcp - curl_with_dig $1 $2 $QUIC_PORT $HTTPS_HEAD -Ss -A "$USER_AGENT" --max-time $CURL_MAX_TIME_QUIC --http3-only $CURL_OPT "https://$2" -o /dev/null 2>&1 + curl_with_dig $1 "$2" $QUIC_PORT $HTTPS_HEAD -Ss -A "$USER_AGENT" --max-time $CURL_MAX_TIME_QUIC --http3-only $CURL_OPT "https://$2" -o /dev/null 2>&1 } ipt_aux_scheme() @@ -990,7 +991,7 @@ curl_test() if [ "$PARALLEL" = 1 ]; then rm -f "${PARALLEL_OUT}"* for n in $(seq -s ' ' 1 $REPEATS); do - $1 "$IPV" $2 $3 "$4" >"${PARALLEL_OUT}_$n" & + $1 "$IPV" "$2" $3 "$4" >"${PARALLEL_OUT}_$n" & pids="${pids:+$pids }$!" done n=1 @@ -1009,7 +1010,7 @@ curl_test() while [ $n -lt $REPEATS ]; do n=$(($n+1)) [ $REPEATS -gt 1 ] && printf "[attempt $n] " - if $1 "$IPV" $2 $3 "$4" ; then + if $1 "$IPV" "$2" $3 "$4" ; then [ $REPEATS -gt 1 ] && echo 'AVAILABLE' else code=$? @@ -1034,7 +1035,7 @@ ws_curl_test() # $2 - test function # $3 - domain # $4,$5,$6, ... - ws params - local code ws_start=$1 testf=$2 dom=$3 + local code ws_start=$1 testf=$2 dom="$3" [ "$SIMULATE" = 1 ] && { n=$(random 0 99) @@ -1050,7 +1051,7 @@ ws_curl_test() shift shift $ws_start "$@" - curl_test $testf $dom + curl_test $testf "$dom" code=$? ws_kill return $code @@ -1060,11 +1061,11 @@ pktws_curl_test() # $1 - test function # $2 - domain # $3,$4,$5, ... - nfqws/dvtws params - local testf=$1 dom=$2 strategy code + local testf=$1 dom="$2" strategy code shift; shift; echo - $testf ipv$IPV $dom : $PKTWSD ${WF:+$WF }${PKTWS_EXTRA_PRE:+$PKTWS_EXTRA_PRE }${PKTWS_EXTRA_PRE_1:+"$PKTWS_EXTRA_PRE_1" }${PKTWS_EXTRA_PRE_2:+"$PKTWS_EXTRA_PRE_2" }${PKTWS_EXTRA_PRE_3:+"$PKTWS_EXTRA_PRE_3" }${PKTWS_EXTRA_PRE_4:+"$PKTWS_EXTRA_PRE_4" }${PKTWS_EXTRA_PRE_5:+"$PKTWS_EXTRA_PRE_5" }${PKTWS_EXTRA_PRE_6:+"$PKTWS_EXTRA_PRE_6" }${PKTWS_EXTRA_PRE_7:+"$PKTWS_EXTRA_PRE_7" }${PKTWS_EXTRA_PRE_8:+"$PKTWS_EXTRA_PRE_8" }${PKTWS_EXTRA_PRE_9:+"$PKTWS_EXTRA_PRE_9" }$@${PKTWS_EXTRA_POST:+ $PKTWS_EXTRA_POST}${PKTWS_EXTRA_POST_1:+ "$PKTWS_EXTRA_POST_1"}${PKTWS_EXTRA_POST_2:+ "$PKTWS_EXTRA_POST_2"}${PKTWS_EXTRA_POST_3:+ "$PKTWS_EXTRA_POST_3"}${PKTWS_EXTRA_POST_4:+ "$PKTWS_EXTRA_POST_4"}${PKTWS_EXTRA_POST_5:+ "$PKTWS_EXTRA_POST_5"}${PKTWS_EXTRA_POST_6:+ "$PKTWS_EXTRA_POST_6"}${PKTWS_EXTRA_POST_7:+ "$PKTWS_EXTRA_POST_7"}${PKTWS_EXTRA_POST_8:+ "$PKTWS_EXTRA_POST_8"}${PKTWS_EXTRA_POST_9:+ "$PKTWS_EXTRA_POST_9"} - ws_curl_test pktws_start $testf $dom ${PKTWS_EXTRA_PRE:+$PKTWS_EXTRA_PRE }${PKTWS_EXTRA_PRE_1:+"$PKTWS_EXTRA_PRE_1" }${PKTWS_EXTRA_PRE_2:+"$PKTWS_EXTRA_PRE_2" }${PKTWS_EXTRA_PRE_3:+"$PKTWS_EXTRA_PRE_3" }${PKTWS_EXTRA_PRE_4:+"$PKTWS_EXTRA_PRE_4" }${PKTWS_EXTRA_PRE_5:+"$PKTWS_EXTRA_PRE_5" }${PKTWS_EXTRA_PRE_6:+"$PKTWS_EXTRA_PRE_6" }${PKTWS_EXTRA_PRE_7:+"$PKTWS_EXTRA_PRE_7" }${PKTWS_EXTRA_PRE_8:+"$PKTWS_EXTRA_PRE_8" }${PKTWS_EXTRA_PRE_9:+"$PKTWS_EXTRA_PRE_9" }"$@"${PKTWS_EXTRA_POST:+ $PKTWS_EXTRA_POST}${PKTWS_EXTRA_POST_1:+ "$PKTWS_EXTRA_POST_1"}${PKTWS_EXTRA_POST_2:+ "$PKTWS_EXTRA_POST_2"}${PKTWS_EXTRA_POST_3:+ "$PKTWS_EXTRA_POST_3"}${PKTWS_EXTRA_POST_4:+ "$PKTWS_EXTRA_POST_4"}${PKTWS_EXTRA_POST_5:+ "$PKTWS_EXTRA_POST_5"}${PKTWS_EXTRA_POST_6:+ "$PKTWS_EXTRA_POST_6"}${PKTWS_EXTRA_POST_7:+ "$PKTWS_EXTRA_POST_7"}${PKTWS_EXTRA_POST_8:+ "$PKTWS_EXTRA_POST_8"}${PKTWS_EXTRA_POST_9:+ "$PKTWS_EXTRA_POST_9"} + ws_curl_test pktws_start $testf "$dom" ${PKTWS_EXTRA_PRE:+$PKTWS_EXTRA_PRE }${PKTWS_EXTRA_PRE_1:+"$PKTWS_EXTRA_PRE_1" }${PKTWS_EXTRA_PRE_2:+"$PKTWS_EXTRA_PRE_2" }${PKTWS_EXTRA_PRE_3:+"$PKTWS_EXTRA_PRE_3" }${PKTWS_EXTRA_PRE_4:+"$PKTWS_EXTRA_PRE_4" }${PKTWS_EXTRA_PRE_5:+"$PKTWS_EXTRA_PRE_5" }${PKTWS_EXTRA_PRE_6:+"$PKTWS_EXTRA_PRE_6" }${PKTWS_EXTRA_PRE_7:+"$PKTWS_EXTRA_PRE_7" }${PKTWS_EXTRA_PRE_8:+"$PKTWS_EXTRA_PRE_8" }${PKTWS_EXTRA_PRE_9:+"$PKTWS_EXTRA_PRE_9" }"$@"${PKTWS_EXTRA_POST:+ $PKTWS_EXTRA_POST}${PKTWS_EXTRA_POST_1:+ "$PKTWS_EXTRA_POST_1"}${PKTWS_EXTRA_POST_2:+ "$PKTWS_EXTRA_POST_2"}${PKTWS_EXTRA_POST_3:+ "$PKTWS_EXTRA_POST_3"}${PKTWS_EXTRA_POST_4:+ "$PKTWS_EXTRA_POST_4"}${PKTWS_EXTRA_POST_5:+ "$PKTWS_EXTRA_POST_5"}${PKTWS_EXTRA_POST_6:+ "$PKTWS_EXTRA_POST_6"}${PKTWS_EXTRA_POST_7:+ "$PKTWS_EXTRA_POST_7"}${PKTWS_EXTRA_POST_8:+ "$PKTWS_EXTRA_POST_8"}${PKTWS_EXTRA_POST_9:+ "$PKTWS_EXTRA_POST_9"} code=$? [ "$code" = 0 ] && { @@ -1086,11 +1087,11 @@ xxxws_curl_test_update() # $2 - test function # $3 - domain # $4,$5,$6, ... - nfqws2/dvtws2 params - local code xxxf=$1 testf=$2 dom=$3 + local code xxxf=$1 testf=$2 dom="$3" shift shift shift - $xxxf $testf $dom "$@" + $xxxf $testf "$dom" "$@" code=$? [ $code = 0 ] && strategy="${strategy:-$@}" return $code diff --git a/common/base.sh b/common/base.sh index d5a3607..97ad9c3 100644 --- a/common/base.sh +++ b/common/base.sh @@ -95,7 +95,7 @@ end_with_newline() } trim() { - awk '{gsub(/^ +| +$/,"")}1' + awk '{gsub(/^[ \t]+|[ \t]+$/,"")}1' } split_by_separator() { @@ -119,7 +119,7 @@ dir_is_not_empty() # $1 - directory local n [ -d "$1" ] || return 1 - n=$(ls "$1" | wc -c | xargs) + n=$(ls -A "$1" | wc -c | xargs) [ "$n" != 0 ] } @@ -343,7 +343,7 @@ setup_md5() { [ -n "$MD5" ] && return MD5=md5sum - exists $MD5 || MD5=md5 + exists $MD5 || MD5="md5 -q" } md5f() @@ -394,9 +394,9 @@ shell_name() process_exists() { if exists pgrep; then - pgrep ^$1$ >/dev/null + pgrep "^$1$" >/dev/null elif exists pidof; then - pidof $1 >/dev/null + pidof "$1" >/dev/null else return 1 fi diff --git a/common/dialog.sh b/common/dialog.sh index cf6281b..fdb0a67 100644 --- a/common/dialog.sh +++ b/common/dialog.sh @@ -37,7 +37,7 @@ ask_list() local M_DEFAULT eval M_DEFAULT="\$$1" local M_ALL=$M_DEFAULT - local M="" m M_OLD + local M="" m [ -n "$3" ] && { find_str_in_list "$M_DEFAULT" "$2" || M_DEFAULT="$3" ;} diff --git a/common/installer.sh b/common/installer.sh index f9b3ad5..7117c92 100644 --- a/common/installer.sh +++ b/common/installer.sh @@ -256,7 +256,7 @@ check_system() get_free_space_mb() { - df -m $PWD | awk '/[0-9]%/{print $(NF-2)}' + df -m "$1" | awk '/[0-9]%/{print $(NF-2)}' } get_ram_kb() { @@ -779,7 +779,9 @@ select_fwtype() echo WARNING ! if you need large lists it may be necessary to fall back to iptables+ipset firewall } echo select firewall type : - ask_list FWTYPE "iptables nftables" "$FWTYPE" && write_config_var FWTYPE + ask_list FWTYPE "iptables nftables" "$FWTYPE" + # always write config var to prevent auto discovery every time + write_config_var FWTYPE } dry_run_nfqws_() diff --git a/common/nft.sh b/common/nft.sh index d8e0346..35f480b 100644 --- a/common/nft.sh +++ b/common/nft.sh @@ -77,8 +77,7 @@ nft_rule_exists() nft_add_rule ruletest "$2" rule=$(nft list chain inet $ZAPRET_NFT_TABLE ruletest | sed -n '3s/\t//gp') nft_flush_chain ruletest - local yes=$(nft list chain inet $ZAPRET_NFT_TABLE $1 | sed -n "s/^[\t]*$rule\$/1/p") - [ -n "$yes" ] + nft list chain inet $ZAPRET_NFT_TABLE $1 | trim | grep -qxF "$rule" } nft_del_all_chains_from_table() diff --git a/docs/manual.en.md b/docs/manual.en.md index f7d29a2..c155669 100644 --- a/docs/manual.en.md +++ b/docs/manual.en.md @@ -3149,6 +3149,10 @@ function rawsend_dissect_segmented(desync, dis, mss, options) Sends dissect `dis` with automatic TCP segmentation based on MSS, applying `options.fooling` and `options.ipid`. The `ipid` is applied to each fragment. Segmentation is not possible for UDP and is not performed. +- if dis is nil, desync.dis is used. +- if mss is nil, desync.tcp_mss is used. +- if options is nil, options are created from desync.arg + ### rawsend_payload_segmented ``` diff --git a/docs/manual.md b/docs/manual.md index ebef1be..c64871c 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -3328,6 +3328,10 @@ function rawsend_dissect_segmented(desync, dis, mss, options) Отправить диссект dis с автоматической tcp сегментацией на базе mss с применением `options.fooling` и `options.ipid`. ipid применяется к каждому фрагменту. Для udp сегментация невозможна и не выполняется. +- Если dis отсутствует, берется desync.dis. +- Если mss отсутствует, берется desync.tcp_mss. +- Если options отсутствуют, они создаются на базе desync.arg. + ### rawsend_payload_segmented ``` diff --git a/files/fake/sip.bin b/files/fake/sip.bin new file mode 100644 index 0000000..33689f7 --- /dev/null +++ b/files/fake/sip.bin @@ -0,0 +1,13 @@ +REGISTER sip:192.168.1.1 SIP/2.0 +Via: SIP/2.0/UDP 192.168.1.2:42931;rport;branch=z9hG4bKPj3fd2e8713ffcd90c43f6ce69f6c98461 +Max-Forwards: 50 +From: ;tag=ca565d7bd4e24a6d80c631d395ee117e +To: +Call-ID: dfec38302b8cea3d83c1452527c895c1 +CSeq: 26139 REGISTER +User-Agent: MicroSIP/3.21.5 +Contact: +Expires: 300 +Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS +Content-Length: 0 + diff --git a/install_easy.sh b/install_easy.sh index fe516e6..a6b28f1 100755 --- a/install_easy.sh +++ b/install_easy.sh @@ -288,7 +288,7 @@ ask_config_tmpdir() echo /tmp in openwrt is tmpfs. on low RAM systems there may be not enough RAM to store downloaded files echo default tmpfs has size of 50% RAM echo "RAM : $(get_ram_mb) Mb" - echo "DISK : $(get_free_space_mb) Mb" + echo "DISK : $(get_free_space_mb "$EXEDIR/tmp") Mb" echo select temp file location [ -z "$TMPDIR" ] && TMPDIR=/tmp ask_list TMPDIR "/tmp $EXEDIR/tmp" && { diff --git a/nfq2/darkmagic.c b/nfq2/darkmagic.c index 612be1f..b8b2d68 100644 --- a/nfq2/darkmagic.c +++ b/nfq2/darkmagic.c @@ -2027,7 +2027,7 @@ bool make_writeable_dir() char testfile[PATH_MAX]; snprintf(testfile,sizeof(testfile),"%s/test_XXXXXX",wrdir); int fd = mkstemp(testfile); - if (fd>0) + if (fd>=0) { close(fd); unlink(testfile);