优缺点
优点: 客户机简单易用,仅需要修改 dns 即可,甚至局域网内可以不需要做任何修改:主路由修改 dns,则通过网线或 wifi 连接到路由的客户机自动获取到目标 dns。缺点: 需要目标网站支持 https,对于不支持 https 的网站无效。
方案及原理
服务器A: 墙外的 sniproxy 在远端 vps 上监听 443 端口的请求,根据 tls 域名信息来做 https 流量的透明代理。服务器B: (注意最好是局域网内的机器如路由器或 NAS)
1. 将所有的 443 端口流量定向到服务器A 443 端口。可以使用 iptables, socat, sniproxy, haproxy 等。
2. nginx 将所有的 80 端口请求做 HTTP 302 跳转到 443
3. dnsmasq 提供一个dns解析服务器,将所有的被污染域名解析到服务器B IP地址,未被污染的域名使用国内的域名服务如
114.114.114.114
或 223.5.5.5
解析。客户机C: (如手机、pc等) 修改 dns 设置为服务器 B IP 地址。
原理
A:
104.233.233.233
(监听 443) B: 192.168.0.5
(监听 53, 80, 443) C: 192.168.1.10
1. 客户机 C 在做 HTTP 请求时,通过 B 提供的 DNS 解析域名,如果是国内网站的域名则直接返回正确的地址,否则返回 服务器B 的IP。如访问
http://google.com
时 dns 查询返回了 192.168.0.52. 客户机 C 访问
http://192.168.0.5:80 (host: google.com)
后被重定向到 443 端口,客户机 C 继续访问 https://192.168.0.5:443 (host: google.com)
3. 服务器 B 收到 443 端口的请求后,对 tcp 连接定向到 服务器 A 443 端口 即
https://104.233.233.233:443 (host: google.com)
。4. 服务器 A 收到 443 端口的请求后,检查域名 (
google.com
) 并根据域名做透明代理,即 https://google.com
为什么要在本地监听 80 端口?为什么不直接将 dns 解析结果返回 服务器A IP 地址?
如果直接返回 服务器A IP 地址,客户机 C 在访问
http://104.233.233.233 (host: google.com)
时就会导致 tcp reset 而使访问中断。通过在本地局域网监听 80 端口做 302 跳转到 443 后,可以避免这种错误出现。配置示例
服务器A:/etc/sniproxy.conf
user daemon
pidfile /var/run/sniproxy.pid
error_log {
syslog daemon
priority notice
}
listen 104.233.233.233:443 {
proto tls
table https_hosts
access_log {
filename /var/log/sniproxy/https_access.log
priority notice
}
}
table https_hosts {
.* *:443
}
服务器B:/etc/sniproxy.conf
user daemon
pidfile /var/run/sniproxy.pid
error_log {
syslog daemon
priority notice
}
listen 443 {
proto tls
table https_hosts
access_log {
filename /var/log/sniproxy/https_access.log
priority notice
}
}
table https_hosts {
.* 104.233.233.233:443
}
/etc/nginx/sites-enabled/default
server {
listen 80 default_server;
server_name _;
if ($ssl_protocol = "") {
return 302 https://$http_host$request_uri;
}
}
/etc/dnsmasq.conf
conf-dir=/etc/dnsmasq.d
listen-address=0.0.0.0
no-resolvserver=8.8.4.4
server=8.8.8.8
address=/#/192.168.0.5
/etc/dnsmasq.d/accelerated-domains.china.conf
下载
https://github.com/felixonmars/dnsmasq-china-list/raw/master/accelerated-domains.china.conf
文件/etc/dnsmasq.d/extra.conf
# 手动添加不需要代理的域名列表
server=/baidu.com/114.114.114.114
from https://github.com/freedocs/docs/blob/master/%E4%BD%BF%E7%94%A8%20sniproxy%20%2B%20dnsmasq%20%2B%20nginx%20%E8%AE%BF%E9%97%AE%E4%BA%92%E8%81%94%E7%BD%91.md
-----------
翻墙辅助工具之sniproxy
自打天朝政府封掉Google后,想访问个开源软件都不能,实在是太郁闷了。做了openvpn翻墙后,后遗症太大,整个路由都被带往国外了,国内和办公网都不能访问 了,不合适。所以必须要做一个不动网络基本结构,按需访问的代理,即需要访问google的时候才访问。原理很简单,在内网投毒DNS,把google指向自己的代理服务器,从那里出去就可以了。sniproxy+dnsmasq就很适合网上全都是sniproxy的debian或ubunto的教程,放一篇CentOS的教程吧,步骤如下:一、去www.bluevm.com申请个最便宜的虚机,openvz的,7.5$一年,50元一年吧。 每个月100GB带宽,足够用了。二、在bluevm的控制台选择CentOS 6.4-64 minimal即可,我们就是为了翻墙,别无它用。然后装开发包:
1234 yum -y install unzipyum -y groupinstall "Development tools"yum -y install pcre-devel pcreyum -y install dnsmasq三、安装辅助包libev4:
123456 wget http://dist.schmorp.de/libev/libev-4.19.tar.gztar zxvf libev-4.18.tar.gzcd libev-4.18./configure --prefix=/usr/local/libev4makemake install四、安装辅助包udns,不装这个的话,sniproxy无法对*泛域名解析,这个东西也很奇怪,没有./configure –prefix的选项,干脆一锅端到/usr/local/udns好了
1234567 wget http://archive.ubuntu.com/ubuntu/pool/universe/u/udns/udns_0.4.orig.tar.gztar zxvf udns_0.4.orig.tar.gzcd udns-0.4./configuremakecd ..mv udns-0.4 /usr/local/udns五、装sniproxy,注意,autogen.sh的时候会报错,那是debian的错,忽略
12345678910 wget https://github.com/dlundquist/sniproxy/archive/master.zipunzip -x master.zipcd sniproxy-master/export CFLAGS='-I/usr/local/libev4/include -I/usr/local/udns'export LDFLAGS='-L/usr/local/libev4/lib -L/usr/local/udns'export LD_LIBRARY_PATH=/usr/local/libev4/lib:$LD_LIBRARY_PATH./autogen.sh./configure --prefix=/rootmakemake install六、这样sniproxy就装到了/root/sbin/sniproxy,建立一个配置文件:
1234567891011121314151617181920 vi /etc/sniproxy.confuser nobodylisten 80 {proto httptable http_hosts}table http_hosts {.* *:80}listen 443 {proto tlstable https_hosts}table https_hosts {.* *:443}七、/root/sbin/sniproxy启动,ps看一下,进程在就说明启动成功了,注意,以后要再启动sniproxy,一定要把那三句export执行一下,否则找不到库,无法启动:
1 /root/sbin/sniproxy八、在自己内网的一台机器上装dnsmasq
123456789101112131415161718 yum -y install dnsmasqvi /etc/dnsmasq.confdomain-neededbogus-privno-resolvno-polladdress=/www.google.com/google.com/x.x.x.xaddress=/www.gmail.com/gmail.com/x.x.x.xserver=10.45.240.18server=10.45.240.19#AliDNSserver=223.5.5.5server=223.6.6.6server=8.8.8.8server=8.8.4.4九、启动dnsmasq
1 service dnsmasq start注意,第八步中server=10.45.240.18和19是公司内网的服务器,剩下的是公网的公共dns。我们只污染了www.google.com和www.gmail.com两个域名,x.x.x.x就是你bluevm的服务器地址,如果想访问facebook、twitter的话,同样污染就可以了。十、把自己的机器的dns指向内网运行dnsmasq的服务器的地址就可以访问google了。另外,如果不跑dnsmasq也是可以的,linux的机器就直接修改/etc/hosts
12 x.x.x.x www.google.comx.x.x.x www.gmail.comWindows的机器就修改c:/windows/system32/drivers/etc/hosts同样污染google的域名就可以了。--------相关帖子:
No comments:
Post a Comment