newifi break the gfw

gfw封网真是头疼,已经用了三年的VPN,本来翻墙好好的,无赖换广电宽带的时候,安装小哥把路由器重置了一下,再也配不成功。了解到VPN太容易被封,于是找其他方案,最后看中了SS。SS出来不久,等我知道SS的时候,SS作者已经被请喝茶,然后停止维护了。最近买了一个VPS,架个SS SERVER,本想或许还可以安个nginx,VPS配置太低也就只能架个SS SERVER,当个breakwall用。

SS当然是要配置到路由器上,那样全部设备都可以passby wall,但是全局SS配置 影响大陆的常用网站比如baidu,youku,jd啥的,比较影响正常使用。

了解了一下gfw封网的方式,一个是封IP,所有连接到这个IP的包都会被 丢掉,因为国外ip资源太多,封的固定IP较少,另外一个是DNS污染。

DNS污染较复杂,介绍一下。DNS协议规定了用使用客户端和服务器使用53端口可以用明文传送,使用UDP或者TCP协议传输,因为考虑到DDOS之类的,实际上大部分操作系统都是用UDP请求DNS。默认情况下当连接到运营商网络时,自动获取到IP地址时会同时获得一个DNS服务器,这个就是运营商的DNS,DNS采用树形查询,从当前运营商的DNS逐级向上查询,直到根服务器,早期的gfw,在这些DNS服务器中做手脚,当遇到一些敏感网站时返回一个错误结果,这样可以将DNS设置为国外的DNS服务器(8.8.8.8等),跳过DNS污染直接解析到正确的IP。道高一尺,魔高一丈,这个漏洞很快就发现了,然后建立了一真正的wall,在出口路由器上想办法,DNS协议很容易被识别,只要在出口服务器上做出识别,只要是DNS请求,返回一个错误IP,gfw并不把真正的请求丢掉,DNS协议中允许UDP可以被抢答,就这样在国外真实DNS server响应之前就返回一个错误IP,客户端只会把最先到达的请求拿来使用,就这样子把DNS给污染了。但是DNS协议支持TCP查询的,那时的gfw也并不封TCP dns协议,于是就这么跑了一段时间。应用多了之后gfw升级,会发现tcp协议查询总是被断开,TCP查询得不到任何结果。又有高手伴着研究DNS和UDP协议,发现eDNS标记,当查询DNS带此标记,正常支持此标记的服务器也会返回此标记,然后gfw返回的dns查询不会带此标记。高手们很快就实现了一套DNS客户端,并能将一些常见的错误IP地址过滤,针对此时的gfw基本上可以完全通过,而又不影响国内网站的访问。这个漏洞太容易被堵住了,不知道能坚持多久。

 

DNS协议中还有一个支持加密查询协议,dnscypt, opendns出了这么一个客户端,目前应用较广泛,可以暂时应对。目前在路由器用的此方案。

因为SS可以翻墙,为何不将DNS查询通过ss通道呢,因为我搞了好久没搞出来。

现在介绍一下我的翻墙策略

 

dnsmasq占据53端口,当作路由器默认的dns server,所有的dns查询都发送到dnsmasq,dnsmasq忽略运营商DNS和解析文件,将DNS请求发送至pdnsd 的5300端口。pdnsd中配置一个114.114.114.114的国内dns服务器,就可以正确解析国内的地址请求,其实可以直接设置成运营商的dns,但会被dns劫持给加点小广告啥的,这样子设置缺点当然也是有的,一些有配置有CDN的网站无法返回最快的服务器。另外再配置一个dnscypt的代理,当114无法解析成功时,将DNS请求转发到本地的5353端口,dnscypt监听此端口,并用加密协议向dns加密服务器查询,这样基本上可以返回一个正确的DNS结果。DNS返回正确结果后就可以通过SS走代理正确访问了。

国内路由表当作白名单,所有国内IP地址都不走SS代理。于是当你访问baidu查询本机IP时,你得到的是运营商的ip,而通过google查本机IP时,却得到的SS server ip.

The wall has been broken.

贴一下各配置文件以后备忘

gfw所封的网址 https://github.com/gfwlist/gfwlist

中国路由表

redsocks2

config redsocks2_redirect
option local_port '11111'
option proxy_type 'shadowsocks'
option ip 'xx.xx.xx.xx'
option port '9000'
option enc_type 'aes-256-cfb'
option password 'xxxxxxx'
option autoproxy '0'
option local_ip '0.0.0.0'

config redsocks2_autoproxy
option no_quick_check_seconds '300'
option quick_connect_timeout '2'

config redsocks2_ipcache
option cache_size '4'
option cache_file '/tmp/redsocks2_ipcache.txt'
option stale_time '7200'
option autosave_interval '3600'
option port_check '0'

config redsocks2_udprelay
option local_ip '0.0.0.0'
option local_port '1153'
option ip '1.2.3.4'
option port '1234'
option proxy_type 'shadowsocks'
option udp_timeout '3'
option enc_type 'rc4-md5'
option password 'foobar'
option dest_ip '8.8.8.8'
option dest_port '53'

config redsocks2_iptables
option dest_port '11111'
option blacklist_enabled '0'
option whitelist_enabled '1'
option ipset_whitelist '/etc/chinadns_chnroute.txt'

 

DNSMASQ

转发至127.0.0.1#5300,忽略HOSTS文件,不解析文件

PDNSD

 

global {
perm_cache=1024;
cache_dir="/var/pdnsd";
# pid_file = /var/run/pdnsd.pid;
run_as="nobody";
server_ip = 127.0.0.1; # Use eth0 here if you want to allow other
# machines on your network to query pdnsd.
server_port = 5300;
debug = on;
status_ctl = on;
par_queries=1;
# paranoid=on; # This option reduces the chance of cache poisoning
# but may make pdnsd less efficient, unfortunately.
query_method=tcp_only;
min_ttl=15m; # Retain cached entries at least 15 minutes.
max_ttl=1w; # One week.
timeout=10; # Global timeout option (10 seconds).
neg_domain_pol=on;
udpbufsize=1024; # Upper limit on the size of UDP messages.
}

# The following section is most appropriate if you have a fixed connection to
# the Internet and an ISP which provides good DNS servers.
server {
label= "LOCAL";
ip = 114.114.114.114; # Put your ISP's DNS-server address(es) here.
proxy_only=on; # Do not query any name servers beside your ISP's.
# This may be necessary if you are behind some
# kind of firewall and cannot receive replies
# from outside name servers.
timeout=4; # Server timeout; this may be much shorter
# that the global timeout option.
uptest=if; # Test if the network interface is active.
interface=eth0; # The name of the interface to check.

 

interval=10m; # Check every 10 minutes.
purge_cache=off; # Keep stale cache entries in case the ISP's
# DNS servers go offline.
# edns_query=yes; # Use EDNS for outgoing queries to allow UDP messages
# larger than 512 bytes. May cause trouble with some
# legacy systems.
reject_policy=fail;
reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
216.221.188.182,216.234.179.13,243.185.187.39;
# policy = excluded;
# exclude=",google.com", # If your ISP censors certain names, you may
# ".youtube.com", # want to exclude them here, and provide an
# ".facebook.com", # alternative server section below that will
# ".android.com"; # successfully resolve the names.
}

dnscrypt-proxy

config dnscrypt-proxy
option address '0.0.0.0'
option port '5353'
# option resolver 'opendns'
# option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'

 

ENJOY

发表评论

电子邮件地址不会被公开。 必填项已用*标注