AdBlock Plus

https://adblockplus.org/zh_CN/filters

 

撰写Adblock Plus 过滤规则

当前的Adblock Plus版本允许你通过许多不同的方法来优化你的过滤规则。本文档描述了你可以使用的方法,并告诉你如果去使用它。

声明 :这里给出的所有的过滤规则只是例子而已,并不能直接使用。

AdBlock Plus 过滤规则介绍

对 于偶尔才写过滤规则的用户,本章节对过滤规则的描述足矣。

基本过滤规则

通常你定义得最琐碎的过滤规则当然是阻挡banner 地址的。但是这些地址在你每次打开页面的时候都会 改变。例如:可能是http://example.com/ads/banner123.gif 。其中的123就是个随机的数字。所以 阻挡完整的图片网址没有效果,通常你需要更通用的过滤规则,例如http://example.com/ads/banner*.gif 甚至 http://example.com/ads/*

注意 :不要过多地使用通配符。过滤规则:http://example.com/* 虽然可以阻挡所有的banner , 但也会阻挡example.com 下其他一些你想看的内容。

定义例外规 则

有时你可能会发现某个过滤规则平时挡广告挡得很好,但在某些情况下,会阻挡不该挡的内容。 你不想移除这条过滤规则,但也不希望它阻挡不该挡的内容。

这就是例外规则的好处——它们允许 你定义过滤规则不被使用的情况。例如:当你对adv 规则阻挡了 http://example.com/advice.html 不 爽的时候,这时你就可以定义一条例外规则@@advice 。例外规则的写法与过滤规则完全一样,你可以使用通配符和正则表达式。你只需 要通过@@ 表明一个例外的规则。

例外规则可以处理得更多。如果一条例外规 则以http://https:// (在前面加上管线符号(|))开始,这会使所有的页面都是例外。例如:如果你 的规则是@@|http://example.com ,你浏览http: //example.com 的页面 时,Adblock Plus对这个页面将会失效,这将不会阻挡任何东西。

匹配网址 开头/结尾

通常Adblock Plus处理过滤规则时,会自己假设在过滤规则的开头与结尾都有一个通配符,也就是说,ad*ad* 效果是一样 的。通常这并不会带来问题,但有时你可能想要设定可以匹配以网址开头或结尾的过滤规则。例如:你想要阻挡所有的Flash,如果你加入一条规则swf,阻 挡的将不只是以swf结尾的地址, http://www.example.com/swf/index.html 同样也会被阻挡。

要解决这个问题的办法就是:使用管线符号(|)来代表网址的最前端或最末端。例如:过滤规则swf| 会 阻挡 http://example.com/annoyingflash.swf 但不会阻挡http://example.com/swf/index.html 。 过滤规则|http://baddomain.example/ 会阻挡http://baddomain.example/banner.gif 而 不会阻挡http://gooddomain.example/analyze?http://baddomain.example

有时你想阻止http://example.com/banner.gifhttps://example.com/banner.gif 以 及 http://www.example.com/banner.gif 。这时只需把两个管线符号(|| )放到 过滤规则的域名前面。||example.com/banner.gif 会阻挡上面的地址,而不会阻挡http://badexample.com/banner.gif 或 者http://gooddomain.example/analyze?http://example.com/banner.gif (需 要 Adblock Plus 1.1 或更高版本).

标记分隔符

通常你需要接受过滤规则的任何分隔符。例如,你可能写这样的一个规则:阻挡http://example.com/http://example.com:8000/ 但是不阻挡http://example.com.ar/ 。 这里的符号()用作一个分隔符。{{{http://example.com }}} (需要的AdBlock加1.1或更高).

分隔符可以是除了– . %之外的任何字符或数字。这个地址的结尾也是作为一个分隔符下面的例子中所有的分隔符以红色标记出:http://example.com:8000/foo.bar?a=12&b=%D1%82%D0%B5%D1%81%D1%82 。 所以这个地址可以通过过滤规则^example.com^ 或者^%D1%82%D0%B5%D1%81%D1%82^ 或者^foo.bar^ 过滤

注释

任何以感叹号(!)开始的规则,都被视为注释。在过滤规则的列表中,仍然会显示这些规则,但会用灰色的字来显示,而不是黑色。 Adblock Plus在判断规则时,会忽略这些注释,所以我们可以写下任何我们想写的东西。你可以在一条规则上面写下这条规则是做什么用的。也可以在过滤列表的上方写 上作者信息(大多数过滤列表的作者已经这样做了)。

