Centos 下安装 SNIProxy 实现 hosts 代理
下一篇: 备份
你是否经常使用 hosts 进行科学上网,一般来说为了访问安全和数据隐私,hosts 里面的ip都是官网未被屏蔽的 ip ,比如谷歌、脸书等。不过像 u2b 网站,因为每个视频解析地址都不一样,而且每个地址要找到没被墙的 ip 本身就已经非常困难,所以通过修改 hosts 一般来说是看不了 u2b 视频的(ipv6除外)。现在一些 hosts 之所以能看油管视频就是因为使用的是代理 ip 。
现在有一些 hosts ,里面的 ip 并非官网的 ip ,而是代理ip。下面介绍在 Centos 下如何通过 SNI Proxy 代理搭建 hosts 代理 ip 。在搭建之前先了解下原理。
原理说明
SNI Proxy 类似于一个反向代理软件,可根据域名转发,且 https 使用的原始 ssl 证书。假设你有一台海外 vps ,该 ip 为 45.3.3.3,上面已经安装了 SNI Proxy,配置好后并成功启动。然后在你电脑本地的 hosts 文件下,添加了一条解析记录:
45.3.3.3 www.google.com
这时候你在浏览器访问 https://www.google.com 便能正常访问谷歌页面。这其中的解析过程大致如下:
你在浏览器上输入 www.google.com =》 浏览器查看本地 hosts 文件,发现里面有对应的 dns 解析记录(45.3.3.3 www.google.com),浏览器便把请求数据发送给 45.3.3.3 这台 vps =》 vps 上的 SNI Proxy 监听本地端口,把收到请求数据转发给 https://www.google.com =》 https://www.google.com 收到请求后把响应结果再返回给 SNI Proxy =》 SNI Proxy 最后将响应数据原封不动的返回给你 =》 你在浏览器上看到了正确的结果。
从上面可以看出,SNI Proxy 可以直接代理 https 数据(无需安装 ssl 证书),扮演着流量中转的功能。
功能介绍
支持代理 https ,无需解密流量(一般也解密不了),不需要密钥或证书,
支持 TLS 和 HTTP 协议,
支持后端服务器和监听器的 IPv4,IPv6 和 Unix 域套接字,
支持多个监听套接字。
Centos 下安装 SNI Proxy
安装一些开发工具
yum -y install unzip wget yum -y groupinstall "Development tools" yum -y install pcre-devel pcre
安装辅助包libev4:
wget http://dist.schmorp.de/libev/Attic/libev-4.19.tar.gz tar zxvf libev-4.19.tar.gz cd libev-4.19 ./configure -prefix=/usr/local/libev4 make make install
安装辅助包udns,不装这个的话,sniproxy无法对*泛域名解析.
wget http://archive.ubuntu.com/ubuntu/pool/universe/u/udns/udns_0.4.orig.tar.gz tar zxvf udns_0.4.orig.tar.gz cd udns-0.4 ./configure make cd .. mv udns-0.4 /usr/local/udns
装sniproxy,注意,autogen.sh的时候会报错,那是debian的错,忽略
wget https://github.com/dlundquist/sniproxy/archive/master.zip unzip -x master.zip cd 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=/root make make install
这样sniproxy就装到了/root/sbin/sniproxy,建立一个配置文件:
vi /etc/sniproxy.conf 把一下内容编辑进去:
user nobody resolver { #指定 dns 服务器 nameserver 8.8.8.8 # * ipv4_only query for IPv4 addresses (default) # * ipv6_only query for IPv6 addresses # * ipv4_first query for both IPv4 and IPv6, use IPv4 is present # * ipv6_first query for both IPv4 and IPv6, use IPv6 is present #对于解析的域名只返回 ipv4 的地址 mode ipv4_only } #监听 80 端口的请求数据,即 http listen 80 { proto http table http_hosts access_log { filename /var/log/https_access.log priority notice } } #所以 http 请求都进行转发 table http_hosts { .* *:80 } #监听 443 端口,即 https #这里指定 vps 的ip 代表只监听 ipv4 #这里如果不指定ip,默认监听 ipv6 listen 45.3.3.3:443 { proto tls table https_hosts access_log { filename /var/log/https_access.log priority notice } } #对于 https 只转发以下指定的泛域名数据 table https_hosts { (.*.|)google.com$ * (.*.|)google.com.hk$ * (.*.|)googlemail.com$ * (.*.|)googlecode.com$ * (.*.|)blogspot.com$ * (.*.|)gmail.com$ * (.*.|)youtube.com$ * (.*.|)baidu.com$ * }
上面配置文件中的 table https_hosts {} 用来往里面添加指定域名,只有这些指定的域名才通过 SNI Proxy 进行反向代理。其中 (.*.|)google.com$ * ,表示只有 www.google.com、google.com 和其他以 google.com 为主的二级或三级域名访问 SNI Proxy 才进行反向代理。
启动 SNI Proxy
/root/sbin/sniproxy -c /etc/sniproxy.conf
输入 ps -ef | grep sniproxy 看一下,进程在就说明启动成功了,如:
也可以通过 netstat -ntlp 查看 sniproxy 是否正常监听 80 和 443 端口。比如:
注意:以后如果重新开机,需要再启动 sniproxy,要把上面的 export 语句执行一下:export LD_LIBRARY_PATH=/usr/local/libev4/lib:$LD_LIBRARY_PATH 。
否则找不到库,无法启动,会报以下错误 :
/root/sbin/sniproxy: error while loading shared libraries: libev.so.4: cannot open shared object file: No such file or directory
如果开启了iptables,要记得开启80和443端口,执行下面语句:
#开放80和443端口给sniproxy用 iptables -I INPUT -p tcp --dport 443 -j ACCEPT iptables -I INPUT -p tcp --dport 80 -j ACCEPT
当然测试成功的话。记得保存防火墙规则。
然后在 hosts 中把需要科学上网的地址指向我们的 sniproxy 服务器即可。一份完整的英文配置文件可以参考 sniproxy-master 目录下的 sniproxy.conf。
参考: https://smileawei.com/centos-sniproxy/
https://doub.io/wlzy-34/
https://doub.io/wlzy-27/
下一篇: 备份
8 Comments
我最近尝试搭建一台 但是sniproxy无法监听端口 具体能聊聊吗
你的成功了?
我安装完成后,还是不能google,Server aborted the SSL handshake
防火墙已经升级了。近期已经失效 。在tls1.2 防火墙能识别到访问的域名。
我安装完成后,还是不能google,Server aborted the SSL handshake
我安装完成后,还是不能google,Server aborted the SSL handshake
这个方法已经不能 google了 墙升级了。
可以让自己节点强制用TLS 1.3 吗?