parent
							
								
									effb29a310
								
							
						
					
					
						commit
						d42620801a
					
				
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						| @ -0,0 +1,208 @@ | ||||
| #!/usr/bin/env bash | ||||
| # | ||||
| # Description: Add faster tunnel for mainlanders. | ||||
| # | ||||
| # Copyright (C) 2023 liveJQ <cloud@livejq.fun> | ||||
| 
 | ||||
| RED='\033[0;31m' | ||||
| GREEN='\033[0;32m' | ||||
| YELLOW='\033[0;33m' | ||||
| SKYBLUE='\033[0;36m' | ||||
| PLAIN='\033[0m' | ||||
| 
 | ||||
| DIR='/tmp/chntunnel' | ||||
| C_DIR="$(dirname $(readlink -f "$0"))" | ||||
| FILEPATH=$0 | ||||
| FILENAME=${FILEPATH#*/} | ||||
| URL=ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | ||||
| APNIC=${URL##*/} | ||||
| MATCH_IP='\([[:digit:]]\+\.\)\{3\}[[:digit:]]\+' | ||||
| MATCH_MASK='[[:digit:]]\+' | ||||
| NOW=`date +'%Y-%m-%d %H:%M'` | ||||
| WHITELIST="$DIR/whitelist.txt" | ||||
| GFWLIST="$DIR/GFWlist.txt" | ||||
| RUNPATH="/usr/local/sbin/chntunnel" | ||||
| 
 | ||||
| msg() { | ||||
| 	echo $1 | ||||
| } | ||||
| 
 | ||||
| msg_pass() { | ||||
| 	echo -e "${GREEN}$1${PLAIN}" | ||||
| } | ||||
| 
 | ||||
| msg_err() { | ||||
| 	echo -e "${RED}$1${PLAIN}" | ||||
| } | ||||
| 
 | ||||
| help() { | ||||
| 	cat << EOF | ||||
| Usage: chntunnel [OPTION...] | ||||
| 
 | ||||
| 	options: | ||||
| 	-c, --collect         genrate route files from apnic. | ||||
| 	-g, --gre-tunnel      create a gre tunnel. | ||||
| 	-w, --white-list      whitelist mode.[TODO] | ||||
| 	-f, --gfw-list        gfwlist mode. | ||||
| EOF | ||||
| } | ||||
| 
 | ||||
| chkmd5() { | ||||
| 	msg 'Check MD5:' | ||||
| 	md5sum -c $APNIC.md5 | ||||
| } | ||||
| 
 | ||||
| download() { | ||||
| 	msg "Download $APNIC:" | ||||
| 	curl -O $URL -O $URL.md5 | ||||
| } | ||||
| 
 | ||||
| cidr() { | ||||
| 	case $1 in 256) echo 24;; | ||||
| 				512) echo 23;; | ||||
| 				1024) echo 22;; | ||||
| 				2048) echo 21;; | ||||
| 				4096) echo 20;; | ||||
| 				8192) echo 19;; | ||||
| 				16384) echo 18;; | ||||
| 				32768) echo 17;; | ||||
| 				65536) echo 16;; | ||||
| 				131072) echo 15;; | ||||
| 				262144) echo 14;; | ||||
| 				524288) echo 13;; | ||||
| 				1048576) echo 12;; | ||||
| 				2097152) echo 11;; | ||||
| 				4194304) echo 10;; | ||||
| 				8388608) echo 9;; | ||||
| 				16777216) echo 8 | ||||
| 	esac | ||||
| } | ||||
| 
 | ||||
| newGre() { | ||||
| 	cat << EOF > /etc/sysconfig/network-scripts/ifcfg-$4 | ||||
| 	DEVICE=$4 | ||||
| 	BOOTPROTO=none | ||||
| 	ONBOOT=yes | ||||
| 	DEVICETYPE=tunnel | ||||
| 	TYPE=GRE | ||||
| 	PEER_INNER_IPADDR=$2 | ||||
| 	PEER_OUTER_IPADDR=$3 | ||||
| 	MY_INNER_IPADDR=$1 | ||||
| EOF | ||||
| } | ||||
| 
 | ||||