进阶功能

本章节描述的特性通常只有高级用户和维护过滤列表的作者才会看。一般使用者可以跳过。

指定过滤规则选项

Adblock Plus可以让你指定某些选项来改变某条规则的行为。你列举这些选项的时候将它们放在美元符号($)后面并用逗号(,)分割这些选项,放在过滤规则的最后 面。例如:

*/ads/*$script,match-case

这里的*/ads/* 是真实的过滤规则,scriptmatch-case 是 它指定的选项。以下是目前支持的选项:

  • 类型选项:判定过滤规则(或例外规则) 过滤元素的类型。过滤规则可以明确指定多种元素类型可以指定的类型包括:
    1. script —— 外部脚本,由HTML script标签加载
    2. image —— 一般图片,通常由 HTML 的 img 标签所载入
    3. background ——背景图片,通常用CSS指定
    4. stylesheet —— 外部CSS 样式表
    5. object —— 由浏览器插件处理的内容,例如Flash或Java
    6. xbl —— xbl绑定(通常由 -moz-binding CSS属性加载) 需要Firefox 3或更高版本
    7. ping pings 需要Firefox 3或更高版本
    8. XMLHttpRequest XMLHttpRequest 对 象 开始的请求 需要Firefox 3或更高版本
    9. object-subrequest —— 插件的请求,比如Flash 需要Firefox 3或更高版本
    10. dtd —— 通过XML文档加载的DTD文件 需要Firefox3或更高版本
    11. subdocument —— 内嵌的页面,通常通过HTML的框架方式内嵌
    12. document —— 网页本身(只有 例外规则 适用)
    13. other —— 其他不在上面的类型的请求,(在Firefox 2 中,这个包括XBL bindings, XMLHttpRequests )
  • 反 转类型选项:指定过滤规则 不应用的元素类型。可以指定的类型选项: ~script, ~image, ~background, ~stylesheet, ~object, ~xbl, ~ping, ~xmlhttprequest, ~object-subrequest, ~dtd, ~subdocument, ~document, ~other
  • third-party/first- party请求限制:如果指定third-party选项,则过滤规则只适用于来源与当前正在浏览的页面的不同的请求。类似地,~third-party 适用于来源与当前浏览页面相同的请求。
  • 域名限制:domain= example.com 指过滤规则只适用于 了”example.com”下的页面。多个域名,可以用”|”分隔:过滤规则 domain=example.com|example.net 将 只适用于”example.com”或”example.net”的页面。如果一个域名是前面有”~”,则该规则不适用于这个域名的页面。例如,domain=~example.com 指 过滤规则适用于除了example.com 之外的任何域名的页面,但domain=example.com|~foo.example.com 限 制了过滤规则适用于”example.com”但是不包括”foo.example.com”。
  • match-case —— 使过滤规则只适用于匹配地址,例如规则*/BannerAd.gif$match-case 将阻止http://example.com /BannerAd.gif 但是不阻止http://example.com/bannerad.gif
  • collapse —— 这个选项将覆盖全局“折叠屏蔽元素”,并确过滤规则总是折叠元素。类似地,~collapse选项将确保过滤规则不折叠元素

使用正则表达式

