我们都知道可以使用 nginx 反代功能来实现跨境访问外网,不过,这种方式有很多的制约,比如说很难实现登录验证,比如说需要针对转发模块单独做编译,比如说需要你有一个有效的 ssl 签名证书等等。
这次,我们来介绍另外一款神器 SNI Proxy,是用 dnsmasq 配合 sniproxy 可以实现无证书任意网站反代。它使用SNI 技术将 TLS 连接通过 TCP 代理到目标网站,这样就避免了对代理服务器的证书需求,而且访问到的网站证书也是原原本本的证书。
当然了,既然是基于 sni 技术,那 http 页面是肯定不能代理的,如果目标网站不支持 https,就不行了。
编译 SNI Proxy(可以跳过)
示例环境为 Ubuntu 14.04
从git上克隆 sni的源文件: https://github.com/dlundquist/sniproxy.git
准备环境
1 2 3 4 5 6 7 8 9 |
//安装需要的开发环境 sudo apt-get install autotools-dev cdbs debhelper dh-autoreconf dpkg-dev gettext libev-dev libpcre3-dev libudns-dev pkg-config fakeroot devscripts //编译安装包。 ./autogen.sh && dpkg-buildpackage //安装编译好的安装包 sudo dpkg -i ../sniproxy_<version>_<arch>.deb |
安装配置 SNI Proxy
1 2 3 |
apt-get install python-software-properties add-apt-repository ppa:dlundquist/sniproxy apt-get update && apt-get install sniproxy |
编辑 /etc/sniproxy.conf来开启反代:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
table https_hosts { # Google (.*.|)233.wiki$ * (.*.|)google.com$ * (.*.|)google.com.hk$ * (.*.|)google.co.jp$ * (.*.|)googlehosted.com$ * (.*.|)googleusercontent.com$ * (.*.|)ggpht.com$ * (.*.|)gstatic.com$ * (.*.|)googlemail.com$ * (.*.|)googlecode.com$ * (.*.|)blogspot.com$ * (.*.|)gmail.com$ * (.*.|)appspot.com$ * } table xmpp_imap_smtp { (.*.|)google.com$ * (.*.|)googlemail.com$ * (.*.|)gmail.com$ * } |
像上边这样开启针对某个域名的反代,但是这样太麻烦了,每次新增加一个网站,都需要对这个列表增加——为此,我们为了方便稍微牺牲一点安全性——且我不需要对邮件进行反代(容易被滥用,国外对垃圾邮件服务器是深恶痛绝的。),那么我可以直接这样写:
1 2 3 4 5 6 7 8 9 |
user nobody listen 127.0.0.1:443 { proto tls table https_hosts } table https_hosts { .* *:443 } |
注意:对于 IPv4 来讲,你需要明确地写出要监听的外网地址(将代码中的 127.0.0.1 替换),否则就会只监听 IPv6 了。
这样就只打开了 https 反代,而且是只要被解析到这个服务器的域名都会被反代,这样一来,我们就可以只通过 dnsmasq 的解析来控制哪个域名反代了。(有那么一点安全隐患就是一旦被别人发现,你可能你服务器的流量会意外流失咯~记得监控你的服务器带宽?)
运行 sniproxy
直接使用命令sniproxy 即可运行,默认配置文件就是“/etc/sniproxy.conf”它会自动加载,如果你使用了其他路径或者配置文件名,那么你需要使用“-c”选项来指定路径:
1 |
sniproxy -c /etc/sniproxy.conf |
端口重定向
那么,一般我们访问网站不喜欢输入端口号或者协议名称,那么默认访问的是80端口怎么办?作为辅助,我们安装一个轻量级的 nginx,让它把所有访问80端口的流量转移到443上边去,使用301重定向即可。
注意,针对 Google 等特殊域名,可能即使你做了端口重定向也无法跳转解析,是因为 GFW 能够解包 HTTP 流量,所以你懂的。
我们编辑 nginx 的配置文件“/etc/nginx/sites-available/default”
改为如下内容:
1 2 3 4 5 6 7 8 9 10 11 |
server { listen 80; ## listen for ipv4; this line is default and implied #listen [::]:80 default ipv6only=on; ## listen for ipv6 # Make site accessible from http://localhost/ server_name _; location / { rewrite ^ https://$host$request_uri permanent; } } |
域名解析
sniproxy 搭建成功,但是它是不能被直接访问的,你需要将域名解析过去,这样它才能根据域名来代理你的 ssl 链接,那么你可能就需要在自己的 hosts 上修改解析啦。不过,另外一个更简便的办法是使用 dnsmasq,在我写的一篇文章当中介绍了如何在国内搭建一个自己私有的 dns 服务器来避免 dns 污染,那么,你只需要在这个服务器当中增加 dnsmasq 的解析配置即可。
比如说新增一个 /etc/dnsmasq.d/sni.conf ,往里边写入需要解析到你 sniproxy 服务器的域名即可。为此,我在 github 上新建了一个项目,这里加入了常用网站的解析,你只需要将它下载并且替换里边的 IP 为你 sniproxy 服务器的 IP 即可!
1 2 3 4 |
apt-get install git git clone https://github.com/R0uter/Dnsmasq-sniproxy-conf.git cd Dnsmasq-sniproxy-conf ln -s /root/Dnsmasq-sniproxy-conf/sni.conf /etc/dnsmasq.d/ |
记得修改里边的 IP 地址!
——————
这样,你的 dns 就增加了常见认证网站的自动反代功能!☺️
本文由 落格博客 原创撰写:落格博客 » 部署 SNI Proxy 加速网页访问 反代 无需证书
转载请保留出处和原文链接:https://www.logcg.com/archives/984.html
mark…
“GFW 能够解包 HTTP 流量”,并不是能解包,http数据都是明文传输的,因此没有安全性
是的,http协议在传输时会将数据封包为tcp,读取的时候将tcp数据包解包合并为明文数据,我这里特地用了“解包”而非“解密”,我认为这么描述是合理的。
貌似没用,现在dnsmasq和pdnsd等都不能解决dns污染问题
卧槽!!!!麻痹的 WordPress 的后台回复不能再混蛋一点了啊啊啊啊啊啊!!!
老子写了三遍啊整整三遍!!!!!
=。=算了,我不想写了,气死我了,这个能用,我就用这个,需要两台 vps,国外一个国内一个,绝逼好使。
用typecho啊
啊,这么多年了,换博客系统的话……迁移工作量太大了,就这么着吧哈哈哈哈