├── .gitignore ├── Install ├── common │ ├── bird-bgp.conf │ ├── func.sh │ ├── user-isp.list │ └── user-vpn.list ├── double_vpn │ ├── add-bird4_routes.sh │ ├── bird-table.sh │ ├── bird.conf │ ├── user-vpn1.list │ └── user-vpn2.list ├── install_func.sh └── one_vpn │ ├── add-bird4_routes.sh │ ├── bird-table.sh │ └── bird.conf ├── README.md ├── install.sh ├── uninstall.sh └── update.sh /.gitignore: -------------------------------------------------------------------------------- 1 | lists/ 2 | scripts/ 3 | IPset4Static/ -------------------------------------------------------------------------------- /Install/common/bird-bgp.conf: -------------------------------------------------------------------------------- 1 | 2 | protocol bgp antifilter { 3 | local as 64999; 4 | neighbor BPGIPINPUT as BGPASINPUT; 5 | multihop; 6 | hold time 240; 7 | ipv4 { 8 | table route_vpn1; 9 | import all; 10 | export none; 11 | }; 12 | } -------------------------------------------------------------------------------- /Install/common/func.sh: -------------------------------------------------------------------------------- 1 | #SCRIPT VARIABLE 2 | SYSTEM_FOLDER=SYSTEMFOLDERINPUT 3 | BLACKLIST=$HOMEPATH/lists/antifilter.list 4 | ROUTE_FORCE_ISP=$SYSTEM_FOLDER/etc/bird4-force-isp.list 5 | ROUTE_FORCE_VPN1=$SYSTEM_FOLDER/etc/bird4-force-vpn1.list 6 | ROUTE_FORCE_VPN2=$SYSTEM_FOLDER/etc/bird4-force-vpn2.list 7 | ROUTE_BASE_VPN=$SYSTEM_FOLDER/etc/bird4-base-vpn.list 8 | ROUTE_USER_VPN=$SYSTEM_FOLDER/etc/bird4-user-vpn.list 9 | BIRD_CONF=$SYSTEM_FOLDER/etc/bird.conf 10 | VPNTXT=$HOMEPATH/lists/user-vpn.list 11 | VPN1TXT=$HOMEPATH/lists/user-vpn1.list 12 | VPN2TXT=$HOMEPATH/lists/user-vpn2.list 13 | ISPTXT=$HOMEPATH/lists/user-isp.list 14 | MD5_SUM=$HOMEPATH/scripts/sum.md5 15 | 16 | #INFO VARIABLE 17 | VERSION=VERSIONINPUT 18 | SCRIPT_FILE=SCRIPTSINPUT/add-bird4_routes.sh 19 | VCONF=CONFINPUT 20 | VHOMEPATH="$(awk -F= '/^HOMEPATH=/{print $2}' $SCRIPT_FILE)" 21 | VMODE=MODEINPUT 22 | VURLS="$(awk -F= '/^URLS=/{print $2}' $SCRIPT_FILE)" 23 | VBGP_IP=BPGIPINPUT && VBGP_AS=BGPASINPUT 24 | VISP="$(awk -F= '/^ISP=/{print $2}' $SCRIPT_FILE)" 25 | VISP_GW="$(awk -F= '/^ISP_GW=/{print $2}' $SCRIPT_FILE)" 26 | VVPN1="$(awk -F= '/^VPN1=/{print $2}' $SCRIPT_FILE)" 27 | VVPN2="$(awk -F= '/^VPN2=/{print $2}' $SCRIPT_FILE)" 28 | 29 | #GET INFO 30 | get_info_func() { 31 | if [[ "$1" == "-v" ]]; then 32 | echo "VERSION=$VERSION" 33 | echo "CONF=$VCONF" 34 | if [ $VCONF == 1 ]; then echo -e " Use one vpn\n ISP=$VISP VPN=$VVPN1"; else echo -e " Use double vpn\n ISP=$VISP VPN1=$VVPN1 VPN2=$VVPN2"; fi 35 | echo "MODE=$VMODE" 36 | if [ $VMODE == 1 ]; then echo -e " Download mode\n URLS=$VURLS"; 37 | elif [ $VMODE == 2 ]; then echo -e " BGP mode\n IP=$VBGP_IP AS=$VBGP_AS"; 38 | else echo " File mode" 39 | fi 40 | exit 41 | elif [[ "$1" == "-d" ]]; then DEBUG=1; fi 42 | } 43 | 44 | #INIT FILES FUNCTION 45 | init_files_func() { 46 | if [[ "$DEBUG" == 1 ]]; then echo -e "\n########### $(date) STEP_2: add init files ###########\n" >&2; fi 47 | for file in $@; do if [ ! -f $file ]; then touch $file; fi; done 48 | if [[ "$INIT" == "-i" ]]; then exit; fi 49 | } 50 | 51 | #WAIT DNS FUNCTION 52 | wait_dns_func() { 53 | if [[ "$DEBUG" == 1 ]]; then echo -e "\n########### $(date) STEP_1: wait dns ###########\n" >&2; fi 54 | until ADDRS=$(dig +short google.com @localhost -p 53) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done 55 | } 56 | 57 | #check VPN in bird config 58 | vpn_bird_func() { 59 | if [ "$(grep -c "ifname = \"$2\"; #MARK_VPN1" $1)" == 0 ]; then sed -i '/#MARK_VPN1/s/".*"/"'$2'"/' $1; fi 60 | if [ "$#" == 2 ]; then 61 | if [ "$(grep -c "interface \"$2\"" $1)" == 0 ]; then sed -i '/interface/s/".*"/"'$2'"/' $1; fi 62 | elif [ "$#" == 3 ]; then 63 | if [ "$(grep -c "interface \"$2\", \"$3\"" $1)" == 0 ]; then sed -i '/interface/s/".*", ".*"/"'$2'", "'$3'"/' $1; fi 64 | if [ "$(grep -c "ifname = \"$3\"; #MARK_VPN2" $1)" == 0 ]; then sed -i '/#MARK_VPN2/s/".*"/"'$3'"/' $1; fi 65 | fi 66 | } 67 | 68 | #CURL FUNCTION 69 | curl_funk() { 70 | for var in $@; do 71 | if [ $(echo "$var" | grep -cE '^(ht|f)t(p|ps)://') != 0 ]; then cur_url=$(echo "$cur_url $var"); else last=$var; fi 72 | done 73 | if [ "$(curl -sk $cur_url | grep -E '([0-9]{1,3}.){3}[0-9]{1,3}')" ]; then curl -sk $cur_url | sort ; else cat $last; fi 74 | } 75 | 76 | #DIFF FUNCTION 77 | diff_funk() { 78 | if [[ "$DEBUG" == 1 ]]; then 79 | patch_file=/tmp/patch_$(echo $1 | awk -F/ '{print $NF}') 80 | echo -e "\n########### $(date) STEP_3: diff $(echo $1 | awk -F/ '{print $NF}' ) ###########\n" >&2 81 | diff -u $1 $2 > $patch_file 82 | cat $patch_file && patch $1 $patch_file 83 | rm $patch_file 84 | else 85 | diff -u $1 $2 | patch $1 - 86 | fi 87 | } 88 | 89 | #GET AS LIST FUNCTION 90 | get_as_func() { 91 | as_list=$(awk '/^AS([0-9]{1,5})/{print $1}' "$1" | tr -d '\r') 92 | if [[ -n "$as_list" ]] ; then 93 | if [[ "$DEBUG" == 1 ]]; then echo -e "\n########### $(date) STEP_X: get as from file $(echo $1 | awk -F/ '{print $NF}' ) ###########\n" >&2; fi 94 | for cur_as in $as_list; do 95 | if [[ "$DEBUG" == 1 ]]; then out=2; echo -e "\n$cur_as" >&$out; fi 96 | for i in $out 1; do 97 | curl -sk https://stat.ripe.net/data/announced-prefixes/data.json?resource=$cur_as | awk -F '"' '/([0-9]{1,3}.){3}[0-9]{1,3}\/[0-9]{1,2}/{print $4}' | iprange - >&$i 98 | #whois -h whois.radb.net -- "-i origin $cur_as" | awk '/^route:/{print $2}' | iprange - >&$i 99 | #curl -sk https://api.bgpview.io/asn/$cur_as/prefixes 100 | done 101 | done 102 | awk '!/^AS([0-9]{1,5})/{print $0}' "$1" 103 | else 104 | cat $1 105 | fi 106 | } 107 | 108 | #IPRANGE FUNCTION 109 | ipr_func() { 110 | if [ $(echo "$1" | grep -cE '^([0-9]{1,3}.){3}[0-9]{1,3}$' ) != 0 ]; then cur_gw=$1 ; else cur_gw=\"$1\"; fi 111 | if [[ "$DEBUG" == 1 ]]; then ipr_verb="-v"; echo -e "\n########### $(date) STEP_4: ipr func file $(echo $2 | awk -F/ '{print $NF}' ) ###########\n" >&2; fi 112 | get_as_func "$2" | iprange $ipr_verb --print-prefix "route " --print-suffix-nets " via $cur_gw;" --print-suffix-ips "/32 via $cur_gw;" - 113 | } 114 | 115 | #RESTART BIRD FUNCTION 116 | restart_bird_func() { 117 | if [[ "$DEBUG" == 1 ]]; then echo -e "\n########### $(date) STEP_5: restart bird ###########\n" >&2; fi 118 | if [ "$(cat $MD5_SUM)" != "$(md5sum $SYSTEM_FOLDER/etc/bird*)" ]; then 119 | md5sum $SYSTEM_FOLDER/etc/bird* > $MD5_SUM 120 | echo "Restarting bird" 121 | killall -s SIGHUP bird 122 | fi 123 | } 124 | 125 | #CHECK DUPLICATE IN ROUTES FUNCTION 126 | check_dupl_func(){ 127 | dupl_route=$(sort -m $SYSTEM_FOLDER/etc/bird4-force*.list | awk '{print $2}' | uniq -d | grep -Fw -f - $SYSTEM_FOLDER/etc/bird4-force*.list) 128 | if [[ -n "$dupl_route" ]]; then 129 | echo "DUPLICATE IN FILES" 130 | echo $dupl_route | sed 's/; /;\n/g' - 131 | fi 132 | } 133 | -------------------------------------------------------------------------------- /Install/common/user-isp.list: -------------------------------------------------------------------------------- 1 | keenetic.com 2 | -------------------------------------------------------------------------------- /Install/common/user-vpn.list: -------------------------------------------------------------------------------- 1 | rezka.ag 2 | antifilter.download 3 | antifilter.network 4 | -------------------------------------------------------------------------------- /Install/double_vpn/add-bird4_routes.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | #USER VARIABLE 4 | ISP=ISPINPUT 5 | #ISP_GW=$(ip route | grep -m 1 -E "via.*$ISP" | awk '{print $3}') 6 | VPN1=VPN1INPUT 7 | VPN2=VPN2INPUT 8 | URLS="URLINPUT" 9 | 10 | #SCRIPT VARIABE 11 | HOMEPATH=HOMEFOLDERINPUT 12 | 13 | source $HOMEPATH/scripts/func.sh 14 | 15 | #GET INFO ABOUT SCRIPT 16 | get_info_func $1 17 | 18 | #INIT FILES 19 | WORK_FILES="$BLACKLIST \ 20 | $ROUTE_FORCE_ISP $ROUTE_FORCE_VPN1 $ROUTE_FORCE_VPN2 \ 21 | $ROUTE_BASE_VPN $ROUTE_USER_VPN \ 22 | $MD5_SUM" 23 | INIT=$1 24 | init_files_func $WORK_FILES 25 | 26 | #WAIT DNS 27 | wait_dns_func 28 | 29 | #CHECK AND REPLACE VPN IN BIRD CONF 30 | vpn_bird_func $BIRD_CONF $VPN1 $VPN2 31 | 32 | #BASE_LIST 33 | curl_funk $URLS $BLACKLIST | diff_funk $BLACKLIST - 34 | ipr_func lo $BLACKLIST | diff_funk $ROUTE_BASE_VPN - 35 | 36 | #BASE_USER_LIST 37 | ipr_func lo $VPNTXT | diff_funk $ROUTE_USER_VPN - 38 | 39 | #FORCE_LIST 40 | if [ ! -z "$ISP_GW" ]; then ISP=$ISP_GW; fi 41 | ipr_func $ISP $ISPTXT | diff_funk $ROUTE_FORCE_ISP - 42 | ipr_func $VPN1 $VPN1TXT | diff_funk $ROUTE_FORCE_VPN1 - 43 | ipr_func $VPN2 $VPN2TXT | diff_funk $ROUTE_FORCE_VPN2 - 44 | 45 | #RESTART BIRD 46 | restart_bird_func 47 | 48 | #CHECK DUPLICATE 49 | check_dupl_func 50 | -------------------------------------------------------------------------------- /Install/double_vpn/bird-table.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin 4 | 5 | start(){ 6 | if [ -z "$(ip rule | awk '/^30020/')" ]; then 7 | ip rule add table 1020 priority 30020 8 | fi 9 | if [ -z "$(ip rule | awk '/^30021/')" ]; then 10 | ip rule add table 1021 priority 30021 11 | fi 12 | if [ -z "$(ip rule | awk '/^30022/')" ]; then 13 | ip rule add table 1022 priority 30022 14 | fi 15 | } 16 | 17 | stop(){ 18 | if [ -n "$(ip rule | awk '/^30020/')" ]; then 19 | ip rule del table 1020 20 | fi 21 | if [ -n "$(ip rule | awk '/^30021/')" ]; then 22 | ip rule del table 1021 23 | fi 24 | if [ -n "$(ip rule | awk '/^30022/')" ]; then 25 | ip rule del table 1022 26 | fi 27 | } 28 | 29 | case "$1" in 30 | start) 31 | start 32 | ;; 33 | 34 | stop | kill) 35 | stop 36 | ;; 37 | 38 | restart) 39 | stop 40 | sleep 5 41 | start 42 | ;; 43 | *) 44 | echo "Usage: $0 {start|stop|kill|restart}" 45 | ;; 46 | esac 47 | -------------------------------------------------------------------------------- /Install/double_vpn/bird.conf: -------------------------------------------------------------------------------- 1 | log syslog all; 2 | log stderr all; 3 | 4 | router id IDINPUT; 5 | 6 | ipv4 table route_force; 7 | ipv4 table route_vpn1; 8 | ipv4 table route_vpn2; 9 | 10 | protocol direct { interface "VPN1INPUT", "VPN2INPUT"; } 11 | protocol device { scan time 15; } 12 | 13 | template kernel KERNEL_BASE { 14 | learn; 15 | scan time 60; 16 | ipv4 { import none; }; 17 | } 18 | 19 | filter pref_50_force { 20 | preference = 50; 21 | accept; 22 | } 23 | filter pref_100_vpn1 { 24 | ifname = "VPN1INPUT"; #MARK_VPN1 25 | preference = 100; 26 | accept; 27 | } 28 | filter pref_150_vpn2 { 29 | ifname = "VPN2INPUT"; #MARK_VPN2 30 | preference = 150; 31 | accept; 32 | } 33 | 34 | protocol kernel kernel_force from KERNEL_BASE { 35 | kernel table 1020; 36 | ipv4 { 37 | table route_force; 38 | export filter pref_50_force; 39 | }; 40 | } 41 | protocol kernel kernel_vpn1 from KERNEL_BASE { 42 | kernel table 1021; 43 | ipv4 { 44 | export filter pref_100_vpn1; 45 | table route_vpn1; 46 | }; 47 | } 48 | protocol kernel kernel_vpn2 from KERNEL_BASE { 49 | kernel table 1022; 50 | ipv4 { 51 | export filter pref_150_vpn2; 52 | table route_vpn2; 53 | }; 54 | } 55 | 56 | protocol static static_force { 57 | ipv4 { table route_force; }; 58 | include "bird4-force-isp.list"; 59 | include "bird4-force-vpn1.list"; 60 | include "bird4-force-vpn2.list"; 61 | } 62 | protocol static static_vpn1 { 63 | ipv4 { table route_vpn1; }; 64 | include "bird4-base-vpn.list"; 65 | include "bird4-user-vpn.list"; 66 | } 67 | 68 | protocol pipe pipe_vpn1_to_vpn2 { 69 | table route_vpn1; 70 | peer table route_vpn2; 71 | export all; 72 | import none; 73 | } 74 | -------------------------------------------------------------------------------- /Install/double_vpn/user-vpn1.list: -------------------------------------------------------------------------------- 1 | 2ip.ru 2 | -------------------------------------------------------------------------------- /Install/double_vpn/user-vpn2.list: -------------------------------------------------------------------------------- 1 | yoip.ru 2 | -------------------------------------------------------------------------------- /Install/install_func.sh: -------------------------------------------------------------------------------- 1 | install_packages_func(){ 2 | # Update busybox 3 | $SYSTEM_FOLDER/bin/opkg update 4 | $SYSTEM_FOLDER/bin/opkg upgrade busybox 5 | # Installing packages 6 | $SYSTEM_FOLDER/bin/opkg install bird2 bird2c curl cron bind-dig bind-libs iprange whois diffutils patch 7 | } 8 | 9 | # Create start folders 10 | create_folder_func(){ 11 | mkdir -p $SCRIPTS 12 | mkdir -p $LISTS 13 | } 14 | 15 | # Stop service if exist 16 | stop_func(){ 17 | # Stop and remove old bird if exist 18 | if [ -f "$SYSTEM_FOLDER/etc/init.d/S04bird1-ipv4" ]; then 19 | echo "Stop bird" 20 | $SYSTEM_FOLDER/etc/init.d/S04bird1-ipv4 stop 21 | $SYSTEM_FOLDER/bin/opkg --force-removal-of-dependent-packages remove bird1-ipv4 22 | rm $SYSTEM_FOLDER/etc/bird4.conf 23 | install_packages_func 24 | fi 25 | # Stop bird2 26 | if [ -f "$SYSTEM_FOLDER/etc/init.d/S70bird" ]; then 27 | echo "Stop bird2" 28 | $SYSTEM_FOLDER/etc/init.d/S70bird stop 29 | fi 30 | # Stop table service 31 | if [ -f "$SYSTEM_FOLDER/etc/init.d/S02bird-table" ]; then 32 | echo "Stop bird-table" 33 | $SYSTEM_FOLDER/etc/init.d/S02bird-table stop 34 | fi 35 | } 36 | 37 | # Print current configuration 38 | print_old_conf(){ 39 | if [ -f "$SCRIPTS/add-bird4_routes.sh" ]; then 40 | echo -e "\nYour current config is:" 41 | $SCRIPTS/add-bird4_routes.sh -v 42 | fi 43 | } 44 | 45 | # Try get old config 46 | get_old_config_func(){ 47 | if [ -f "$SCRIPTS/func.sh" ]; then 48 | source $SCRIPTS/func.sh 49 | if [ -n "$VCONF" ]; then CONF="$VCONF"; fi 50 | if [ -n "$VMODE" ]; then MODE="$VMODE"; fi 51 | if [ -n "$VURLS" ]; then FILTER="$(echo $VURLS | sed 's/"//g')"; fi 52 | if [ -n "$VBGP_IP" ]; then BGP_IP="$VBGP_IP"; fi 53 | if [ -n "$VBGP_AS" ]; then BGP_AS="$VBGP_AS"; fi 54 | if [ -n "$VISP" ]; then ISP="$VISP"; fi 55 | if [ -n "$VISP_GW" ]; then ISP_GW="$VISP_GW"; fi 56 | if [ -n "$VVPN1" ]; then VPN1="$VVPN1"; fi 57 | if [ -n "$VVPN2" ]; then VPN2="$VVPN2"; fi 58 | fi 59 | } 60 | 61 | # Select number vpn 62 | select_number_vpn_func(){ 63 | if [ -z "$CONF" ]; then 64 | echo -e "\nDo you want to use double vpn configuration? 1 - no (default) 2 - yes" 65 | read CONF 66 | fi 67 | if [ "$CONF" != "2" ]; then 68 | CONF=1 69 | CONFFOLDER="one_vpn" 70 | echo "You are select install for one vpn" 71 | else 72 | CONFFOLDER="double_vpn" 73 | echo "You are select install for double vpn" 74 | fi 75 | } 76 | 77 | # Filling script folders and custom sheets 78 | fill_folder_and_sed_func(){ 79 | cp $HOME_FOLDER/Install/common/*.sh $SCRIPTS 80 | cp $HOME_FOLDER/Install/$CONFFOLDER/*.sh $SCRIPTS 81 | chmod +x $SCRIPTS/*.sh 82 | if [ "$UPDATE" != "1" ]; then 83 | cp -i $HOME_FOLDER/Install/common/*.list $LISTS 84 | if [ "$CONF" == "2" ]; then cp -i $HOME_FOLDER/Install/$CONFFOLDER/*.list $LISTS; fi 85 | fi 86 | sed -i 's/VERSIONINPUT/'$VERSION_NEW'/; s/CONFINPUT/'$CONF'/; s/SCRIPTSINPUT/'$SCRIPTS_SED'/' $SCRIPTS/*.sh 87 | sed -i 's/HOMEFOLDERINPUT/'$HOME_FOLDER_SED'/; s/SYSTEMFOLDERINPUT/'$SYSTEM_FOLDER_SED'/' $SCRIPTS/*.sh 88 | if [ -n "$VISP_GW" ]; then sed -i 's/#ISP_GW=/ISP_GW=/' $SCRIPTS/*.sh; fi 89 | } 90 | 91 | # Copying the bird configuration file 92 | copy_bird_config_func(){ 93 | if [ ! -f "$SYSTEM_FOLDER/etc/bird.conf-opkg" ]; then 94 | mv $SYSTEM_FOLDER/etc/bird.conf $SYSTEM_FOLDER/etc/bird.conf-opkg; 95 | fi 96 | cp $HOME_FOLDER/Install/$CONFFOLDER/bird.conf $SYSTEM_FOLDER/etc/bird.conf 97 | } 98 | 99 | # Select mode 100 | select_mode_func(){ 101 | if [ -z "$MODE" ]; then 102 | echo -e "\nSelect mode: \n 1 - Download file from antifilter service (default) \n 2 - Use BGP \n 3 - Use Only user files" 103 | read MODE 104 | fi 105 | if [ "$MODE" == "2" ]; then 106 | echo "You are select 'BGP mode'" 107 | elif [ "$MODE" == "3" ]; then 108 | echo "You are select 'File mode'" 109 | else 110 | MODE=1 111 | echo "You are select 'Download mode'" 112 | fi 113 | sed -i 's/MODEINPUT/'$MODE'/' $SCRIPTS/*.sh 114 | } 115 | 116 | # Download mode 117 | configure_download_mode_func(){ 118 | if [ -z "$FILTER" ]; then 119 | echo -e "\nWhich service do you want to use\n 1 - https://antifilter.download/list/allyouneed.lst\n 2 - https://antifilter.network/download/ipsmart.lst\n or enter custom url" 120 | read FILTER 121 | if [ "$FILTER" == "1" ]; then 122 | FILTER="https://antifilter.download/list/allyouneed.lst" 123 | elif [ "$FILTER" == "2" ]; then 124 | FILTER="https://antifilter.network/download/ipsmart.lst" 125 | fi 126 | fi 127 | echo -e "You are select $FILTER" 128 | FILTER="$(echo $FILTER | sed 's/\//\\\//g; s/"//g')" 129 | sed -i 's/URLINPUT/'$FILTER'/' $SCRIPTS/*.sh 130 | } 131 | 132 | # File mode 133 | configure_file_mode_func(){ 134 | sed -i '/$BLACKLIST -/s/^/#/; /$ROUTE_BASE_VPN -/s/^/#/' $SCRIPTS/add-bird4_routes.sh 135 | } 136 | 137 | # BGP mode 138 | configure_bgp_mode_func(){ 139 | configure_file_mode_func 140 | cat $HOME_FOLDER/Install/common/bird-bgp.conf >> $SYSTEM_FOLDER/etc/bird.conf 141 | if [ "$1" != "-u" ] && [ -z "$BGP_IP" ] && [ -z "$BGP_AS" ]; then 142 | echo -e "Which BGP service do you want to use\n 1 - antifilter.download 45.154.73.71 (default) \n 2 - antifilter.network 45.148.244.55 \n 3 - antifilter.network with vpn 10.75.66.20 ( you need install vpn first https://antifilter.network/vpn \n 4 - Re:filter 165.22.127.207" 143 | read BGP 144 | if [ "$BGP" == "2" ]; then 145 | BGP_IP="45.148.244.55" && BGP_AS="65444" 146 | elif [ "$BGP" == "3" ]; then 147 | BGP_IP="10.75.66.20" && BGP_AS="65444" 148 | elif [ "$BGP" == "4" ]; then 149 | BGP_IP="165.22.127.207" && BGP_AS="65412" 150 | else 151 | BGP_IP="45.154.73.71" && BGP_AS="65432" 152 | fi 153 | fi 154 | echo -e "You are select BGP $BGP_IP AS$BGP_AS" 155 | sed -i 's/BPGIPINPUT/'$BGP_IP'/; s/BGPASINPUT/'$BGP_AS'/' $SYSTEM_FOLDER/etc/bird.conf 156 | sed -i 's/BPGIPINPUT/'$BGP_IP'/; s/BGPASINPUT/'$BGP_AS'/' $SCRIPTS/*.sh 157 | } 158 | 159 | # Show interfaces 160 | show_interfaces_func(){ 161 | echo -e "\n----------------------" 162 | ip addr show | awk -F" |/" '{gsub(/^ +/,"")}/inet /{print $(NF), $2}' 163 | } 164 | 165 | # Config ISP 166 | config_isp_func(){ 167 | if [ -z "$ISP" ]; then 168 | echo "Enter the name of the provider interface from the list above (for example ppp0 or eth3)" 169 | read ISP 170 | fi 171 | echo "Your are select ISP $ISP" 172 | ISP_IP=$(ip addr show $ISP | awk -F" |/" '{gsub(/^ +/,"")}/inet /{print $2}') 173 | if [ $(echo "$ISP_IP" | grep -cE '^([0-9]{1,3}.){3}[0-9]{1,3}$' ) != 0 ]; then 174 | echo "Your id is $ISP_IP"; 175 | else 176 | ISP_IP="123.123.123.123"; 177 | fi 178 | sed -i 's/ISPINPUT/'$ISP'/' $SCRIPTS/*.sh 179 | if [ -n "$VISP_GW" ]; then sed -i 's/#ISP_GW=/ISP_GW=/' $SCRIPTS/*.sh; fi 180 | sed -i 's/IDINPUT/'$ISP_IP'/' $SYSTEM_FOLDER/etc/bird.conf 181 | } 182 | 183 | # Config VPN1 184 | config_vpn1_func(){ 185 | if [ -z "$VPN1" ]; then 186 | echo "Enter the VPN interface name from the list above (for example ovpn_br0 or nwg0)" 187 | read VPN1 188 | fi 189 | echo "Your are select VPN1 $VPN1" 190 | sed -i 's/VPN1INPUT/'$VPN1'/' $SCRIPTS/*.sh 191 | sed -i 's/VPN1INPUT/'$VPN1'/' $SYSTEM_FOLDER/etc/bird.conf 192 | } 193 | 194 | # Config VPN2 195 | config_vpn2_func(){ 196 | if [ -z "$VPN2" ]; then 197 | echo "Enter the Second VPN interface name from the list above (for example ovpn_br0 or nwg0)" 198 | read VPN2 199 | fi 200 | echo "Your are select VPN2 $VPN2" 201 | sed -i 's/VPN2INPUT/'$VPN2'/' $SCRIPTS/*.sh 202 | sed -i 's/VPN2INPUT/'$VPN2'/' $SYSTEM_FOLDER/etc/bird.conf 203 | } 204 | 205 | # Organizing scripts into folders 206 | ln_scripts_func(){ 207 | ln -sf $SCRIPTS/bird-table.sh $SYSTEM_FOLDER/etc/init.d/S02bird-table 208 | ln -sf $SCRIPTS/add-bird4_routes.sh $SYSTEM_FOLDER/etc/cron.hourly/ 209 | } 210 | 211 | # Remove old generated lists 212 | rm_old_list_func(){ 213 | find $SYSTEM_FOLDER/etc/ -type f -name bird4*.list -exec rm -f {} \; 214 | if [ -f $SCRIPTS/sum.md5 ]; then 215 | rm $SCRIPTS/sum.md5 216 | fi 217 | } 218 | 219 | # Starting Services 220 | run_func(){ 221 | $SYSTEM_FOLDER/etc/init.d/S02bird-table restart 222 | $SCRIPTS/add-bird4_routes.sh -i 223 | $SYSTEM_FOLDER/etc/init.d/S10cron restart 224 | $SYSTEM_FOLDER/etc/init.d/S70bird restart 225 | $SCRIPTS/add-bird4_routes.sh -d 226 | } 227 | 228 | # Get addon ipset 229 | install_ipset4static(){ 230 | echo -e "Do you want install IPset4Static addon? y/n" 231 | read ANS 232 | if [ "$ANS" == "y" ]; then 233 | cd $HOME_FOLDER 234 | git clone https://github.com/DennoN-RUS/IPset4Static.git 235 | chmod +x ./IPset4Static/*.sh 236 | ./IPset4Static/install.sh 237 | fi 238 | } -------------------------------------------------------------------------------- /Install/one_vpn/add-bird4_routes.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | #USER VARIABLE 4 | ISP=ISPINPUT 5 | #ISP_GW=$(ip route | grep -m 1 -E "via.*$ISP" | awk '{print $3}') 6 | VPN1=VPN1INPUT 7 | URLS="URLINPUT" 8 | 9 | #SCRIPT VARIABE 10 | HOMEPATH=HOMEFOLDERINPUT 11 | 12 | source $HOMEPATH/scripts/func.sh 13 | 14 | #GET INFO ABOUT SCRIPT 15 | get_info_func $1 16 | 17 | #INIT FILES 18 | WORK_FILES="$BLACKLIST \ 19 | $ROUTE_FORCE_ISP $ROUTE_FORCE_VPN1 \ 20 | $ROUTE_BASE_VPN \ 21 | $MD5_SUM" 22 | INIT=$1 23 | init_files_func $WORK_FILES 24 | 25 | #WAIT DNS 26 | wait_dns_func 27 | 28 | #CHECK AND REPLACE VPN IN BIRD CONF 29 | vpn_bird_func $BIRD_CONF $VPN1 30 | 31 | #BASE_LIST 32 | curl_funk $URLS $BLACKLIST | diff_funk $BLACKLIST - 33 | ipr_func lo $BLACKLIST | diff_funk $ROUTE_BASE_VPN - 34 | 35 | #FORCE_LIST 36 | if [ ! -z "$ISP_GW" ]; then ISP=$ISP_GW; fi 37 | ipr_func $ISP $ISPTXT | diff_funk $ROUTE_FORCE_ISP - 38 | ipr_func $VPN1 $VPNTXT | diff_funk $ROUTE_FORCE_VPN1 - 39 | 40 | #RESTART BIRD 41 | restart_bird_func 42 | 43 | #CHECK DUPLICATE 44 | check_dupl_func 45 | -------------------------------------------------------------------------------- /Install/one_vpn/bird-table.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin 4 | 5 | start() 6 | { 7 | if [ -z "$(ip rule | awk '/^30020/')" ]; then 8 | ip rule add table 1020 priority 30020 9 | fi 10 | if [ -z "$(ip rule | awk '/^30021/')" ]; then 11 | ip rule add table 1021 priority 30021 12 | fi 13 | } 14 | 15 | stop(){ 16 | if [ -n "$(ip rule | awk '/^30020/')" ]; then 17 | ip rule del table 1020 18 | fi 19 | if [ -n "$(ip rule | awk '/^30021/')" ]; then 20 | ip rule del table 1021 21 | fi 22 | } 23 | 24 | case "$1" in 25 | start) 26 | start 27 | ;; 28 | 29 | stop | kill) 30 | stop 31 | ;; 32 | 33 | restart) 34 | stop 35 | sleep 5 36 | start 37 | ;; 38 | *) 39 | echo "Usage: $0 {start|stop|kill|restart}" 40 | ;; 41 | esac 42 | -------------------------------------------------------------------------------- /Install/one_vpn/bird.conf: -------------------------------------------------------------------------------- 1 | log syslog all; 2 | log stderr all; 3 | 4 | router id IDINPUT; 5 | 6 | ipv4 table route_force; 7 | ipv4 table route_vpn1; 8 | 9 | protocol direct { interface "VPN1INPUT"; } 10 | protocol device { scan time 15; } 11 | 12 | template kernel KERNEL_BASE { 13 | learn; 14 | scan time 60; 15 | ipv4 { import none; }; 16 | } 17 | 18 | filter pref_50_force { 19 | preference = 50; 20 | accept; 21 | } 22 | filter pref_100_vpn1 { 23 | ifname = "VPN1INPUT"; #MARK_VPN1 24 | preference = 100; 25 | accept; 26 | } 27 | 28 | protocol kernel kernel_force from KERNEL_BASE { 29 | kernel table 1020; 30 | ipv4 { 31 | table route_force; 32 | export filter pref_50_force; 33 | }; 34 | } 35 | protocol kernel kernel_vpn1 from KERNEL_BASE { 36 | kernel table 1021; 37 | ipv4 { 38 | table route_vpn1; 39 | export filter pref_100_vpn1; 40 | }; 41 | } 42 | 43 | protocol static static_force { 44 | ipv4 { table route_force; }; 45 | include "bird4-force-isp.list"; 46 | include "bird4-force-vpn1.list"; 47 | } 48 | protocol static static_vpn1 { 49 | ipv4 { table route_vpn1; }; 50 | include "bird4-base-vpn.list"; 51 | } 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bird4Static 2 | Здесь выложены файлы для работы bird с сервисами antifilter.download, antifilter.network и re:filter 3 | 4 | Есть 3 режима работы - скачивание файла с нужного сервиса, установка бгп соединения с одним из сервисов, и работа только с пользовательскими файлами 5 | 6 | Есть возможность настройки с одним впн, так и с двумя (один основной, второй резервный + пользовательское перенаправление в определенный) 7 | 8 | Предназначено для роутеров Keenetic с установленным на них entware, а так же для любой системы с opkg пакетами, и у которых система расположена в каталоге */opt/ 9 | 10 | ## Установка 11 | 1) Зайти по ssh в среду entware 12 | 13 | 2) Выполнить: 14 | ```bash 15 | opkg install git git-http 16 | git clone https://github.com/DennoN-RUS/Bird4Static.git 17 | chmod +x ./Bird4Static/*.sh 18 | ./Bird4Static/install.sh 19 | ``` 20 | Далее выбирать нужные параметры. 21 | 22 | Более подробная инструкция установки и описание [тут](https://github.com/DennoN-RUS/Bird4Static/wiki/Установка) 23 | 24 | --- 25 | Веб-интерфейс: [web4static](https://github.com/spatiumstas/web4static) 26 | 27 | Канал в телеграме: [тут](https://t.me/bird4static) 28 | 29 | Чат в телеграме: [тут](https://t.me/bird4static_chat) 30 | 31 | Поддержать проект можно через [yoomoney](https://yoomoney.ru/to/41001872039390) и [cloudtips](https://pay.cloudtips.ru/p/76ea7dde) 32 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | VERSION_NEW="v3.10.3" 4 | 5 | while true; do 6 | echo -e "\nBegin install? y/n" 7 | read yn 8 | case $yn in 9 | [Yy]* ) 10 | 11 | # Getting the path to run the script 12 | ABSOLUTE_FILENAME=`readlink -f "$0"` 13 | HOME_FOLDER=`dirname "$ABSOLUTE_FILENAME"` && HOME_FOLDER_SED=$(echo $HOME_FOLDER | sed 's/\//\\\//g') 14 | LISTS=$HOME_FOLDER/lists 15 | SCRIPTS=$HOME_FOLDER/scripts && SCRIPTS_SED=$(echo $SCRIPTS | sed 's/\//\\\//g') 16 | SYSTEM_FOLDER=`echo $HOME_FOLDER | awk -F/opt '{print $1}'` 17 | SYSTEM_FOLDER=$SYSTEM_FOLDER/opt && SYSTEM_FOLDER_SED=$(echo $SYSTEM_FOLDER | sed 's/\//\\\//g') 18 | echo -e "HomeFolder is $HOME_FOLDER \nSystemFolder is $SYSTEM_FOLDER" 19 | 20 | source $HOME_FOLDER/Install/install_func.sh 21 | 22 | # Installing packages 23 | install_packages_func 24 | 25 | # Create start folders 26 | create_folder_func 27 | 28 | # Stop service if exist 29 | stop_func 30 | 31 | # Print current configuration 32 | print_old_conf 33 | 34 | # Try get old config 35 | if [ "$1" == "-u" ]; then UPDATE=1 && get_old_config_func; fi 36 | 37 | # Select number vpn 38 | select_number_vpn_func 39 | 40 | # Filling script folders and custom sheets 41 | fill_folder_and_sed_func 42 | 43 | # Copying the bird configuration file 44 | copy_bird_config_func 45 | 46 | # Select mode 47 | select_mode_func 48 | if [ "$MODE" == "1" ]; then configure_download_mode_func; fi 49 | if [ "$MODE" == "2" ]; then configure_bgp_mode_func; fi 50 | if [ "$MODE" == "3" ]; then configure_file_mode_func; fi 51 | 52 | # Reading vpn and provider interfaces, replacing in scripts and bird configuration 53 | show_interfaces_func 54 | config_isp_func 55 | config_vpn1_func 56 | if [ "$CONF" == "2" ]; then config_vpn2_func; fi 57 | 58 | # Organizing scripts into folders 59 | ln_scripts_func 60 | 61 | # Remove old generated lists 62 | rm_old_list_func 63 | 64 | # Starting Services 65 | run_func 66 | 67 | #IPset4Static addon 68 | if [ -d "$HOME_FOLDER/IPset4Static" ] && [ -f "$SYSTEM_FOLDER/etc/init.d/S03ipset-table" ]; then 69 | echo -e "\nFound iPset4Static\nDo you want to try update it y/n" 70 | read ANS 71 | if [ "$ANS" == "y" ]; then 72 | sh $HOME_FOLDER/IPset4Static/update.sh 73 | fi 74 | else 75 | install_ipset4static 76 | fi 77 | 78 | exit 0 79 | ;; 80 | [Nn]* ) exit 0;; 81 | * ) echo "Please answer yes or no.";; 82 | esac 83 | done -------------------------------------------------------------------------------- /uninstall.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ABSOLUTE_FILENAME=`readlink -f "$0"` 4 | HOME_FOLDER=`dirname "$ABSOLUTE_FILENAME"` && HOME_FOLDER_SED=$(echo $HOME_FOLDER | sed 's/\//\\\//g') 5 | LISTS=$HOME_FOLDER/lists 6 | SCRIPTS=$HOME_FOLDER/scripts 7 | SYSTEM_FOLDER=`echo $HOME_FOLDER | awk -F/opt '{print $1}'` 8 | SYSTEM_FOLDER=$SYSTEM_FOLDER/opt && SYSTEM_FOLDER_SED=$(echo $SYSTEM_FOLDER | sed 's/\//\\\//g') 9 | 10 | SCRIPTS=$HOME_FOLDER/scripts 11 | 12 | while true; do 13 | echo "Begin uninstall? y/n" 14 | read yn 15 | case $yn in 16 | [Yy]* ) 17 | 18 | # Stop Services 19 | $SYSTEM_FOLDER/etc/init.d/S02bird-table stop 20 | if [ -f "$SYSTEM_FOLDER/etc/init.d/S04bird1-ipv4" ]; then 21 | $SYSTEM_FOLDER/etc/init.d/S04bird1-ipv4 stop 22 | $SYSTEM_FOLDER/bin/opkg --force-removal-of-dependent-packages remove bird1-ipv4 23 | fi 24 | if [ -f "$SYSTEM_FOLDER/etc/init.d/S70bird" ]; then 25 | $SYSTEM_FOLDER/etc/init.d/S70bird stop 26 | $SYSTEM_FOLDER/bin/opkg --force-removal-of-dependent-packages remove bird2 27 | fi 28 | 29 | # Remove packages 30 | # curl 31 | answer=0; echo "Do you want remove 'curl'? 0 - no 1 - yes (default: no)"; read answer 32 | if [ "$answer" = "1" ]; then $SYSTEM_FOLDER/bin/opkg remove curl; fi 33 | # cron 34 | answer=0; echo "Do you want remove 'cron'? 0 - no 1 - yes (default: no)"; read answer 35 | if [ "$answer" = "1" ]; then $SYSTEM_FOLDER/bin/opkg remove cron; fi 36 | # bind-dig 37 | answer=0; echo "Do you want remove 'bind-dig'? 0 - no 1 - yes (default: no)"; read answer 38 | if [ "$answer" = "1" ]; then $SYSTEM_FOLDER/bin/opkg remove bind-dig bind-libs; fi 39 | # iprange 40 | answer=0; echo "Do you want remove 'iprange'? 0 - no 1 - yes (default: no)"; read answer 41 | if [ "$answer" = "1" ]; then $SYSTEM_FOLDER/bin/opkg remove iprange; fi 42 | # whois 43 | answer=0; echo "Do you want remove 'whois'? 0 - no 1 - yes (default: no)"; read answer 44 | if [ "$answer" = "1" ]; then $SYSTEM_FOLDER/bin/opkg remove whois; fi 45 | # diff and patch 46 | answer=0; echo "Do you want remove 'diffutils' and 'patch'? 0 - no 1 - yes (default: no)"; read answer 47 | if [ "$answer" = "1" ]; then $SYSTEM_FOLDER/bin/opkg remove diffutils patch; fi 48 | 49 | # Remove start folders 50 | rm -r $SCRIPTS 51 | 52 | # Remove scripts into folders 53 | rm $SYSTEM_FOLDER/etc/init.d/S02bird-table 54 | rm $SYSTEM_FOLDER/etc/cron.hourly/add-bird4_routes.sh 55 | 56 | # Remove bird lists 57 | rm -r $SYSTEM_FOLDER/etc/bird4*.list 58 | 59 | #IPset4Static addon 60 | if [ -d "$HOME_FOLDER/IPset4Static" ]; then 61 | echo -e "\nFound iPset4Static\nDo you want uninstall it? y/n" 62 | read ANS 63 | if [ "$ANS" == "y" ]; then 64 | sh $HOME_FOLDER/IPset4Static/uninstall.sh 65 | fi 66 | fi 67 | 68 | exit 0 69 | ;; 70 | [Nn]* ) exit 0;; 71 | * ) echo "Please answer yes or no.";; 72 | esac 73 | done 74 | -------------------------------------------------------------------------------- /update.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ABSOLUTE_FILENAME=`readlink -f "$0"` && HOME_FOLDER=`dirname "$ABSOLUTE_FILENAME"` 4 | SYSTEM_FOLDER=`echo $HOME_FOLDER | awk -F/opt '{print $1}'` && SYSTEM_FOLDER=$SYSTEM_FOLDER/opt 5 | cd $HOME_FOLDER 6 | $SYSTEM_FOLDER/bin/git restore *.sh Install/* 7 | $SYSTEM_FOLDER/bin/git status 8 | $SYSTEM_FOLDER/bin/git pull 9 | chmod +x *.sh 10 | sh ./install.sh -u --------------------------------------------------------------------------------