如果你想更好地控制您的过滤规则,什么匹 配,什么不匹配,你可以使用正则表达式。例如过滤规则{{{/banner/d+/}}会匹配matchbanner123banner321 但 是不匹配banners 。您可以查看 正则表达式的文档 来学习如何写正则表达式。

:你 不应该 为了加快处理您的过滤列表而使用正则表达 式。你可能听过类似的说法,但其实那已经过时了。从 Adblock Plus 0.7 开始,基本过滤规则的处理已经比正规表达式快了。

元素隐藏

基本规则

有时你可能会发现无法阻挡某些内嵌在网页中的文字广告。如果查看源码的话,可能发现类似这样的代码:

    
<div
 
class
=
"textad"
>

    Cheapest tofu, only here and now!
    
<div>

    
<div
 
id
=
"sponsorad"
>

    Really cheap tofu, click here!
    
<div>

    
<textad>

    Only here you get the best tofu!
    
</textad>

因为你必须下载页面的内容,所以你也必须下载这些广告。对于这种情况,你可以做的就是-把这些广告藏起来,这样你就不会看到他 们了。这也就是元素隐藏的意义所在。

上面代码中的第一则广告是在一个class属性为 “textad”的div 容器内。过滤规则#div(textad) 可以把它给隐藏起来。这里的##表明这是一条定 义了元素隐藏的选择符的元素隐藏规则类似地,您可以通过他们的id属性隐藏属性, #div#sponsorad 将隐藏的第二广告。你 也可以不必指定元素名称,用#*(sponsorad) 也可以。你也可以仅指定要阻挡的元素名称来隐藏,例如:##textad 可 以阻挡第三则广告。

在不查看页面源码的情况下,Element Hiding Helper extension 帮助选择正确的元素并写出相应的规则基础的HTML知识还是很有用的。

: 元素隐藏规则与普通过滤规则的工作方式有很大的差别。元素隐藏规则不支持通配符。

隐藏元素:限定在特定域名的规则

通常你只想要隐藏特定网站的特定广告,而不希望规则会作用于其他网站。例如:#*(sponsor) 可 能会把某些网站的有效代码也隐藏了。但如果你把隐藏规则写成example.com##*(sponsor) ,这规则就只会作用在 http://example.com/http://something.example.com/ ,但不作用在http://example.org/ 。 你也可以指定多个域名-只要用逗号(,)分隔即可,例如: domain1.example,domain2.example,domain3.example##*(sponsor)

如果在域名之前有“ ~ ” ,该规则将 适 用于这个域名的页面。(需要的AdBlock加1.1或更高) 。例如, ~example.com##*.sponsor 将适用于出 了“example.com”之外的域名。 example.com|~foo.example.com##*.sponsor 适用于 “example.com”域名以及除了 “foo.example.com“外的字域名。

:由于元素隐藏实际实现的关系,你只可以将隐藏规则限制在完整的域名。你不能使用网址的 其他部份,也不可用 domain 代替domain.example,domain.test

:限制域名的元素隐藏规则也可用来隐藏浏览器的使用界面。例如, 过滤规则browser##menuitem#javascriptConsole 会隐藏Firefox的工具菜单上的JavaScript控制台。

属性选择符

一些广告隐藏起来并不容易——这些文字广告不仅没有id也没有class属性。你需要使用其他属性来隐藏这些广告,例如:##table[width=80%] 可 以隐藏拥有width属性值为80%的表格元素。如果你不想隐藏这个属性的所有值,##div[title*="adv"] 会隐藏所有title 属 性包含adv 字符的div 元素。你还可以检查属性的开始和结束字符。例如##div[title^="adv"][title$="ert"] 会 隐藏以adv开始并且以ert结束的div元素。正如你所见,你可以使用多个条件,table[width="80%"][bgcolor="white"] 会 隐藏宽度设为80% 、背景色(bgcolor)属性为白色的表格元素。

高 级选择符

一般情况下,Firefox支持的 CSS选择符都可用于元素隐藏。例如:下面的规则会隐藏跟在class 的属性为adheaderdiv 元 素后的所有东西:##div.adheader + * 。完整的CSS列表请查阅W3C的CSS规范(Firefox目前并没有支持所 有的选择符)。

:这个功能是给高级使用者使用的,你可以通过CSS选择符很舒 服地去使用它。Adblock Plus 无法检查选择符的语法是否正确,如果你使用无效的 CSS 语法,你可能会破坏其他你已有的过滤规则。建议使用 JavaScript Console 检查是否有 CSS 错误。

简单元素隐藏语 法

Adblock Plus 只向后支持简单元素隐藏语法 (例如#div(id=foo) )。 使用这个语法是不好的,用CSS选择符才是首选。对这个语法的支持可能在以后的某个时间就不支持了。

Chain socks with http proxy upstream

Dante support both socks(socks4/socks5) and http proxy as upstream proxy.

logoutput: /var/log/sockd.log

internal: 0.0.0.0 port=1080
external: eth0

clientmethod: none
socksmethod: none

user.privileged: root
user.notprivileged: nobody

timeout.negotiate: 30
timeout.io: 86400

client pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}

socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
protocol: tcp udp
}

route {
from: 0.0.0.0/0 to: 0.0.0.0/0 via: HTTP_PROXY_IP port = HTTP_PROXY_PORT
proxyprotocol: http
command: connect
protocol: tcp
method: none
}

road warrior & ssh share port 443

With help of SNI in stunnel,  we can  support both  road warrior and ssh function on the same TCP/443 port.

 

VPS Server:

Install  stunnel v5.31 with  openssl  v1.0.2, and listen on port 443

Install dante v1.4.1,  and listen on port 1080

Install openssh, and listen on port 22

 

