From 5cdf6b346964f697fd0f472b8bdf4f8b3f20d840 Mon Sep 17 00:00:00 2001 From: bolvan Date: Mon, 6 May 2019 16:02:22 +0300 Subject: [PATCH] separate config from init script --- config | 27 +++++ changes.txt => docs/changes.txt | 0 https.txt => docs/https.txt | 0 iptables.txt => docs/iptables.txt | 0 readme.txt => docs/readme.txt | 56 +++++---- .../wireguard}/010-wg-mod.patch | 0 .../wireguard}/wireguard-mod.txt | 0 .../wireguard}/wireguard_iproute_openwrt.txt | 0 init.d/openwrt/zapret | 43 +------ init.d/sysv/zapret | 45 +------ install_bin.sh | 55 +++++---- install_easy.sh | 111 +++++++++++++----- 12 files changed, 183 insertions(+), 154 deletions(-) create mode 100644 config rename changes.txt => docs/changes.txt (100%) rename https.txt => docs/https.txt (100%) rename iptables.txt => docs/iptables.txt (100%) rename readme.txt => docs/readme.txt (93%) rename {wireguard => docs/wireguard}/010-wg-mod.patch (100%) rename {wireguard => docs/wireguard}/wireguard-mod.txt (100%) rename {wireguard => docs/wireguard}/wireguard_iproute_openwrt.txt (100%) diff --git a/config b/config new file mode 100644 index 0000000..20a92a9 --- /dev/null +++ b/config @@ -0,0 +1,27 @@ +# this file is included from init scripts +# change values here + +# CHOOSE OPERATION MODE +# use nfqws : nfqws_ipset nfqws_ipset_https nfqws_all nfqws_all_https +# use tpws : tpws_ipset tpws_ipset_https tpws_all tpws_all_https tpws_hostlist +# no daemon, just ipset : ipset +# custom mode : custom . should modify init script and add your own code +MODE=tpws_ipset_https + +# CHOOSE NFQWS DAEMON OPTIONS. run "nfq/nfqws --help" for option list +NFQWS_OPT="--wsize=3 --hostspell=HOST" + +# CHOOSE TPWS DAEMON OPTIONS. run "tpws/tpws --help" for option list +TPWS_OPT_HTTP="--hostspell=HOST --split-http-req=method" +TPWS_OPT_HTTPS="--split-pos=3" + +# for routers based on desktop linux only. has not effect in openwrt. +# CHOSE NETWORK INTERFACE BEHIND NAT (LAN) +# or leave it commented if its not router +#SLAVE_ETH=eth0 + + +# for install_easy select which init script will be used to get ip or host list +# possible value : get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh get_hostlist.sh +# comment if not required +GETLIST="get_antizapret.sh" diff --git a/changes.txt b/docs/changes.txt similarity index 100% rename from changes.txt rename to docs/changes.txt diff --git a/https.txt b/docs/https.txt similarity index 100% rename from https.txt rename to docs/https.txt diff --git a/iptables.txt b/docs/iptables.txt similarity index 100% rename from iptables.txt rename to docs/iptables.txt diff --git a/readme.txt b/docs/readme.txt similarity index 93% rename from readme.txt rename to docs/readme.txt index 453fa62..63302d5 100644 --- a/readme.txt +++ b/docs/readme.txt @@ -199,15 +199,15 @@ tpws должен запускаться без фильтрации по ipset. Например : 8.8.8.8, 8.8.4.4, 1.1.1.1, 1.0.0.1, 9.9.9.9 Если DNS подменяется и провайдер перехватывает обращения к сторонним DNS, настройте dnscrypt. -Проанализируйте какие методы дурения DPI работают, в соответствии с ними настройте init скрипт. +Проанализируйте какие методы дурения DPI работают, в соответствии с ними настройте /opt/zapret/config. -Выбор режима в init скрипте ---------------------------- -После установки init скрипта на систему (индивидуально для разных ОС) нужно его настроить. +Выбор параметров +---------------- -Отредактируйте /etc/init.d/zapret. -Выберите MODE. Снимите комментарий только с одного из присваиваний. +Файл /opt/zapret/config используется различными компонентами системы и содержит основные настройки. +Его нужно просмотреть и при необходимости отредактировать. +Выберите MODE : nfqws_ipset - использовать nfqws для модификации трафика на порт 80 только на IP из ipset "zapret" nfqws_ipset_https - использовать nfqws для модификации трафика на порты 80 и 443 только на IP из ipset "zapret" @@ -219,7 +219,7 @@ tpws_all - использовать tpws для модификации траф tpws_all_https - использовать tpws для модификации трафика на порты 80 и 443 для всех IP tpws_hostlist - пропускать через tpws весь трафик на порт 80. tpws применяет дурение только к хостам из hostlist. ipset - только заполнить ipset. ipset может быть применен для заворота трафика на прокси или на VPN -custom - нужно самому запрограммировать запуск демонов и правила iptables +custom - нужно самому запрограммировать запуск демонов в init скрипте и правила iptables Можно изменить опции дурения, применяемые демонами nfqws и tpws : @@ -227,6 +227,13 @@ NFQWS_OPT="--wsize=3 --hostspell=HOST" TPWS_OPT_HTTP="--hostspell=HOST --split-http-req=method" TPWS_OPT_HTTPS="--split-pos=3" +Если ваша система не openwrt и работает как роутер, то нужно раскомментировать параметр SLAVE_ETH и вписать в него +название внутреннего сетевого интерфейса (LAN). + +Параметр GETLIST указывает инсталятору install_easy.sh какой скрипт дергать +для обновления списка заблокированных ip или хостов. + + Пример установки на debian-подобную систему ------------------------------------------- @@ -250,9 +257,7 @@ TPWS_OPT_HTTPS="--split-pos=3" Скопировать скрипт запуска : cp /opt/zapret/init.d/sysv/zapret /etc/init.d -В /etc/init.d/zapret настроить параметры согласно разделу "Выбор режима в init скрипте". -Если ваша система - роутер, то раскомментировать параметр SLAVE_ETH и вписать в него -название внутреннего сетевого интерфейса (LAN). +Настроить параметры согласно разделу "Выбор параметров". Принять изменения скрипта в systemd : systemctl daemon-reload @@ -260,7 +265,7 @@ TPWS_OPT_HTTPS="--split-pos=3" Включить автозапуск службы : systemctl enable zapret -В зависимости от выбранного в init скрипте MODE : +В зависимости от выбранного MODE : MODE содержит "ipset" : Удалить старые ip листы, если они были созданы ранее : @@ -361,8 +366,13 @@ OpenSUSE # /opt/zapret/uninstall_easy.sh # rm -r /opt/zapret -Скрипты простой установки могут быть удобны и для нечайников для первоначальной установки, -после которой можно поправить настройки вручную. Так устанавливать быстрее. +Это самый необходимый миниум действий. +Если zapret уже куда-то был скачан, то можно запустить install_easy.sh прямо оттуда. +Инсталятор сам запросит рута, скопирует файлы куда надо. +Можно даже запускать инсталятор из "проводника" через функцию "запустить в терминале", если +"проводник" такое позволяет. + +Для более гибкой настройки перед запуском инсталятора следует выполнить раздел "Выбор параметров". Эти скрипты будут работать и на других системах на базе systemd при условии, что systemd собран с поддержкой sysvinit и имеется следующий файл : @@ -428,9 +438,9 @@ ipset можно выкинуть, если не будем пользовать Скопировать скрипт запуска : cp /opt/zapret/init.d/openwrt/zapret /etc/init.d -В /etc/init.d/zapret настроить параметры согласно разделу "Выбор режима в init скрипте". +Настроить параметры согласно разделу "Выбор параметров". -В зависимости от выбранного в init скрипте MODE : +В зависимости от выбранного MODE : MODE содержит "ipset" : Удалить старые ip листы, если они были созданы ранее : @@ -493,9 +503,12 @@ MODE=custom ЕСЛИ ВСЕ ПЛОХО С МЕСТОМ : тогда берите SDK и собирайте динамические бинарики. они весят меньше. откажитесь от работы со списком РКН. используйте только get_user.sh -ЕСЛИ СОВСЕМ ВСЕ УЖАСНО С МЕСТОМ : не надо устанавливать дополнительные пакеты через opkg. оставьте лишь один tpws -и init скрипт, в firewall.user перенаправляйте весь трафик на порт 80 на tpws. такой вариант потребует менее 100 кб места -и полностью статичен. отсутствуют любые загрузки, обновления, изменения файлов. +ЕСЛИ СОВСЕМ ВСЕ УЖАСНО С МЕСТОМ : не надо устанавливать дополнительные пакеты через opkg. +оставьте лишь /opt/zapret/tpws/tpws, /opt/zapret/config, /etc/init.d/zapret, /etc/firewall.zapret +используйте MODE=tpws_all или tpws_all_https +такой вариант потребует около 100 кб места и полностью статичен. +отсутствуют любые загрузки, обновления, изменения файлов. +tpws без ipset использует всего лишь DNAT, который есть по умолчанию СОВЕТ : Покупайте только роутеры с USB. В USB можно воткнуть флэшку и вынести на нее корневую файловую систему или использовать ее в качестве оверлея. Не надо мучать себя, запихивая незапихиваемое в 8 мб встроенной флэшки. @@ -507,7 +520,7 @@ MODE=custom Работает только если у вас на роутере достаточно много места. Схема примерно такая же, как и на десктопе. Помещаем на роутер /opt/zapret, -запускаем install_easy.sh +выполняем раздел "Выбор параметров", запускаем install_easy.sh Если места достаточно, можно прямо на роутер установить git и скачать с github : @@ -527,8 +540,9 @@ init.d/openwrt ipset/* binaries/<ваша архитектура>/{tpws,nfqws,ip2net,mdig} -Чтобы сменить MODE, перед установкой можно отредактировать /opt/zapret/init.d/openwrt/zapret, изменить MODE там -и согласиться на перезапись init скрипта. По умолчанию используется MODE=tpws_ipset_https. +Если вы закачаете zapret не в /opt/zapret, а, например, в /tmp, и запустите install_easy.sh оттуда, +то инсталятор сам скопирует только необходимый минимум в /opt/zapret. + Другие прошивки --------------- diff --git a/wireguard/010-wg-mod.patch b/docs/wireguard/010-wg-mod.patch similarity index 100% rename from wireguard/010-wg-mod.patch rename to docs/wireguard/010-wg-mod.patch diff --git a/wireguard/wireguard-mod.txt b/docs/wireguard/wireguard-mod.txt similarity index 100% rename from wireguard/wireguard-mod.txt rename to docs/wireguard/wireguard-mod.txt diff --git a/wireguard/wireguard_iproute_openwrt.txt b/docs/wireguard/wireguard_iproute_openwrt.txt similarity index 100% rename from wireguard/wireguard_iproute_openwrt.txt rename to docs/wireguard/wireguard_iproute_openwrt.txt diff --git a/init.d/openwrt/zapret b/init.d/openwrt/zapret index b0d12ab..aa9a813 100755 --- a/init.d/openwrt/zapret +++ b/init.d/openwrt/zapret @@ -1,51 +1,16 @@ #!/bin/sh /etc/rc.common -# Copyright (C) 2006-2011 OpenWrt.org USE_PROCD=1 # start betfore firewall - we need ipset populated START=18 +ZAPRET_BASE=/opt/zapret +# SHOULD EDIT config +. "$ZAPRET_BASE/config" -# +++ REVIEW CONFIG HERE +++ - -# CHOOSE OPERATION MODE -# leave only one MODE= uncommented - -# using nfqws with ipset -#MODE=nfqws_ipset -#MODE=nfqws_ipset_https -# using nfqws for all -#MODE=nfqws_all -#MODE=nfqws_all_https -# CHOOSE NFQWS DAEMON OPTIONS. run "nfq/nfqws --help" for option list -NFQWS_OPT="--wsize=3 --hostspell=HOST" - -# using tpws with ipset -#MODE=tpws_ipset -MODE=tpws_ipset_https -# using tpws for all -#MODE=tpws_all -#MODE=tpws_all_https -# using tpws with hostlist -#MODE=tpws_hostlist -# CHOOSE TPWS DAEMON OPTIONS. run "tpws/tpws --help" for option list -TPWS_OPT_HTTP="--hostspell=HOST --split-http-req=method" -TPWS_OPT_HTTPS="--split-pos=3" - -# only fill ipset, do not run daemons -#MODE=ipset - -# Custom mode -# Find out what works for you and modify "# PLACEHOLDER" parts of this script -#MODE=custom - -# --- REVIEW CONFIG HERE --- - -# !!!!! in openwrt you need to add firewall rules manually to /etc/firewall.user - +# !!!!! in openwrt firewall rules are configured separately PIDDIR=/var/run -ZAPRET_BASE=/opt/zapret IPSET_CR=$ZAPRET_BASE/ipset/create_ipset.sh QNUM=200 diff --git a/init.d/sysv/zapret b/init.d/sysv/zapret index 6facc50..fe42c09 100755 --- a/init.d/sysv/zapret +++ b/init.d/sysv/zapret @@ -10,53 +10,14 @@ # Default-Stop: 0 1 6 ### END INIT INFO - -# +++ REVIEW CONFIG HERE +++ - -# CHOOSE OPERATION MODE -# leave only one MODE= uncommented - -# using nfqws with ipset -#MODE=nfqws_ipset -#MODE=nfqws_ipset_https -# using nfqws for all -#MODE=nfqws_all -#MODE=nfqws_all_https -# CHOOSE NFQWS DAEMON OPTIONS. run "nfq/nfqws --help" for option list -NFQWS_OPT="--wsize=3 --hostspell=HOST" - -# using tpws with ipset -#MODE=tpws_ipset -MODE=tpws_ipset_https -# using tpws for all -#MODE=tpws_all -#MODE=tpws_all_https -# using tpws with hostlist -#MODE=tpws_hostlist -# CHOOSE TPWS DAEMON OPTIONS. run "tpws/tpws --help" for option list -TPWS_OPT_HTTP="--hostspell=HOST --split-http-req=method" -TPWS_OPT_HTTPS="--split-pos=3" - -# only fill ipset, do not run daemons -#MODE=ipset - -# Custom mode -# Find out what works for you and modify "# PLACEHOLDER" parts of this script -#MODE=custom - -# router only: CHOSE NETWORK INTERFACE BEHIND NAT (LAN) -# or leave it commented if its not router -#SLAVE_ETH=eth0 - -# --- REVIEW CONFIG HERE --- - - +ZAPRET_BASE=/opt/zapret +# SHOULD EDIT config +. "$ZAPRET_BASE/config" NAME=zapret DESC=anti-zapret PIDDIR=/var/run -ZAPRET_BASE=/opt/zapret IPSET_CR=$ZAPRET_BASE/ipset/create_ipset.sh QNUM=200 diff --git a/install_bin.sh b/install_bin.sh index 1db16e0..f9a4eae 100755 --- a/install_bin.sh +++ b/install_bin.sh @@ -7,31 +7,46 @@ BINDIR=$EXEDIR/$BINS check_dir() { - echo 0.0.0.0 | "$BINDIR/$1/ip2net" 1>/dev/null 2>/dev/null + echo 0.0.0.0 | "$BINDIR/$1/ip2net" 1>/dev/null 2>/dev/null } # link or copy executables. uncomment either ln or cp, comment other ccp() { - local F=$(basename $1) - [ -d "$EXEDIR/$2" ] || mkdir "$EXEDIR/$2" - [ -f "$EXEDIR/$2/$F" ] && rm -f "$EXEDIR/$2/$F" - ln -fs "../$BINS/$1" "$EXEDIR/$2" && echo linking : "../$BINS/$1" =\> "$EXEDIR/$2" - #cp -f "$BINDIR/$1" "$EXEDIR/$2" && echo copying : "$BINDIR/$1" =\> "$EXEDIR/$2" + local F=$(basename $1) + [ -d "$EXEDIR/$2" ] || mkdir "$EXEDIR/$2" + [ -f "$EXEDIR/$2/$F" ] && rm -f "$EXEDIR/$2/$F" + ln -fs "../$BINS/$1" "$EXEDIR/$2" && echo linking : "../$BINS/$1" =\> "$EXEDIR/$2" + #cp -f "$BINDIR/$1" "$EXEDIR/$2" && echo copying : "$BINDIR/$1" =\> "$EXEDIR/$2" } -for arch in aarch64 armhf mips64r2-msb mips32r1-lsb mips32r1-msb ppc x86_64 x86 -do - if check_dir $arch; then - echo $arch is OK - echo installing binaries ... - ccp $arch/ip2net ip2net - ccp $arch/mdig mdig - ccp $arch/nfqws nfq - ccp $arch/tpws tpws - break - else - echo $arch is NOT OK - fi -done +ARCHLIST="aarch64 armhf mips64r2-msb mips32r1-lsb mips32r1-msb ppc x86_64 x86" +if [ "$1" == "getarch" ]; then + for arch in $ARCHLIST + do + if check_dir $arch; then + echo $arch + true + return + fi + done +else + for arch in $ARCHLIST + do + if check_dir $arch; then + echo $arch is OK + echo installing binaries ... + ccp $arch/ip2net ip2net + ccp $arch/mdig mdig + ccp $arch/nfqws nfq + ccp $arch/tpws tpws + true + return + else + echo $arch is NOT OK + fi + done +fi + +false diff --git a/install_easy.sh b/install_easy.sh index ea99cea..d6cc750 100755 --- a/install_easy.sh +++ b/install_easy.sh @@ -5,11 +5,15 @@ SCRIPT=$(readlink -f $0) EXEDIR=$(dirname $SCRIPT) ZAPRET_BASE=/opt/zapret +ZAPRET_CONFIG=$EXEDIR/config + +. "$ZAPRET_CONFIG" + SYSTEMD_SYSV_GENERATOR=/lib/systemd/system-generators/systemd-sysv-generator SYSTEMD_SYSV_GENERATOR2=/usr$SYSTEMD_SYSV_GENERATOR -GET_IPLIST=$EXEDIR/ipset/get_antizapret.sh -GET_IPLIST_PREFIX=/ipset/get_ +[ -n "$GETLIST" ] && GET_LIST="$EXEDIR/ipset/$GETLIST" +GET_LIST_PREFIX=/ipset/get_ exists() { @@ -46,6 +50,7 @@ md5file() md5sum "$1" | cut -f1 -d ' ' } + check_system() { echo \* checking system ... @@ -69,12 +74,53 @@ check_system() echo system is based on $SYSTEM } +call_install_bin() +{ + "$EXEDIR/install_bin.sh" $1 || { + echo binaries compatible with your system not found + exitp 8 + } +} + +install_binaries() +{ + echo \* installing binaries ... + + call_install_bin +} + +get_bin_arch() +{ + call_install_bin getarch +} + + +copy_all() +{ + cp -R "$1" "$2" +} +copy_minimal() +{ + local ARCH=$(get_bin_arch) + local BINDIR="$1/binaries/$ARCH" + + [ -d "$2" ] || mkdir -p "$2" + + mkdir "$2/tpws" "$2/nfq" "$2/ip2net" "$2/mdig" "$2/binaries" "$2/binaries/$ARCH" + cp -R "$1/ipset" "$2" + cp -R "$1/init.d" "$2" + cp "$1/install_easy.sh" "$1/uninstall_easy.sh" "$1/install_bin.sh" "$2" + cp "$BINDIR/tpws" "$BINDIR/nfqws" "$BINDIR/ip2net" "$BINDIR/mdig" "$2/binaries/$ARCH" +} + check_location() { + # $1 - copy function + echo \* checking location ... # use inodes in case something is linked - [ $(get_dir_inode "$EXEDIR") = $(get_dir_inode "$ZAPRET_BASE") ] || { + [ -d "$ZAPRET_BASE" ] && [ $(get_dir_inode "$EXEDIR") = $(get_dir_inode "$ZAPRET_BASE") ] || { echo easy install is supported only from default location : $ZAPRET_BASE echo currenlty its run from $EXEDIR echo -n "do you want the installer to copy it for you (Y/N) ? " @@ -91,7 +137,7 @@ check_location() exitp 3 fi fi - cp -R $EXEDIR $ZAPRET_BASE + $1 "$EXEDIR" "$ZAPRET_BASE" echo relaunching itself from $ZAPRET_BASE exec $ZAPRET_BASE/$(basename $0) else @@ -102,28 +148,24 @@ check_location() echo running from $EXEDIR } + crontab_add() { - echo \* adding crontab entry ... + [ -x "$GET_LIST" ] && { + echo \* adding crontab entry ... - CRONTMP=/tmp/cron.tmp - crontab -l >$CRONTMP - if grep -q "$GET_IPLIST_PREFIX" $CRONTMP; then - echo some entries already exist in crontab. check if this is corrent : - grep "$GET_IPLIST_PREFIX" $CRONTMP - else - echo "0 12 * * */2 $GET_IPLIST" >>$CRONTMP - crontab $CRONTMP - fi + CRONTMP=/tmp/cron.tmp + crontab -l >$CRONTMP + if grep -q "$GET_LIST_PREFIX" $CRONTMP; then + echo some entries already exist in crontab. check if this is corrent : + grep "$GET_LIST_PREFIX" $CRONTMP + else + echo "0 12 * * */2 $GET_LIST" >>$CRONTMP + crontab $CRONTMP + fi - rm -f $CRONTMP -} - -install_binaries() -{ - echo \* installing binaries ... - - "$EXEDIR/install_bin.sh" + rm -f $CRONTMP + } } check_preprequisites_linux() @@ -213,13 +255,18 @@ register_sysv_init_systemd() } } -download_ip_list() +download_list() { - echo \* downloading blocked ip list ... + [ -x "$GET_LIST" ] && { + echo \* downloading blocked ip/host list ... - "$GET_IPLIST" || { - echo could not download ip list - exitp 25 + rm -f "$EXEDIR/ipset/zapret-ip.txt" "$EXEDIR/ipset/zapret-ip-user.txt" \ + "$EXEDIR/ipset/zapret-ip-ipban.txt" "$EXEDIR/ipset/zapret-ip-user-ipban.txt" \ + "$EXEDIR/ipset/zapret-hosts.txt" + "$GET_LIST" || { + echo could not download ip list + exitp 25 + } } } @@ -238,11 +285,12 @@ install_systemd() INIT_SCRIPT_SRC=$EXEDIR/init.d/sysv/zapret INIT_SCRIPT=/etc/init.d/zapret + check_location copy_all check_preprequisites_linux install_binaries install_sysv_init register_sysv_init_systemd - download_ip_list + download_list crontab_add service_start_systemd } @@ -345,9 +393,8 @@ install_openwrt_firewall() { echo \* installing firewall script ... - local MODE=$(sed -nre 's/^MODE=([^[:space:]]+)/\1/p' "$INIT_SCRIPT" | tail -n 1) [ -n "MODE" ] || { - echo could not get MODE from $INIT_SCRIPT + echo should specify MODE in $ZAPRET_CONFIG exitp 7 } @@ -399,11 +446,12 @@ install_openwrt() FW_SCRIPT_SRC_DIR=$EXEDIR/init.d/openwrt/firewall.zapret OPENWRT_FW_INCLUDE=/etc/firewall.zapret + check_location copy_minimal check_preprequisites_openwrt install_binaries install_sysv_init register_sysv_init - download_ip_list + download_list crontab_add service_start_sysv install_openwrt_firewall @@ -413,7 +461,6 @@ install_openwrt() check_system -check_location case $SYSTEM in systemd)