diff --git a/common/base.sh b/common/base.sh index 0381879..75cb3cb 100644 --- a/common/base.sh +++ b/common/base.sh @@ -262,6 +262,20 @@ replace_char() echo "$@" | tr $a $b } +random() +{ + # $1 - min, $2 - max + local r rs + if [ -c /dev/urandom ]; then + read rs \/ + #M=${M//\//\\\/} + M=$(echo $M | sed 's/\//\\\//g') + if [ -n "$M" ]; then + if contains "$M" " "; then + sedi -Ee "s/^#?$1=.*$/$1=\"$M\"/" "$ZAPRET_CONFIG" + else + sedi -Ee "s/^#?$1=.*$/$1=$M/" "$ZAPRET_CONFIG" + fi + else + # write with comment at the beginning + sedi -Ee "s/^#?$1=.*$/#$1=/" "$ZAPRET_CONFIG" + fi + else + # var does not exist in config. add it + if [ -n "$M" ]; then + echo "$1=$M" >>"$ZAPRET_CONFIG" + else + echo "#$1=$M" >>"$ZAPRET_CONFIG" + fi + fi +} + +check_prerequisites_linux() +{ + echo \* checking prerequisites + + local s cmd PKGS UTILS req="curl curl" + case "$FWTYPE" in + iptables) + req="$req iptables iptables ip6tables iptables ipset ipset" + ;; + nftables) + req="$req nft nftables" + ;; + esac + + PKGS=$(for s in $req; do echo $s; done | + while read cmd; do + read pkg + exists $cmd || echo $pkg + done | sort -u | xargs) + UTILS=$(for s in $req; do echo $s; done | + while read cmd; do + read pkg + echo $cmd + done | sort -u | xargs) + + if [ -z "$PKGS" ] ; then + echo required utilities exist : $UTILS + else + echo \* installing prerequisites + + echo packages required : $PKGS + + APTGET=$(whichq apt-get) + YUM=$(whichq yum) + PACMAN=$(whichq pacman) + ZYPPER=$(whichq zypper) + EOPKG=$(whichq eopkg) + APK=$(whichq apk) + if [ -x "$APTGET" ] ; then + "$APTGET" update + "$APTGET" install -y --no-install-recommends $PKGS dnsutils || { + echo could not install prerequisites + exitp 6 + } + elif [ -x "$YUM" ] ; then + "$YUM" -y install $PKGS || { + echo could not install prerequisites + exitp 6 + } + elif [ -x "$PACMAN" ] ; then + "$PACMAN" -Syy + "$PACMAN" --noconfirm -S $PKGS || { + echo could not install prerequisites + exitp 6 + } + elif [ -x "$ZYPPER" ] ; then + "$ZYPPER" --non-interactive install $PKGS || { + echo could not install prerequisites + exitp 6 + } + elif [ -x "$EOPKG" ] ; then + "$EOPKG" -y install $PKGS || { + echo could not install prerequisites + exitp 6 + } + elif [ -x "$APK" ] ; then + "$APK" update + # for alpine + [ "$FWTYPE" = iptables ] && [ -n "$($APK list ip6tables)" ] && PKGS="$PKGS ip6tables" + "$APK" add $PKGS || { + echo could not install prerequisites + exitp 6 + } + else + echo supported package manager not found + echo you must manually install : $UTILS + exitp 5 + fi + fi +} + +check_prerequisites_openwrt() +{ + echo \* checking prerequisites + + local PKGS="curl" UPD=0 + + case "$FWTYPE" in + iptables) + PKGS="$PKGS ipset iptables iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra" + [ "$DISABLE_IPV6" != "1" ] && PKGS="$PKGS ip6tables ip6tables-mod-nat ip6tables-extra" + ;; + nftables) + PKGS="$PKGS nftables kmod-nft-nat kmod-nft-offload kmod-nft-queue" + ;; + esac + + if check_packages_openwrt $PKGS ; then + echo everything is present + else + echo \* installing prerequisites + + opkg update + UPD=1 + opkg install $PKGS || { + echo could not install prerequisites + exitp 6 + } + fi + + is_linked_to_busybox gzip && { + echo + echo your system uses default busybox gzip. its several times slower than GNU gzip. + echo ip/host list scripts will run much faster with GNU gzip + echo installer can install GNU gzip but it requires about 100 Kb space + if ask_yes_no N "do you want to install GNU gzip"; then + [ "$UPD" = "0" ] && { + opkg update + UPD=1 + } + opkg install --force-overwrite gzip + fi + } + is_linked_to_busybox sort && { + echo + echo your system uses default busybox sort. its much slower and consumes much more RAM than GNU sort + echo ip/host list scripts will run much faster with GNU sort + echo installer can install GNU sort but it requires about 100 Kb space + if ask_yes_no N "do you want to install GNU sort"; then + [ "$UPD" = "0" ] && { + opkg update + UPD=1 + } + opkg install --force-overwrite coreutils-sort + fi + } + [ "$FSLEEP" = 0 ] && is_linked_to_busybox sleep && { + echo + echo no methods of sub-second sleep were found. + echo if you want to speed up blockcheck install coreutils-sleep. it requires about 40 Kb space + if ask_yes_no N "do you want to install COREUTILS sleep"; then + [ "$UPD" = "0" ] && { + opkg update + UPD=1 + } + opkg install --force-overwrite coreutils-sleep + fsleep_setup + fi + } +} diff --git a/docs/quick_start.txt b/docs/quick_start.txt index 9259a86..3df1a9a 100644 --- a/docs/quick_start.txt +++ b/docs/quick_start.txt @@ -32,27 +32,19 @@ zapret дополнительные пакеты в сжатый образ squa 4) Если вы работаете в виртуальной машине, необходимо использовать соединение с сетью в режиме bridge. nat не подходит -5) Запустите install_bin.sh (1 раз для настройки бинариков правильной архитектуры) +5) Выполните однократные действия по установке требуемых пакетов в ОС и настройке бинариков правильной архитектуры -6) На чистой openwrt потребуются дополнительные пакеты. -opkg update -opkg install curl -Требуемые пакеты для iptables : -opkg install iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra -Требуемые пакеты для iptables ipv6 : -opkg install ip6tables-mod-nat ip6tables-extra -Требуемые пакеты для nftables (с версии 22.03 openwrt перешел на nftables по умолчанию) : -opkg install nftables kmod-nft-nat kmod-nft-queue +install_bin.sh +install_prepreq.sh -Другой вариант : запустите install_easy.sh, после установки pre-реквизитов откажитесь через ctrl+c. -Это надо сделать 1 раз. Без дополнительных пакетов blockcheck.sh не сработает. Сам он ничего -не будет устанавливать. +Вас могут спросить о типе фаервола (iptables/nftables) и использовании ipv6. Это нужно для установки +правильных пакетов в ОС, чтобы не устанавливать лишнее. -7) Запустите blockcheck.sh. blockcheck позволяет выявить рабочую стратегию обхода блокировок +6) Запустите blockcheck.sh. blockcheck позволяет выявить рабочую стратегию обхода блокировок По результатам blockcheck нужно понять какой вариант будете использовать : nfqws или tpws И запомнить найденные стратегии. -8) blockcheck.sh в начале проверяет DNS. Если выводятся сообщения о подмене адресов, то +7) blockcheck.sh в начале проверяет DNS. Если выводятся сообщения о подмене адресов, то первым делом нужно решить эту проблему, иначе ничего не будет работать. Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо заменой DNS серверов от провайдера на публичные (1.1.1.1, 8.8.8.8), либо в случае перехвата провайдером обращений @@ -87,7 +79,7 @@ config interface 'wan' Если это не подходит, можно перенаправлять обращения на udp и tcp порты 53 вашего DNS сервера на 77.88.8.88:1253 средствами iptables/nftables. В /etc/resolv.conf нельзя прописать DNS на нестандартном порту. -9) Запустите install_easy.sh. +8) Запустите install_easy.sh. Выберите nfqws или tpws, затем согласитесь на редактирование параметров. Откроется редактор, куда впишите найденные стратегии. Для nfqws отдельно настраиваются стратегии на http и https для ipv4 и ipv6. @@ -116,9 +108,9 @@ NFQWS_OPT_DESYNC_HTTP и NFQWS_OPT_DESYNC_HTTPS заменяют стратег zapret не может пробить блокировку по IP адресу Для проверки нескольких доменов вводите их через пробел. -10) На все остальные вопросы install_easy.sh отвечайте согласно выводимой аннонтации. +9) На все остальные вопросы install_easy.sh отвечайте согласно выводимой аннонтации. -11) Если ломаются отдельные незаблокированные ресурсы, следует вносить их в исключения, либо пользоваться ограничивающим +10) Если ломаются отдельные незаблокированные ресурсы, следует вносить их в исключения, либо пользоваться ограничивающим ipset или хост листом. Читайте основной толмуд readme.txt ради подробностей. Это минимальная инструкция, чтобы соориентироваться с чего начать. diff --git a/install_easy.sh b/install_easy.sh index 6ee2ef1..247977b 100755 --- a/install_easy.sh +++ b/install_easy.sh @@ -27,31 +27,6 @@ GET_LIST="$IPSET_DIR/get_config.sh" MD5=md5sum exists $MD5 || MD5=md5 -sedi() -{ - # MacOS doesnt support -i without parameter. busybox doesnt support -i with parameter. - # its not possible to put "sed -i ''" to a variable and then use it - if [ "$SYSTEM" = "macos" ]; then - sed -i '' "$@" - else - sed -i "$@" - fi -} - -random() -{ - # $1 - min, $2 - max - local r rs - if [ -c /dev/urandom ]; then - read rs \/ - #M=${M//\//\\\/} - M=$(echo $M | sed 's/\//\\\//g') - if [ -n "$M" ]; then - if contains "$M" " "; then - sedi -Ee "s/^#?$1=.*$/$1=\"$M\"/" "$ZAPRET_CONFIG" - else - sedi -Ee "s/^#?$1=.*$/$1=$M/" "$ZAPRET_CONFIG" - fi - else - # write with comment at the beginning - sedi -Ee "s/^#?$1=.*$/#$1=/" "$ZAPRET_CONFIG" - fi - else - # var does not exist in config. add it - if [ -n "$M" ]; then - echo "$1=$M" >>"$ZAPRET_CONFIG" - else - echo "#$1=$M" >>"$ZAPRET_CONFIG" - fi - fi -} - select_mode_mode() { local edited v vars MODES="tpws tpws-socks nfqws filter custom" @@ -585,88 +530,6 @@ check_location() } -check_prerequisites_linux() -{ - echo \* checking prerequisites - - local s cmd PKGS UTILS req="curl curl" - case "$FWTYPE" in - iptables) - req="$req iptables iptables ip6tables iptables ipset ipset" - ;; - nftables) - req="$req nft nftables" - ;; - esac - - PKGS=$(for s in $req; do echo $s; done | - while read cmd; do - read pkg - exists $cmd || echo $pkg - done | sort -u | xargs) - UTILS=$(for s in $req; do echo $s; done | - while read cmd; do - read pkg - echo $cmd - done | sort -u | xargs) - - if [ -z "$PKGS" ] ; then - echo required utilities exist : $UTILS - else - echo \* installing prerequisites - - echo packages required : $PKGS - - APTGET=$(whichq apt-get) - YUM=$(whichq yum) - PACMAN=$(whichq pacman) - ZYPPER=$(whichq zypper) - EOPKG=$(whichq eopkg) - APK=$(whichq apk) - if [ -x "$APTGET" ] ; then - "$APTGET" update - "$APTGET" install -y --no-install-recommends $PKGS dnsutils || { - echo could not install prerequisites - exitp 6 - } - elif [ -x "$YUM" ] ; then - "$YUM" -y install $PKGS || { - echo could not install prerequisites - exitp 6 - } - elif [ -x "$PACMAN" ] ; then - "$PACMAN" -Syy - "$PACMAN" --noconfirm -S $PKGS || { - echo could not install prerequisites - exitp 6 - } - elif [ -x "$ZYPPER" ] ; then - "$ZYPPER" --non-interactive install $PKGS || { - echo could not install prerequisites - exitp 6 - } - elif [ -x "$EOPKG" ] ; then - "$EOPKG" -y install $PKGS || { - echo could not install prerequisites - exitp 6 - } - elif [ -x "$APK" ] ; then - "$APK" update - # for alpine - [ "$FWTYPE" = iptables ] && [ -n "$($APK list ip6tables)" ] && PKGS="$PKGS ip6tables" - "$APK" add $PKGS || { - echo could not install prerequisites - exitp 6 - } - else - echo supported package manager not found - echo you must manually install : $UTILS - exitp 5 - fi - fi -} - - service_install_systemd() { echo \* installing zapret service @@ -829,76 +692,6 @@ install_linux() } -check_prerequisites_openwrt() -{ - echo \* checking prerequisites - - local PKGS="curl" UPD=0 - - case "$FWTYPE" in - iptables) - PKGS="$PKGS ipset iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra" - [ "$DISABLE_IPV6" != "1" ] && PKGS="$PKGS ip6tables-mod-nat ip6tables-extra" - ;; - nftables) - PKGS="$PKGS nftables kmod-nft-nat kmod-nft-offload kmod-nft-queue" - ;; - esac - - if check_packages_openwrt $PKGS ; then - echo everything is present - else - echo \* installing prerequisites - - opkg update - UPD=1 - opkg install $PKGS || { - echo could not install prerequisites - exitp 6 - } - fi - - is_linked_to_busybox gzip && { - echo - echo your system uses default busybox gzip. its several times slower than GNU gzip. - echo ip/host list scripts will run much faster with GNU gzip - echo installer can install GNU gzip but it requires about 100 Kb space - if ask_yes_no N "do you want to install GNU gzip"; then - [ "$UPD" = "0" ] && { - opkg update - UPD=1 - } - opkg install --force-overwrite gzip - fi - } - is_linked_to_busybox sort && { - echo - echo your system uses default busybox sort. its much slower and consumes much more RAM than GNU sort - echo ip/host list scripts will run much faster with GNU sort - echo installer can install GNU sort but it requires about 100 Kb space - if ask_yes_no N "do you want to install GNU sort"; then - [ "$UPD" = "0" ] && { - opkg update - UPD=1 - } - opkg install --force-overwrite coreutils-sort - fi - } - [ "$FSLEEP" = 0 ] && is_linked_to_busybox sleep && { - echo - echo no methods of sub-second sleep were found. - echo if you want to speed up blockcheck install coreutils-sleep. it requires about 40 Kb space - if ask_yes_no N "do you want to install COREUTILS sleep"; then - [ "$UPD" = "0" ] && { - opkg update - UPD=1 - } - opkg install --force-overwrite coreutils-sleep - fsleep_setup - fi - } -} - deoffload_openwrt_firewall() { echo \* checking flow offloading diff --git a/install_prereq.sh b/install_prereq.sh new file mode 100755 index 0000000..a4ae4d5 --- /dev/null +++ b/install_prereq.sh @@ -0,0 +1,75 @@ +#!/bin/sh + +# install prerequisites + +EXEDIR="$(dirname "$0")" +EXEDIR="$(cd "$EXEDIR"; pwd)" +ZAPRET_CONFIG="$EXEDIR/config" +ZAPRET_BASE="$EXEDIR" + +. "$ZAPRET_CONFIG" +. "$ZAPRET_BASE/common/base.sh" +. "$ZAPRET_BASE/common/elevate.sh" +. "$ZAPRET_BASE/common/fwtype.sh" +. "$ZAPRET_BASE/common/dialog.sh" +. "$ZAPRET_BASE/common/installer.sh" +. "$ZAPRET_BASE/common/ipt.sh" + +select_ipv6() +{ + local T=N + + [ "$DISABLE_IPV6" != '1' ] && T=Y + local old6=$DISABLE_IPV6 + echo + if ask_yes_no $T "enable ipv6 support"; then + DISABLE_IPV6=0 + else + DISABLE_IPV6=1 + fi + [ "$old6" != "$DISABLE_IPV6" ] && write_config_var DISABLE_IPV6 +} +select_fwtype() +{ + echo + [ $(get_ram_mb) -le 400 ] && { + echo WARNING ! you are running a low RAM system + echo WARNING ! nft requires lots of RAM to load huge ip sets, much more than ipsets require + 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_config() +{ + [ "$SYSTEM" = openwrt ] && select_ipv6 + select_fwtype +} + + +# build binaries, do not use precompiled +[ "$1" = "make" ] && FORCE_BUILD=1 + +umask 0022 +fsleep_setup +fix_sbin_path +check_system +require_root +ask_config + +case $UNAME in + Linux) + case $SYSTEM in + openwrt) + check_prerequisites_openwrt + ;; + *) + check_prerequisites_linux + ;; + esac + ;; +esac + + +exitp 0