Stunnel config for VPS server

chroot = /var/lib/stunnel/
pid=/stunnel.pid
setuid = stunnel
setgid = stunnel

;debug =debug
debug = err
;foreground = yes

log = append
;log = overwrite
output = /stunnel.log

cert = /etc/stunnel/stunnel.pem
;key = /etc/stunnel/stunnel.pem

verify = 3
CApath = /certs

; performance
socket = l:TCP_NODELAY=1

;compression = deflate
compression = zlib

[tls]
accept = 0.0.0.0:443
connect = 127.0.0.1:1080

[ssh]
sni = tls:22.vps.server.net
connect = 127.0.0.1:22

[socks]
sni = tls:vps.server.net
connect = 127.0.0.1:1080

 

stunnel listen on 22 for ssh connection

stunnel listen on 1080 for socks connection

 

Stunnel config for client within Corp’s network:

chroot = /var/lib/stunnel/
pid=/stunnel.pid
setuid = stunnel
setgid = stunnel

;debug = alert/crit/err/warning/notice/info/debug
debug = err

;foreground = yes

cert = /etc/stunnel/stunnel.pem

;compression = deflate | zlib
compression = zlib

client = yes

; performance
socket = l:TCP_NODELAY=1

[socks-http-proxy]
accept = 127.0.0.1:1080
connect = http_proxy_ip:http_proxy_port

protocol = connect
protocolHost = vps.server.net:443

[ssh-http-proxy]
accept = 0.0.0.0:22
connect = http_proxy_ip:http_proxy_port
protocol = connect
protocolHost = vps.server.net:443
sni = 22.vps.server.net

 

 

How to

Road Warrier: 

set socks proxy of browser to 127.0.0.1:1080

 

SSH to vps.server.net

ssh -p 22  user@localhost

 

redsocks

http://darkk.net.ru/redsocks/

redsocks – redirect any TCP connection to a SOCKS or HTTP proxy

redsocks   is   a  daemon  running  on  the  local  system,  that  will
       transparently tunnel any TCP connection via a remote SOCKS4, SOCKS5  or
       HTTP  proxy  server. It uses the system firewall's redirection facility
       to intercept TCP connections, thus the redirection is system-wide, with
       fine-grained control, and does not depend on LD_PRELOAD libraries.

 

Redsocks是一个开源的网络程序,允许你将所有TCP连接重定向到SOCKS货HTTPS代理,代码依赖开源的libevent网络库。

使用环境:Linux/iptables, OpenBSD/pf 和 FreeBSD/ipfw,在Linux/iptables下已经过很好的测试。

一些Android应用也使用了redsocks,如:ProxyDroid,sshtunnel

 

特点:

可以将任何TCP连接重定向到SOCKS4,SOCKS5,HTTPS(HTTP / CONNECT)代理服务器。

支持SOCKS5/HTTPS登录/密码身份验证。SOCKS4仅支持用户名,密码将被忽略。HTTPS,目前仅实现基本和摘要方案的支持。

通过SOCKS5代理服务器,重定向UDP数据包。注:UDP包还是通过UDP发送,所以你不能通过OpenSSH中继UDP。

针对UDP DNS查询,回复”truncated reply”

重定向任何HTTP连接到不支持透明代理的代理服务器(如老的SQUID)。

官方网站:http://darkk.net.ru/redsocks/

项目代码托管:https://github.com/darkk/redsocks

 

redsocks源码阅读

https://blog.phpgao.com/redsocks_config.html

转:通过 stunnel 搭建安全高性能的 sockts 代理服务器

http://bird1110.blogspot.com/2011/01/using-stunnel-through-proxy.html

 

一般来说要搭建一个本地的 socks 代理只需要简单的 ssh -D, 就可以生成一个代理了. 这样作为零时方案挺不错的, 工作上服务器一般会被反向代理, 通过 ssh 就可以隐射到本地通过浏览器进行调试了, 但如果需要长期使用的话. 这样的方案也有不少的麻烦.

通过 ssh -D 他和服务器之间只会有一个连接, 这样网络性能上并不是最好的.
必须使用 openssh 才可以 -D, 一般路由器常用的 dropbear ssh 客户端不能使用 -D.
需要通过 autossh 自动重连, 但如果网络频繁切换(诸如 3G 和 wifi) 还需要辅助脚本来重启 autossh.
也不能提供例如用户名密码交验这样的安全认证功能.

