获取国内白名单ip等合集脚本

本文章谈论的脚本建立在Openwrt上,当然,lede也是可以的
Openwrt程序一般分两部分,第一部分是主程序,第二部分是luci前台页面,如果,没有安装luci前台页面,那你只能去后台ssh手动改配置文件调起程序,个人不太推荐这种方式,而ss也一样,需要安装2部分程序,当中主程序部分还有一些相关依赖项,不过都可以通过opkg install来解决

一、介绍与程序下载

因某些原因,,,略!

主程序及luci地址如下:

因某些原因,略!

二、白名单、黑名单的获取

(1)白名单
由于国内有某些限制,于是白名单的意思就是国内能正常打开的域名,而黑名单就是被X掉的域名了。
首先,我放上白名单脚本:

    root@OpenWrt:~# cat /bin/chinadns_update.sh 
    #!/bin/sh /etc/rc.common
    # Write by WangYouGX(忘忧GX)
    # Version 1.0
    
    curl -k 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }'  > /tmp/chinadns_chnroute.txt
    if [ `grep '1.0.1.0/24' /tmp/chinadns_chnroute.txt` ]; then
       mv /tmp/chinadns_chnroute.txt /etc/chinadns_chnroute.txt
       grep '100.100.100.100' /etc/chinadns_chnroute.txt || echo '100.100.100.100' >>/etc/chinadns_chnroute.txt
       chmod 777 /etc/chinadns_chnroute.txt
    
    else
       rm -rf /tmp/chinadns_chnroute.txt
    fi

很简单的小脚本,获取得到的白名单是ip形式,文件是/etc/chinadns_chnroute.txt,大家可以改路径

(2)黑名单
黑名单获取比较复杂,且获取得到的是一系列域名,而某程序需要的是要ip列表,所以稍后我还会放上一域名转ip的脚本,这里先放获取脚本

root@OpenWrt:~# cat /usr/bin/gfw.sh 
#! /bin/sh
# Write by WangYouGX(忘忧GX)
# Version 1.0
    
    
mydnsip="127.0.0.1"
mydnsport=$(uci get pdnsd.config.port)
ipsetname="gfwlist"

BASE_URL="https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"
TMP_FILE="/tmp/gfwtmp"

curl -k $BASE_URL |base64 -d  >$TMP_FILE

sed -i '/!/d' $TMP_FILE
sed -i '/^@@||.*tw$/{s/^@@||/./g}' $TMP_FILE
sed -i '/^@@/d' $TMP_FILE
sed -i '/\[/d' $TMP_FILE
sed -i 's/||*//g' $TMP_FILE
sed -i 's/^.*\/\//./g' $TMP_FILE
sed -i 's/\/.*$//g' $TMP_FILE
sed -i '/%/d' $TMP_FILE
sed -i 's/^..*\*\.//g' $TMP_FILE
sed -i 's/\*.*$//g' $TMP_FILE
sed -i '/^.$/d' $TMP_FILE
sed -i '/^$/d' $TMP_FILE
sed -i '/\./!d' $TMP_FILE
sed -i '1,$s/\(^[^\.].*\)/\.\1/g' $TMP_FILE
sed -i '$!N; /^\(.*\)\n\1$/!P; D' $TMP_FILE
sed -i 's/^/www&/g' $TMP_FILE
sort -u "$TMP_FILE" > /tmp/gfw_list

