mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-15 18:03:30 +00:00
86 lines
2.2 KiB
Bash
Executable File
86 lines
2.2 KiB
Bash
Executable File
#!/bin/bash -e
|
|
|
|
#
|
|
# Script for generating China IPv4 route table by merging APNIC.net data and IPIP.net data
|
|
#
|
|
|
|
china_routes_ipip()
|
|
{
|
|
[ -f ipip.txt ] || wget -4 https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt -O ipip.txt >&2 || exit 1
|
|
cat ipip.txt | xargs netmask | awk '{print $1}'
|
|
}
|
|
|
|
china_routes_apnic()
|
|
{
|
|
[ -f apnic.txt ] || wget -4 http://ftp.apnic.net/stats/apnic/delegated-apnic-latest -O apnic.txt >&2 || exit 1
|
|
|
|
cat apnic.txt | awk -F'|' -vc=CN '
|
|
function tobits(c) { for(n=0; c>=2; c/=2) n++; return 32-n; }
|
|
$2==c&&$3=="ipv4" { printf("%s/%d\n", $4, tobits($5)) }' |
|
|
xargs netmask | awk '{print $1}'
|
|
}
|
|
|
|
china_routes_merged()
|
|
{
|
|
[ -x ./ipv4-merger ] || gcc ipv4_merger.c -o ipv4-merger >&2
|
|
|
|
china_routes_apnic > china.apnic
|
|
china_routes_ipip > china.ipip
|
|
|
|
# Merge them together
|
|
cat china.apnic china.ipip | ./ipv4-merger | sed 's/\-/:/g' |
|
|
xargs netmask | awk '{print $1}' | awk -F/ '$2<=24' > china.merged
|
|
|
|
cat china.merged
|
|
}
|
|
|
|
# $1: ipset name
|
|
convert_routes_to_ipset()
|
|
{
|
|
local ipset_name="$1"
|
|
echo "create $ipset_name hash:net family inet hashsize 1024 maxelem 65536"
|
|
awk -vt="$ipset_name" '{ printf("add %s %s\n", t, $0) }'
|
|
}
|
|
|
|
|
|
generate_china_ipset()
|
|
{
|
|
china_routes_merged | convert_routes_to_ipset china
|
|
}
|
|
|
|
generate_inverted_china_routes()
|
|
{
|
|
(
|
|
china_routes_merged
|
|
echo 0.0.0.0/8 10.0.0.0/8 100.64.0.0/10 127.0.0.0/8 172.16.0.0/12 192.168.0.0/16 224.0.0.0/3
|
|
) |
|
|
xargs netmask -r | awk '{print $1}' |
|
|
awk -F- '
|
|
function iptoint(ip) { split(ip,arr,"."); n=0; for(i=1;i<=4;i++) n=n*256+arr[i]; return n; }
|
|
function inttoip(n) { a=int(n/16777216); b=int(n%16777216/65536); c=int(n%65536/256); d=n%256; return a "." b "." c "." d; }
|
|
BEGIN { st=0 }
|
|
{ x=st; y=iptoint($1); st=iptoint($2)+1; if(y>x) { print inttoip(x) ":" inttoip(y-1); } }' |
|
|
xargs netmask | awk '{print $1}'
|
|
}
|
|
|
|
|
|
##
|
|
case "$1" in
|
|
"")
|
|
generate_china_ipset
|
|
;;
|
|
-c)
|
|
china_routes_merged
|
|
;;
|
|
-r)
|
|
generate_inverted_china_routes
|
|
;;
|
|
*)
|
|
echo "Usage:"
|
|
echo " $0 generate China routes in ipset format"
|
|
echo " $0 -c generate China routes in IP/prefix format"
|
|
echo " $0 -r generate invert China routes"
|
|
;;
|
|
*)
|
|
esac
|