基于以上这么多问题, 有条件的前提下还是自己在服务器端搭 socks 代理, 再通过 stunnel 或者 ssh -L 映射到本地是比较好的解决方案.

安装 socks 代理

方案上是在服务器搭建一个只能本地使用的代理, 再通过其他服务映射到本地. (这里用 danted 来搭 socks 代理. 服务器用的是 ubuntu)

apt-get install -y dante-server

安装完以后将 /etc/danted.conf 开启或加入如下配置

logoutput: syslog
internal: 127.0.0.1 port = 1080
external: eth0

clientmethod: none
method: none

user.privileged: proxy
user.notprivileged: nobody
user.libwrap: nobody

extension: bind
connecttimeout: 30
iotimeout: 86400

client pass {
from: 127.0.0.1/8 to: 127.0.0.1/8
log: connect error
method: none
}
client block {
from: 0.0.0.0/0 to: 0.0.0.0/0
method: none
}
pass {
from: 127.0.0.1/8 to: 0.0.0.0/0
command: bind connect udpassociate
log: connect error
method: none
}
pass {
from: 0.0.0.0/0 to: 127.0.0.1/8
command: bindreply udpreply
log: connect error
method: none
}
block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}

按上述配置就可以搭出一个只能本地使用的 socks 代理, 接着用 service danted start 启动代理
服务端 stunnel 配置

stunnel 用来和客户端之间建立一条加密的链接, 这里还需要对客户端做认证, 确保只有拥有证书的客户端才可以链接. 终端输入:

apt-get install stunnel

安装好 stunnel 后还需要生成一个服务器的证书. 这里由于只用来加密通讯, 所以证书可以不用很复杂和正规.

cd /etc/stunnel
mkdir -p /var/lib/stunnel4/certs
ln -s /var/lib/stunnel4/certs /etc/stunnel/certs
openssl req -new -x509 -days 3650 -nodes -config /usr/share/doc/stunnel4/examples/stunnel.cnf -out stunnel.pem -keyout stunnel.pem

然后再编辑 /etc/stunnel/stunnel.conf

chroot = /var/lib/stunnel4/
setuid = stunnel4
setgid = stunnel4
pid = /stunnel4.pid

cert = /etc/stunnel/stunnel.pem
;key = /etc/stunnel/stunnel.pem

verify = 3
CApath = /certs

; performance
socket = l:TCP_NODELAY=1

[danted]
accept = 1081
connect = 1080

把本地的 1080 端口映射成 1081, 接着编辑 /etc/default/stunnel4 将其中的 ENABLED=0 修改成 ENABLED=1 然后再输入 service stunnel4 start 启动服务.

 

 

客户端 stunnel 配置

之前已经把服务器端配置完成了, 接下来需要在客户端配置 stunnel 好将端口映射到本地. 还是以 ubuntu 为例, 输入:

apt-get install stunnel

然后生成一个客户端的证书

cd /etc/stunnel
openssl req -new -x509 -days 3650 -nodes -out client.pem -keyout client.pem

这里需要注意的是为了区分证书, 每个证书都需要输入对应不同的信息, 然后将生成的 client.pem 复制到服务器的 /etc/stunnel/certs 目录下, 接着需要在 服务器 输入:

cd /etc/stunnel/certs
$(/usr/lib/ssl/misc/c_hash p.wido.me.pem | awk ‘{print “ln -s ” $3 ” ” $1}’)

stunnel 需要通过 c_hash 才能找到对应的证书.

然后在 客户端 加入配置文件 /etc/stunnel/client.conf

chroot = /var/lib/stunnel4/
setuid = stunnel4
setgid = stunnel4
pid = /stunnel4-client.pid

cert = /etc/stunnel/client.pem
client = yes

; performance
socket = r:TCP_NODELAY=1

[danted]
accept = 127.0.0.1:1080
connect = [HOST]:1081

其中的 [HOST] 为服务器的域名或者IP. 接着还是将 /etc/default/stunnel4 的 ENABLED=0 设置成 1, 接着启动 service stunnel4 start 就可以在客户端建立出一个端口为 1080 的 socks 代理了.

 

 

 

最后

由于服务器配了客户端证书认证, 所以只有添加证书的用户可以连上这台服务器. 同样的方法也可以映射其他的服务, 比如 polipo.

对于有些对 stunnel 支持不好的设备, 也可以用 ssh -L 来映射这个 1080 的端口而不用 -D 参数.
参考资料

http://www.bock.nu/blog/secure-firewall-bypass-danted-stunnel
http://igfw.net/archives/11430