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