koolproxy插件/固件开发文档1.6 更新日期:2021年3月8日(koolproxy 3.8.5) ================================================================================================ 声明: KoolProxy 是一个免费软件,著作权归属 KoolProxy.com,用户可以非商业性地复制和使用 KoolProxy,但禁止将 KoolProxy 用于商业用途。 KoolProxy 可以对 https 网络数据进行识别代理,使用 https 功能的用户需要自己提供相关证书,本程序提供的证书生成脚本仅供用户参考,证书的保密工作由用户自行负责。 使用本软件的风险由用户自行承担,在适用法律允许的最大范围内,对因使用本产品所产生的损害及风险,包括但不限于直接或间接的个人损害、商业赢利的丧失、贸易中断、商业信息的丢失或任何其它经济损失,KoolProxy.com 不承担任何责任。 ================================================================================================ KoolProxy By Xiaobao & Crwnet v3.8.5 USAGE: koolproxy [options] [arguments...] OPTIONS: -p value listen port, default value is 3000 -l value log level (0:DEBUG, 1:INFO, 2:AD, 3:WARNING, 4:ERROR), default value is ERROR -c value thread count, default value is the number of cpus -b value data path, default value is './data' -d run as daemon mode -v show version -h show help ADVANCED: --cert generate ssl cert --ipv6 enable ipv6, works for ipv6 nat mode --video | -e video mode, load video rules only --mark mark mode, set the socket mark(src ip) when connect to remote host. requires the CAP_NET_ADMIN capability --ttl value ttl mode, set the socket ttl when connect to remote host. default value is 0 (disable) ================================================================================================ 交流地址: 1 QQ群1: 595300867 2 QQ群2: 203726739 3 TG群: https://t.me/joinchat/AAAAAD-tO7GPvfOU131_vg 4 更新日志:http://koolshare.cn/thread-64086-1-1.html ================================================================================================ #koolproxy部署文件目录参考1(使用openssl生成证书) . ├── data │   ├── gen_ca.sh #证书生成脚本 │   ├── koolproxy_ipset.conf #ipset名单 │   ├── openssl.cnf #证书生成所用配置文件 │   ├── rules #规则存放文件夹 │   │   ├── kp.dat #视频规则 │   │   ├── koolproxy.txt #静态规则 │   │   ├── daily.txt #每日规则 │   │   └── user.txt #自定义规则 │   └── version #插件版本号(merlin) └── koolproxy #koolproxy二进制(为了保证二进制顺利更新,请保证目录可写) 1 证书生成使用命令 sh gen_ca.sh,该脚本会调用系统内的openssl来生成证书,运行成功后会自动创建data/private data/cert目录 私钥和公钥会分别存在data/private data/cert目录下,使用http://110.110.110.110会下载路由器内的证书 ------------------------------------------------------------------------------------------------ #koolproxy部署文件目录参考2(使用koolproxy生成证书) . └── koolproxy #koolproxy二进制(为了保证二进制顺利更新,请保证目录可写) 1 因为规则文件会由koolproxy自动下载,下载后会自动创建data/rules目录 2 使用koolproxy --cert命令可以生成证书,运行成功后会自动创建data/private data/cert目录 私钥和公钥会分别存在data/private data/cert目录下,使用http://110.110.110.110会下载路由器内的证书 因为mbedtls性能原因,在非软路由机器上用koolproxy --cert生成证书需要时间较长,请耐心等待 ================================================================================================ 说明: 1 koolproxy启动会自动检测规则更新,如果没有./data/rules文件夹,会自己创建并下载规则到此处 2 koolproxy启动后会检测二进制文件更新,如果有更新,会替换./koolproxy,并且由父进程重启koolproxy,以后每20分钟检测一次更新 3 现在不支持规则订阅了,只能识别kp.dat, koolproxy.txt, user.txt,daily.txt,需要自定义规则的可以修改user.txt # 二进制下载固定地址 https://koolproxy.com/downloads/i386(已作废) https://koolproxy.com/downloads/x86_64(已作废) https://koolproxy.com/downloads/arm(已作废) https://koolproxy.com/downloads/mips(已作废) https://koolproxy.com/downloads/mipsel(已作废) # 规则下载固定地址 http://router.houzi-blog.top:3090/koolproxy.txt http://router.houzi-blog.top:3090/daily.txt http://router.houzi-blog.top:3090/kp.dat # 规则下载对应的CDN地址 https://kprules.b0.upaiyun.com/koolproxy.txt(已作废) https://kprules.b0.upaiyun.com/daily.txt(已作废) https://kprules.b0.upaiyun.com/kp.dat(已作废) https://kprules.b0.upaiyun.com/user.txt(已作废) # 二进制文件和规则 github备份地址: 二进制:https://github.com/koolproxy/koolproxy-bin (已作废) 规则:https://github.com/koolproxy/koolproxy_rules (已作废) 1 建议从上面的链接获取最新的二进制和基本的规则文件,然后按照上面的目录结构来部署 2 如果不需要https过滤,只需要一个koolproxy程序就足够了,data文件夹和rules文件夹都会自己创建。 3 koolproxy.txt内有视频规则、静态规则、每日规则的更新日期,可以用于提取并显示到界面 ================================================================================================ koolproxy运行: 1 在koolproxy主程序目录运行,例如merlin固件下运行:cd /koolshare/koolproxy && koolproxy -d 2 不在koolproxy主程序目录运行(例如将koolproxy放在环境变量中),例如merlin固件下运行:koolproxy -b /koolshare/koolproxy -d -b为data路径 其它运行方式可能会造成koolproxy识别不到data目录而无法加载规则 koolproxy运行后默认会使用端口3000作为透明代理端口,需要利用iptables将数据导到端口3000才能发挥作用。 视频模式: 1 使用命令koolproxy -e 即可开启 2 开启后只会加载视频规则kp.dat和user.txt 调试模式: 1 使用命令koolproxy -l0 即可开启,l后面的数字代表不同的日志详细程度 2 需要检查规则命中行数可以需要使用-l 2 ttl功能: 1 使用命令koolproxy --ttl 160 即可开启ttl功能,后面的数值代表ttl大小 2 ttl功能开启后,koolproxy会对经过它的所有数据ttl进行调整,可以利用iptables的match ttl功能数据进行匹配 mark功能: 1 使用命令koolproxy --mark 即可开启mark功能 2 mark功能开启后,koolproxy会对经过它的所有数据打上标记,mark值等于该数据的源ip转换为十六进制的值 3 例如局域网内192.168.1.100的数据,将会被打上0xc0a80164的mark(192 = c0, 168 = a8, 1 = 01, 100 = 64 ) 4 开发者可以用此功和SS配合,达到既科学上网,又能过滤这些科学上网的流量,还不影响科学上网访问控制的功能 5 ip转换为mark值参考命令:echo 192.168.1.100 | awk -F "." '{printf ("0x%02x", $1)} {printf ("%02x", $2)} {printf ("%02x", $3)} {printf ("%02x\n", $4)}' ================================================================================================ ss + kp过滤方案(2017年7月7日): 方案1(优先SS,其次KP,不推荐): 1 在NAT PREROUTING链内,SS在前,KP在后,流量将先走SS,经过SS分流后,国外流量走ss-redir,实现翻墙; 2 而剩下国内流量在PREROUTING链内继续往下匹配到koolrpxy规则,流量最终走koolproxy,实现过滤。 结果:koolproxy只能过滤国内流量(SS剩下的)。 方案2(优先KP,其次SS,不推荐); 1 在NAT PREROUTING链内,KP在前,SS在后,流量将先走KP,实现过滤; 2 为了SS能拿到KP过滤后的数据,使用match ttl匹配,在OUTPUT链内将流量全部给SS,实现翻墙; 结果:因为在OUTPUT链内没有源ip信息,流量给SS后无法匹配到源ip,因此SS失去了acl(访问控制)功能。 方案3 (优先kp,其次SS,推荐); 为便于理解,以下iptables配置只展示流量经过顺序,不是iptables的创建顺序,PREROUTING内规则的创建实际上应该在最后 0 koolproxy默认开启ttl和mark功能 KoolProxy --ttl 160 --mark -d(固件不支持ttl的仅开启mark也行: KoolProxy --mark -d) 1 在NAT PREROUTING链内,KP在前,SS在后,KP开启--mark,流量将先走KP(80,443),实现过滤,过滤后每个主机会被打上不同的mark; #KP在前,所有tcp流量全部交给KOOLPROXY链 -A PREROUTING -p tcp -j KOOLPROXY #SS在后,在kp开启的时候,只能拿到非80,443的流量,在kp关闭后,可以拿到所有端口的流量 -A PREROUTING -p tcp -j SHADOWSOCKS 2 例如局域网内192.168.1.100主机的数据经过kp过滤后,将会被打上0xc0a80164的mark(192 = c0, 168 = a8, 1 = 01, 100 = 64 ); #创建KOOLPROXY链,用于白名单和访问控制 -N KOOLPROXY #创建KOOLPROXY_HTTP链,用于过滤http流量 -N KOOLPROXY_HTTP #创建KOOLPROXY_HTTPS链,用于过滤https流量 -N KOOLPROXY_HTTPS #局域网和保留地址不走kp -A KOOLPROXY -m set --match-set white_kp_list dst -j RETURN #主机192.168.1.100需要https过滤 -A KOOLPROXY -s 192.168.1.100/32 -p tcp -g KOOLPROXY_HTTPS #其它主机过滤http流量 -A KOOLPROXY -p tcp -j KOOLPROXY_HTTP 3 为了SS能拿到数据,在NAT OUTPUT链中,使用match ttl匹配,在OUTPUT链内将流量全部给SHADOWSOCKS_EXT链; #创建SHADOWSOCKS_EXT链,用于开启kp情况下ss的访问控制实现 -N SHADOWSOCKS_EXT #使用ttl匹配将KP过滤后的数据转到SHADOWSOCKS_EXT链(如果固件不支持ttl匹配,使用下面的命令) -A OUTPUT -p tcp -m ttl --ttl-eq 160 -j SHADOWSOCKS_EXT #如果固件不支持ttl match,可以用mark匹配ip地址的前三位(用0xffffff00作为掩码的形式),来将KP过滤后的数据转到SHADOWSOCKS_EXT链 # echo 192.168.1 | awk -F "." '{printf ("0x%02x", $1)} {printf ("%02x", $2)} {printf ("%02x", $3)} {printf ("00/0xffffff00\n")}' = 0xc0a80100/0xffffff00 -A OUTPUT -p tcp -m mark --mark 0xc0a80100/0xffffff00 -j SHADOWSOCKS_EXT 4 如果开启了acl,比如需要192.168.1.75不走SS(全端口),192.168.1.246走gfwlist模式(80,443端口),192.168.1.214走大陆白名单模式(22,80,443端口),剩余主机全部走大陆白名单模式(全端口): #主机192.168.1.75(0xc0a8014b),流量经过KP过滤后并打上mark后,通过OUTPUT链进入SHADOWSOCKS_EXT链,而未能翻墙(RETURN) -A SHADOWSOCKS_EXT -p tcp -m mark --mark 0xc0a8014b -j RETURN #主机192.168.1.246(0xc0a801f6),流量经过KP过滤后并打上mark后,通过OUTPUT链进入SHADOWSOCKS_EXT链,在此流量被导向了SHADOWSOCKS_GFW链,实现gfwlist模式翻墙(80,443端口) -A SHADOWSOCKS_EXT -p tcp -m multiport --dports 80,443 -m mark --mark 0xc0a801f6 -g SHADOWSOCKS_GFW #主机192.168.1.214(0xc0a801f6),流量经过KP过滤后并打上mark后,通过OUTPUT链进入SHADOWSOCKS_EXT链,在此流量被导向了SHADOWSOCKS_CHN链,实现大陆白名单模式翻墙(22,80,443端口) -A SHADOWSOCKS_EXT -p tcp -m multiport --dports 22,,80,443 -m mark --mark 0xc0a801d6 -g SHADOWSOCKS_CHN #剩余的主机,流量经过KP过滤后并打上mark后,通过OUTPUT链进入SHADOWSOCKS_EXT链,在此流量被导向了SHADOWSOCKS_CHN链,实现大陆白名单模式翻墙(全端口) -A SHADOWSOCKS_EXT -p tcp -j SHADOWSOCKS_CHN 情形: 1 当SS开启,kp未开启:所有流量走ss PREROUTING过,经过分流后,国内的流量在经过OUTPUT的时候,因为KP没开,数据不会匹配到ttl值(或者没匹配到mark值),所以不会过滤广告,翻墙正常 2 当KP开启,SS未开启,所有流量走kp PREROUTING过,广告过滤正常 3 当SS开启,翻墙和acl工作正常的时候,开启KP:KP在PREROUTING内插入到SS前面,会先得到流量,广告过滤正常 4 当KP开启,过滤广告正常的时候,开启SS:SS从原来的从PREROUTING拿流量变成从OUTPUT内拿流量,翻墙和acl会同样正常 5 当KP和SS都开启,此时关闭SS,kp过滤广告正常 6 当KP和SS都开启,此时关闭KP,ss翻墙和acl正常 总结: 使用 ttl + mark (或者纯mark)的方式,可以实现原先很难实现的过滤经过SS流量的广告 主要的改动在于给SS预置好OUTPUT和SHADOWSOCKS_EXT规则链,当kp启用时,它们就会工作,kp关闭时,不会影响正常数据 次要的改动就是给koolproxy默认开启ttl + mark(或者纯mark)功能 ================================================================================================ koolproxy规则语法: ! ------------------------ 规则基于adblock规则,并进行了语法部分的扩展 ------------------------ ! ABP规则请参考https://adblockplus.org/zh_CN/filters,下面为大致摘要 ! "!" 为行注释符,注释行以该符号起始作为一行注释语义,用于规则描述 ! "@@" 为白名单符,白名单具有最高优先级,放行过滤的网站,例如:@@||taobao.com ! "@@@@" 超级白名单,比白名单符拥有更高的优先级,主要用于放行https网站,例如:@@@@||https://taobao.com ! ------------------------------------------------------------------------------------------ ! "*" 为字符通配符,能够匹配0长度或任意长度的字符串,该通配符不能与正则语法混用。 ! "^" 为分隔符,可以是除了字母、数字或者 _ - . % 之外的任何字符。 ! "~" 为排除标识符,通配符能过滤大多数广告,但同时存在误杀, 可以通过排除标识符修正误杀链接。 ! "$image" 为识别图片变量,搭配规则使用作用于屏蔽图片,例如:||baidu.com/cdn/adv_$image ! "$script" 为识别脚本变量,搭配规则使用作用于屏蔽脚本,例如:||baidu.com/cdn/adv_$script ! "$c" 为解除跨域访问,例如:|http://nl-rcd.iqiyi.com/crossdomain.xml$c ! "$agent" 为限定浏览器过滤的标识头,例如:|http://www.baidu/adv/xxx.jpg$agent=Chrome,~Firefox ! "$domain" 为指定网站过滤,例如:|http://*/adv/xxx.jpg$domain=~baidu.com|qq.com ! 注:通配符仅在 url 规则中支持,html 规则中不支持 ================================================================================================ ! "|" 为管线符号,来表示地址的最前端或最末端 ! "||" 为子域通配符,方便匹配主域名下的所有子域 ! 用法及例子如下:(以下等号表示等价于) ! ||xx.com/ad = http://xx.com/ad* || http://*.xx.com/ad* ! ||http://xx.com/ad = http://xx.com/ad* || http://*.xx.com/ad* ! ||https://xx.com/ad = https://xx.com/ad* || https://*.xx.com/ad* ! |xx.com/ad = http://xx.com/ad* ! |http://xx.com/ad = http://xx.com/ad* ! |https://xx.com/ad = https://xx.com/ad* ! ad = http://*ad* ! http://ad = http://*ad* ! https://ad = 不支持,需要指定域名,如下例 ! https://xx.com/ad = |https://xx.com/ad = https://xx.com/ad* ! [同时可以表示两个以及两个以上的域名]如下例子 ! https://xx.ad.com 和 https://xxx.xx.ad.com = ||https://ad.com (注意! 由于https的原因使用要非常谨慎,不可以大范围使用) ! ------------------------------------------------------------------------------------------ ! 兼容adblock规则的html规则语法,例如: ! fulldls.com,torrentzap.com##.tp_reccomend_banner ! 但是推荐写成以下标准写法: ! ||fulldls.com##.tp_reccomend_banner ! ||torrentzap.com##.tp_reccomend_banner ! 如果一个网站html规则有多条,可以合并为这样: ! ||torrentzap.com##.tp_reccomend_banner,.ad_top,[class="ad_right"]...... ! ------------------------------------------------------------------------------------------ ! 文本替换语法:$s@匹配内容@替换内容@ ! 文本替换例子:|http://cdn.pcbeta.js.inimc.com/data/cache/common.js?$s@old@new@ ! 重定向语法:$r@匹配内容@替换内容@ ! 重定向例子:|http://koolshare.cn$r@http://koolshare.cn/*@http://www.qq.com@ ! 非标准端口过滤语法:||abc.com:8081/ad.html或者|http://adb.com:8081/ ! 注:文本替换语法及重定向语法中的匹配内容不仅支持通配符功能,而且额外支持以下功能 ! 支持通配符 * 和 ? 表示单个字符 ! 支持全正则匹配,/正则内容/ 表示应用正则匹配 ! 正则替换:替换内容支持 $1 $2 这样的符号 ! 普通替换:替换内容支持 * 这样的符号,表示把命中的内容复制到替换的内容。(类似 $1 $2,但是 * 号会自动计算数字) ! ================================================================================================