cat /tmp/gfw_list /etc/gfw_list |awk '!a[$0]++' > /tmp/gfwtmpfile
mv /tmp/gfwtmpfile /etc/dnslist/china-banned
chmod -R 777 /etc/dnslist/*
rm $TMP_FILE /tmp/gfw_list && echo done

这个获取黑名单的脚本还涉及到一个文件/etc/gfw_list,文件内容我也放上:

root@OpenWrt:~# cat /etc/gfw_list 
www.google.com
www.google.com.hk
www.google.com.tw
www.google.com.sg
www.google.co.jp
www.blogspot.com
www.blogspot.sg
www.blogspot.hk
www.blogspot.jp
www.gvt1.com
www.gvt2.com
www.gvt3.com
www.1e100.net
www.blogspot.tw
www.hosthatch.com
www.tvro.com.tw

好了之后,检查一下/etc/gfwlist/china-banned是否有记录

(3)黑名单域名转IP
刚才也说了某程序不支持域名列表,且域名列表效率不高,国内dns被污染严重,跑这个脚本之前最好使用开源dns,例如:208.67.222.222
208.67.220.220
208.67.222.220
208.67.220.222
跑完这个脚本估计需要10分钟,具体视具体机子性能、网络状况而定,本人是x86平台跑,3分钟跑完,脚本如下:

root@OpenWrt:~# cat /bin/gfwip_ping.sh 
#!/bin/sh
# Write by WangYouGX
# Version 2.0
gfwhost="/tmp/gfwhost.txt"
gfw_ip="/tmp/gfw_ip.txt"
log_file="/mnt/sdg1/log/gfwip_ping.log"
start_time=[`date "+%Y-%m-%d %H:%M:%S"`]
cp /etc/dnslist/china-banned ${gfwhost}
echo -e '\n'${start_time} ---------------------- Starting ---------------------- >>${log_file}
>${gfw_ip}
count=$(wc -l ${gfwhost}|awk '{print $1}')
i=0
thread_cnt=800
while [[ ${i} -lt ${count} ]]
do
    if [[ $(ps -ef|grep -v grep|grep ping|wc -l) -gt ${thread_cnt} ]]
    then
        echo "thread count more the ${thread_cnt},sleep 1 second"
        sleep 1
    else
        i=$(($i+1))
        host_name=$(awk NR==$i $gfwhost)
        echo "${i} -----> ${host_name}"
        ping -c 1 -w 1 $host_name |head -n1 |cut -d '(' -f2|cut -d ')' -f1 >> ${gfw_ip} &
    fi
done
wait
awk 'length($1)<=15 && length($1)>=7 {print $1}' ${gfw_ip} |awk -F'.' '{print $1"."$2"."$3".1"}' > /tmp/tmp_ip
mv /tmp/tmp_ip ${gfw_ip}
count_ip=$(wc -l ${gfw_ip}|awk '{print $1}')
cat /etc/china-gfwip.txt >> ${gfw_ip}
sort -u ${gfw_ip} > /etc/china-gfwip.txt
chmod 777 /etc/china-gfwip.txt
count_last=`cat /etc/china-gfwip.txt |wc |awk '{print $1}'`
echo Gfw_list_sum:' '${count}'   ' Gfw_ping_success:' '${count_ip} '   ' Success rate:' '`awk 'BEGIN{printf "%.2f%%\n",('${count_ip}'/'${count}')*100}'` '  'Gfw_ip_list:' '${count_last}'   'Concurrent number:' '${thread_cnt} >>${log_file}
endtime=[`date "+%Y-%m-%d %H:%M:%S"`]
echo  $endtime ---------------------- Over! ---------------------- >>${log_file}

脚本里面的thread_cnt是并发数,机子性能不好不要开太高,此处开800已经是逆天,一般开50就够了。
路径大家需要仔细研究清楚,其中log_file的路径是日志路径,日志会记录下域名行数、获取得到的ip行数、获取成功率和去重后的有效记录数还有设置的并发数。
gfw_ip是一个临时文件,用于while循环写每一个域名ip用的。至于gfwhost就是用于存储域名用的,因为循环一次就要读取一遍文件,于是把/etc/dnslist/china-banned拷贝到/tmp下保护硬盘频繁读取,脚本执行完后,结果文件将保存在:/etc/china-gfwip.txt

(4)定时任务
为了让脚本自动运行且定期更新列表,建议用crontab任务来定期跑脚本:

00 5 * * 1,4 sh /usr/bin/gfw.sh & 2>/dev/null 
15 5 * * 1,4 sh /bin/chinadns_update.sh
15 5 * * 1,4 sh /bin/gfwip_ping.sh 

第一条定时任务跑Gfw黑名单,第二条定时任务是跑国内白名单,第三个定时任务跑黑名单域名转成ip,周一、周四凌晨5点跑

(5)图形化简单配置

每一个设置步骤最好都保存应用一遍再进行下一步操作!

见图:
1.png
填写你购买的某服务商提供的某服务器的ip、密码、端口号和验证形式,不能错,至于名称可以随意

2.png
访问控制按照刚才脚本的白名单、黑名单的ip列表文件来填,不要填反了。一般代理自身的路由就不要代理了,不然会出现些莫名奇妙的问题,比如邮件客户端等接发不正常等。

3.png
见上图,配置完成后,只需要透明代理起来就可以了,其他的什么SOCKS5代理、端口转发都不用配置也不要启用

已有 3 条评论
  1. ilvjyw ilvjyw

    感谢大神分享

    1. /etc/gfwlist/下面的文件要全部rm掉,如果你用了文章中的ss的话

  2. 北城雪飘 北城雪飘

    666,没想到墙内还能看到这种教程,真不容易,我当时还得去google才好找

添加新评论