| addRoutes() { | ||||
| 	cat << EOF > /etc/rc.local | ||||
| 	#!/bin/bash | ||||
| 	# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES | ||||
| 	# | ||||
| 	# It is highly advisable to create own systemd services or udev rules | ||||
| 	# to run scripts during boot instead of using this file. | ||||
| 	# | ||||
| 	# In contrast to previous versions due to parallel execution during boot | ||||
| 	# this script will NOT be run after all other services. | ||||
| 	# | ||||
| 	# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure | ||||
| 	# that this script will be executed during boot. | ||||
| 	touch /var/lock/subsys/local | ||||
| 	ip route flush table $1 | ||||
| 	ip route add default via $2 dev $3 src $4 table $1                | ||||
| 	ip rule add from $4 table $1 | ||||
| EOF | ||||
| } | ||||
| 
 | ||||
| collecting() { | ||||
| 	i=0 | ||||
|     while [ $i -le 25 ] | ||||
|     do | ||||
| 		for j in '\\' '|' '/' '-' | ||||
| 		do | ||||
| 			printf "Collecting, a little long %c%c%c%c%c\r" \ | ||||
| 			"$j" "$j" "$j" "$j" "$j" | ||||
| 			sleep 0.1 | ||||
| 		done | ||||
| 		let i=i+4 | ||||
|     done | ||||
| } | ||||
| 
 | ||||
