统计
登录

anyconnect路由表制作

Leo
2019-08-23
/
0 评论
/
913 阅读
/
未收录
08/23

全局Anyconnect使用起来往往不是很方便,国内的网站会慢,一些要求验证本地IP的数据库也会用不了。因此,通过添加route或no-route表来实现特定IP范围走本地还是走Anyconnect(即分流),以此满足不同网站的访问需求。

Proxy VS Anyconnect

Proxy配合gfwlist可以实现较为精确的分流模式,而且按需配置需要代理的程序。Anyconnect只能通过在服务器段添加route或no-route表实现分流,同时只支持IP段建立分流表,分流表200条以内,只能扩大目标IP段来压缩至200行。不过anyconnect一直是政府、企业和学校采购的方案,从技术上稳定性较好,安全性也高,只要服务器能撑得住。

收集别人的结果

优点:效率高;

缺点:质量无法保证,对于成熟的项目,一般较为精确(比如goagent带动的Google IP段),对于一些小站,很少人会做。

收集ASN记录

优点:效率较高,因为是网站注册提供的数据,可信度较高;

缺点:数据不完整,因为很多网站节点多或是用上了CDN,ASN的记录总是不完全的。同时收集需要一定的采集技术。

通过收集DNS和域名,解析网站IP段

原理:因为访问网站的流程为本地请求域名<–>DNS服务器将域名转换为IP地址<–>最近服务器IP。尽可能采集网站有很多子域名和附属域名,因为不同子域名或附属域名调用的服务器可能不同。网站的节点分布较多,因此要收集各个地区的DNS,这样能尽可能的将挖出分布各地的节点。如果要做的是no-route表,国内能访问即可,也就是只要收集国内的DNS即可。如果做的是route表,则可以选择临近国家的DNS,如港澳台、日本、韩国、新加坡、美国等。

优点:适用性较广,尽可能的囊括IP段,同样可以处理小型网站

缺点:为了尽可能囊括IP段,同时确保不超出200行数据,势必要扩大IP段,形成不少的噪声。同时采集域名和DNS需要一定技术手段、解析耗时也较长。

实现
anyconnect打算分成四个表:

All:内网IP段走本地,其他走anyconnect。
Scholar:数据库和内网IP段走本地,其他走anyconnect。
NoRoute:国内主要IP段走本地,其他走anyconnect。
Route:国外被墙网站走anyconnect,其他走本地。
Scholar表
由于数据库网站较多,没有别人的成果,AS查起来不方柏霓,因此选择通过域名和DNS解析的方法获得IP段。

数据库比较全的国内学校:上海交通大学、浙江大学、清华大学、中国科学院大学。

这里选用上海交通大学的数据库列表:http://www.lib.sjtu.edu.cn/index.php?m=content&c=index&a=lists&catid=223

DNS采集自:http://www.ip.cn/dns.html

采集的数据,按行排列,最后留多一个空行,分别保存成domain.txt和dns.txt。将下列代码复制保存为getip.sh。

#!/bin/bash
[ -e result.txt ]
rm result.txt
operation(){
    result=$(nslookup $domain $dns | awk '/^Address: / { print $2 }') && echo "$result $domain $dns" >> result.txt
}
while read -r domain
do
tmp_fifofile=/tmp/$$.fifo
#echo $tmp_fifofile
mkfifo $tmp_fifofile # 新建一个fifo的管道文件
exec 6<>$tmp_fifofile # 绑定fd6
rm $tmp_fifofile
# 这里是向管道添加了$thread个空行
THREAD=500 # 线程数,可以改变
for i in $(seq 0 $THREAD);do
    echo
done >&6
CONFIG_FILE=dns.txt
# 修改这个脚本到生成环境,主要是修改operation和CONFIG_FILE配置
# 每次读取一行数据
while read dns
do
    # 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
    # fd6 中没有回车符的时候,就停在这了,从而实现了线程数量控制
    read -u6
    {
       # 操作成功,记录到成功日志,修改echo
       # 操作失败,记录到错误日志
       operation && echo "$domain $dns success" || echo "$domain $dns error"
       # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
       echo  >&6
    } & # 后台执行,这里的 &是非常重要的,同时有$THREAD个后台进程 
done < ${CONFIG_FILE}
wait # 等待所有的后台子进程结束
exec 6>&- # 关闭df6
done < domain.txt

bash getip.sh运行脚本,解析IP,最后的结果以result.txt文件输出。由于企业、学校的IP段一般较多,将得到的IP,用正则,转换为..0.0的IP段,再根据情况,合并成*.0.0.0。no-route和route不能同时使用!同时要确定数据在200行以内!anyconnect支持的IP范围格式(IP地址/子网掩码)如下:

no-route = *.0.0.0/255.0.0.0
route = ..0.0/255.255.0.0

再加上常见的内网IP段,这样就制作好了一个分流表。

NoRoute表

别人有整理过,直接搬来用也差不多。

https://github.com/whiteskin/ocserv-cn-no-route/blob/master/cn-no-route.txt

Route表

有人发过不全的一个CIDR格式的IP段,可以利用网站https://www.ipconvertertools.com/cidr2ipranges 将其转换为IP地址/子网掩码的格式。

https://github.com/SteamedFish/gfwiplist/blob/master/gfwiplist.txt

Tips:

Scholar表存在问题:
time.com和一个数据库(scopus)使用AWS的节点,同一IP端,不好划分。

版权属于:

Leo

本文链接:

http://gee.im/index.php/archives/27/(转载时请注明本文出处及文章链接)

评论 (0)