试试看见光了多久死hhhhhh
原理
实验表明,我国自主研发的高科技防火墙型网络设备(以下简称GFW)具有以下特征:
- 对所有目标端口上的流量存在字符串过滤,如HTTP和明文的邮件消息
- 对443端口存在主动探测或举报机制(具体情况不明),表现为具有包括Google、Twitter等的CN在内的证书的ip会在半个月后被墙
- 目前,GFW对非443端口上流经的HTTPS流量不存在第2条所述的措施
注:也可以是用SNI Proxy来隐藏证书,主动探测一般情况下不会使用SNI扩展来探测443端口的证书。可以使用这篇博客中提到的项目lua_resty_sniproxy。
优点
- 省电,和正常上网耗电一致,且移动设备可保持长连接在线
- 不用怕hosts文件被上传,因为本来里面的ip都是被墙的
- 可以与socks代理同时使用,无需切换hosts
- 适用于重度Google用户
局限
- 运行Windows并且直接连接互联网的设备将无法使用本方法
- 运行未root的Android设备及未越狱的iOS设备在使用移动网络时无法使用本方法
- 必须能控制路由器或设备的上级网关的iptables设置(如刷了openwrt之类的路由器);如果路由器无法刷第三方ROM,但局域网中存在任意一台*nix设备,请参见使用非443端口转发https流量扶墙(二)
- 只对HTTPS流量起作用,本文主要介绍Google全线服务以及Twitter的操作实例
- 覆盖面窄,如果要覆盖更多网站,需要更复杂的配置
步骤
- 将目标IP根据证书类型合并,即证书具有相同的DNS名称的服务归为一类。归类的作用是接来下可以少写很多iptables规则。对Google来说,只要具有泛域名为*.google.com, *.googleusercontent.com, *.googleapis.com的证书的三类IP就可以了。此处的IP不需要能够直连。甚至可以填一个无法路由的地址,只要在接下来的iptables中对应即可;但是这样的话,使用代理时如果使用本地解析的(无法路由的)IP,将会无法连接。
- 将以上列表填入hosts。文末给出了实例配置。如果未越狱或未root,不具有修改hosts文件的权限,可以在路由器中写死DNS解析;但是在移动网络下就没有办法了。我们假设hosts中有这样一些项
1234574.125.224.55 www.google.com74.125.224.55 m.google.com216.58.216.14 accounts.google.com216.58.216.14 accounts.google.com.hk216.58.216.14 accounts.youtube.com - 在VPS上设置端口转发,可以使用iptables。我使用nginx(编译stream_module)作转发,文末有示例配置。Ubuntu/Debian可以这样安装:
1$ sudo apt-get install libnginx-mod-stream - 在路由器上设置转发规则:
12iptables -t nat -A PREROUTING -p tcp -d 74.125.224.55 --dport 443 -j DNAT --to-destination 66.66.66.66:44312iptables -t nat -A PREROUTING -p tcp -d 216.58.216.14 --dport 443 -j DNAT --to-destination 66.66.66.66:44311
其中66.66.66.66是你VPS的IP,并且将44300的入站流量转发到74.125.224.55:443。如果是直接连接互联网的设备(如linux的pc或移动网络下的Android,将PREROUTING链改为OUTPUT):
12iptables -t nat -A OUTPUT -p tcp -d 74.125.224.55 --dport 443 -j DNAT --to-destination 66.66.66.66:44312iptables -t nat -A OUTPUT -p tcp -d 216.58.216.14 --dport 443 -j DNAT --to-destination 66.66.66.66:44311
注意如果在Android上使用Shadowsocks的NAT模式,关闭ss后需要重新设置iptables规则。
附件
- 示例hosts配置(见压缩包或Gists)(本地)
- 示例nginx配置(VPS上)
123456789101112131415161718192021222324252627282930313233343536373839404142stream{server {listen 44310;proxy_pass tw1;}upstream tw1 {server 199.16.158.106:443;}server {listen 44311;proxy_pass gg1;}upstream gg1 {server 216.58.216.14:443;}server {listen 44312;proxy_pass gg2;}upstream gg2 {server 74.125.224.55:443;}server {listen 44313;proxy_pass gg3;}upstream gg3 {server 216.58.216.138:443;}server {listen 44314;proxy_pass gg4;}upstream gg4 {server 216.58.217.193:443;}} - 对应的iptables配置示例(路由器上)
1234567891011iptables -t nat -A OUTPUT -p tcp -d 199.16.158.106 --dport 443 -j DNAT --to-destination 66.66.66.66:44310iptables -t nat -A OUTPUT -p tcp -d 216.58.216.14 --dport 443 -j DNAT --to-destination 66.66.66.66:44311iptables -t nat -A OUTPUT -p tcp -d 74.125.224.55 --dport 443 -j DNAT --to-destination 66.66.66.66:44312iptables -t nat -A OUTPUT -p tcp -d 216.58.216.138 --dport 443 -j DNAT --to-destination 66.66.66.66:44313iptables -t nat -A OUTPUT -p tcp -d 216.58.217.193 --dport 443 -j DNAT --to-destination 66.66.66.66:44314iptables -t nat -A PREROUTING -p tcp -d 199.16.158.106 --dport 443 -j DNAT --to-destination 66.66.66.66:44310iptables -t nat -A PREROUTING -p tcp -d 216.58.216.14 --dport 443 -j DNAT --to-destination 66.66.66.66:44311iptables -t nat -A PREROUTING -p tcp -d 74.125.224.55 --dport 443 -j DNAT --to-destination 66.66.66.66:44312iptables -t nat -A PREROUTING -p tcp -d 216.58.216.138 --dport 443 -j DNAT --to-destination 66.66.66.66:44313iptables -t nat -A PREROUTING -p tcp -d 216.58.217.193 --dport 443 -j DNAT --to-destination 66.66.66.66:44314