| source /etc/os-release || source /usr/lib/os-release | ||||
| [[ $ID = 'centos' ]] || error=1 | ||||
| [[ $error -eq 1 ]] && msg_err "Sorry! current system is not supported." && exit 1 | ||||
| [[ ! -f $RUNPATH || `find $RUNPATH -mtime +1` ]] && cp $C_DIR/$FILENAME $RUNPATH && chmod 755 $RUNPATH | ||||
| if [ $# != 0 ]; then | ||||
| 	for param in {$1,$2,$3} | ||||
| 	do | ||||
| 		if [[ $param = '-c' || $param = '--collect' ]]; then | ||||
| 			mkdir -p $DIR && cd $_ | ||||
| 			if [[ ! -f $APNIC || ! -f $APNIC.md5 || `find $APNIC -mtime +0` ]]; then | ||||
| 				download && chkmd5 || exit | ||||
| 			else | ||||
| 				chkmd5 || { download && chkmd5; } || exit | ||||
| 			fi | ||||
| 			collecting | ||||
| 			grep "apnic|CN|ipv4|" $APNIC | awk -F'|' '{print $4"/"32-log($5)/log(2)}' >$WHITELIST | ||||
| 			grep '|ipv4|' $APNIC | grep -v '|CN|' | awk -F'|' '{print $4"/"32-log($5)/log(2)}' >$GFWLIST | ||||
| 			msg_pass "Collection complete!" | ||||
| 			# grep '^apnic|CN|ipv4|' $APNIC | grep -o "$MATCH_IP|$MATCH_MASK" | while read line | ||||
| 			# 	do | ||||
| 			# 		IPADDR=${line%|*} | ||||
| 			# 		CIDR=`cidr ${line#*|}` | ||||
| 			# 		echo $IPADDR/$CIDR >> $WHITELIST || exit | ||||
| 			# 	done | ||||
| 			# grep '|ipv4|' $APNIC | grep -v '|CN|' | grep -o "$MATCH_IP|$MATCH_MASK" | while read line | ||||
| 			# 	do | ||||
| 			# 		IPADDR=${line%|*} | ||||
| 			# 		CIDR=`cidr ${line#*|}` | ||||
| 			# 		echo $IPADDR/$CIDR >> $GFWLIST || exit | ||||
| 			# 	done | ||||
| 		elif [[ $param = '-g' || $param = '--gre-tunnel' ]]; then | ||||
| 			lsmod | grep ip_gre && result=$? && [[ $result != '0' ]] && modprobe ip_gre | ||||
| 			lsmod | grep ip_gre && result=$? && [[ $result != '0' ]] && msg_err "The current system does not support GRE tunnel." && exit 1 | ||||
| 			msg "Prepare to establish a gre tunnel" | ||||
| 			read -rp "TUNNEL_NAME (default: tun0)" TUNNEL_NAME | ||||
| 			[[ -f "/etc/sysconfig/network-scripts/ifcfg-${TUNNEL_NAME:-tun0}" ]] &&  msg_err "This tunnel already exists, please do not create it again." && exit 1 | ||||
| 			read -rp "MY_INNER_IPADDR: " MY_INNER_IPADDR | ||||
| 			read -rp "PEER_INNER_IPADDR: " PEER_INNER_IPADDR | ||||
| 			read -rp "PEER_OUTER_IPADDR: " PEER_OUTER_IPADDR | ||||
| 			newGre $MY_INNER_IPADDR $PEER_INNER_IPADDR $PEER_OUTER_IPADDR ${TUNNEL_NAME:-tun0} | ||||
| 			ifup ${TUNNEL_NAME:-tun0} | ||||
| 			ping -c 3 $PEER_INNER_IPADDR && result=$? | ||||
| 			[[ $result -eq 0 ]] && msg_pass "Tunnel created successfully!" && exit 0 | ||||
| 		elif [[ $param = '-f' || $param = '--gfw-list' ]]; then | ||||
| 			peer=$(ip addr | grep peer | grep inet | awk -F ' ' {'print $4'}) | ||||
| 			PEER_INNER_IPADDR=${peer%%/*} | ||||
| 			:>/etc/sysconfig/static-routes | ||||
| 			cat $GFWLIST | while read line | ||||
| 				do | ||||
| 					ip route add $line via $PEER_INNER_IPADDR | ||||
| 					echo "any net $line gw $PEER_INNER_IPADDR" >>/etc/sysconfig/static-routes || exit | ||||
| 				done | ||||
| 			msg_pass "GFWlist is active, enjoy~" | ||||
| 		elif [[ $param = '-w' || $param = '--white-list' ]]; then | ||||
| 			local_gw=$(ip route | grep default | awk -F ' ' {'print $3'}) | ||||
| 			local_dev=$(ip route | grep src | awk -F ' ' {'print $3'}) | ||||
| 			local_addr=$(ip route | grep src | awk -F ' ' {'print $9'}) | ||||
| 			local_table='cn' | ||||
| 			peer=$(ip addr | grep peer | grep inet | awk -F ' ' {'print $4'}) | ||||
| 			PEER_INNER_IPADDR=${peer%%/*} | ||||
| 			:>/etc/sysconfig/static-routes | ||||
| 			grep $local_table /etc/iproute2/rt_tables && result=$? | ||||
| 			[[ $result != '0' ]] && echo "200 $local_table" >>/etc/iproute2/rt_tables | ||||
| 			grep $local_table /etc/rc.local && result=$? | ||||
| 			[[ $result != '0' ]] && addRoutes $local_table $local_gw $local_dev $local_addr && chmod +x /etc/rc.local && /etc/rc.local &&  | ||||
| 			cat $WHITELIST | while read line | ||||
| 				do | ||||
| 					ip route add $line via $local_gw | ||||
| 					echo "any net $line gw $local_gw" >>/etc/sysconfig/static-routes || exit | ||||
| 				done | ||||
| 			ip route del default via $local_gw | ||||
| 			ip route add default via $PEER_INNER_IPADDR | ||||
| 		else | ||||
| 			help | ||||
| 		fi | ||||
| 	done | ||||
| else | ||||
| 	help | ||||
| fi | ||||
| #TODO:白名单 | ||||
| #TODO:设置DNS | ||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						
					Loading…
					
					
				
		Reference in new issue