那些可以科学上网的DNS和hosts,都是使用的自建或者公共SNI代理。
原理说明
SNI详细的我也不懂,假如你有一台 海外的服务器 IP为: 233.233.233.233
,上面搭建了 SNI Proxy,并且配置正常并启动。
然后你本地Hosts文件在最后添加一条:
- 233.233.233.233 www.google.com
保存Hosts文件并打开浏览器访问 https://www.google.com
,然后你就会发现你可以进入 https://www.google.com
网站了。
原理解析:
- Hosts设置
233.233.233.233 www.google.com
后,浏览器访问https://www.google.com
=>> 浏览器搜索Hosts文件发现设置的解析IP(233.233.233.233) =>> 浏览器访问 SNI Proxy(233.233.233.233) =>> SNI Proxy收到信息然后去访问https://www.google.com
并获取网站数据,然后把网站数据原封不动的返回给你 =>> 浏览器收到 SNI Proxy返回的 网站数据并显示出来 =>> 你看到了https://www.google.com
网页
简单的来说,SNI Proxy 会把请求的网站比如 https://www.google.com
获取并原封不动的返回请求者,不需要对证书进行解密和加密,所以不需要配置证书。
SNI Proxy 可以简单的实现这样的 反向代理功能。
安装环境
本教程只适用于 Ubuntu 14.04 + 以上版本的系统。
Debian 7 / 8 的安装方法请看随后的文章
安装步骤
- apt-get install python-software-properties software-properties-common -y
- add-apt-repository ppa:dlundquist/sniproxy
第二行代码执行后提示大概如下:
- root@ubuntu:~# add-apt-repository ppa:dlundquist/sniproxy
- More info: https://launchpad.net/~dlundquist/+archive/ubuntu/sniproxy
- Press [ENTER] to continue or ctrl-c to cancel adding it
- gpg: keyring `/tmp/tmpnr3gi1cx/secring.gpg' created
- gpg: keyring `/tmp/tmpnr3gi1cx/pubring.gpg' created
- gpg: requesting key ED122FA0 from hkp server keyserver.ubuntu.com
- gpg: /tmp/tmpnr3gi1cx/trustdb.gpg: trustdb created
- gpg: key ED122FA0: public key "Launchpad PPA for Dustin Lundquist" imported
- gpg: Total number processed: 1
- gpg: imported: 1 (RSA: 1)
- OK
继续安装
- apt-get update && apt-get install sniproxy -y
配置说明
SNI Proxy的默认配置文件:/etc/sniproxy.conf
vim的具体使用教程:Linux中VIM编辑器的真 · 简单使用教程
我们可以使用 VIM 等编辑器添加修改,也可以直接用 echo写入文件。
VIM操作简单说明(可选):
- echo "" > /etc/sniproxy.conf
- # 清空配置文件
- vi /etc/sniproxy.conf
- # 打开配置文件
然后按 I 键
进入编辑模式,复制下面的内容到配置文件中(手动把 echo -e "和 " > /etc/sniproxy.conf 去掉),然后按 Esc 键
推出编辑模式,然后输入 :wq
保存并退出vi。
下面是 echo 方式直接写入配置文件。
泛反向代理:
泛反向代理,指的是所有请求 SNI Proxy 的域名都会反向代理。
- echo -e "user daemon
- pidfile /var/run/sniproxy.pid
- listen 443 {
- proto tls
- table https_hosts
- access_log {
- filename /var/log/sniproxy/https_access.log
- priority notice
- }
- }
- table https_hosts {
- .* *:443
- }" > /etc/sniproxy.conf
自定义反向代理:
自定义反向代理,指的是自己指定域名,只有通过这些域名请求 SNI Proxy 的才会反向代理。
比如只设置了 (.*.|)google.com$ *
,那么你只能通过www.google.com、google.com 和其他以 google.com 为主的二级 三级域名
访问SNI Proxy并请求反向代理。其他没有设置的域名都会忽略。
要反向代理什么域名就在 table https_hosts {}
中添加规则,例如 我要反向代理任何以 google.com 为主的二级 三级域名
,那么就写:
- (.*.|)google.com$ *
这样只要是以 google.com
为主的域名都会被反向代理,比如www.google.com news.google.com mail.google.com
都会反向代理。
- echo -e "user daemon
- pidfile /var/run/sniproxy.pid
- listen 443 {
- proto tls
- table https_hosts
- access_log {
- filename /var/log/sniproxy/https_access.log
- priority notice
- }
- }
- table https_hosts {
- .* *:443
- }
- table https_hosts {
- (.*.|)google.com$ *
- (.*.|)google.com.hk$ *
- (.*.|)googlemail.com$ *
- (.*.|)googlecode.com$ *
- (.*.|)blogspot.com$ *
- (.*.|)gmail.com$ *
- (.*.|)youtube.com$ *
- }" > /etc/sniproxy.conf
使用说明
使用命令
- service sniproxy start
- # 如果运行无反应并没有启动,那么请直接使用 sniproxy 来启动试试
- # 启动SNI Proxy
- service sniproxy stop
- # 停止SNI Proxy
- service sniproxy restart
- # 重启SNI Proxy
- service sniproxy status
- # 查看状态
启动SNI Proxy后,查看一下 网络连接端口监听情况:
- netstat -lntp
当出现大概如下所示的信息时,代表正常启动并监听端口443,注意最后的sniproxy。
- root@ubuntu:~# netstat -lntp
- Active Internet connections (only servers)
- Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
- tcp6 0 0 :::443 :::* LISTEN 11673/sniproxy
如果没有发现 sniproxy 的监听端口信息,那么看一下是否有其他的进程/服务 占用了 443 端口,如果有的话请关闭后再尝试启动 SNI Proxy。
如果没有异常情况,那么我们就可以使用 SNI Proxy 代理了。
运行优化说明
建议在运行 SNIProxy前,执行一下这个命令,作用是提高系统的文件符同时打开数量,对于TCP连接过多的时候系统默认的 1024 就会成为速度瓶颈。
- ulimit -n 51200
这个命令只有临时有效,重启后失效,如果想要永久有效,请执行:
- echo "* soft nofile 51200
- * hard nofile 51200" >> /etc/security/limits.conf
然后最后再执行一下 ulimit -n 51200
即可。
Hosts
找到你电脑的Hosts文件,并打开(注意Hosts可能是隐藏文件,需要设置显示出来,还有win10修改Hosts文件需要管理员权限)。
Windows xp / 7 / 10 系统Hosts位置:C:\windows\system32\drivers\etc\hosts
在最后一行添加你要反向代理的网站,比如 www.google.com
- 233.233.233.233 www.google.com
其他想要反向代理的域名按这个格式添加(233.233.233.233是你的SNI Proxy服务器IP),当然Hosts设置比较麻烦,而且比如 youtube.com
看视频的话要设置很多 Hosts域名,很麻烦,所以如果只是访问谷歌,那么可以使用这个Hosts方法.
-----------
系统要求
本教程只适用于 Debian7 / 8 系统,其他系统都不适用。
安装SNI Proxy依赖需要 最少150MB大小的空间,所以请确保你的系统硬盘空闲空间有 300MB。
简单说明
SNI Proxy 简单的来说是一个 反向代理软件,可以把你的请求原封不动的发送给指定网站,然后再把指定网站返回的数据原封不动的返回给你,目前网上可以 科学上网的Hosts和DNS,都是通过把 谷歌等域名指向 SNI Proxy代理的IP来实现“直连”访问谷歌的,所以在某种程度上,SNI Proxy承担一个流量数据搬运工的作用。
因为 Hosts和DNS科学上网,都必须使用 https 来访问,所以过程都是加密的,而SNI Proxy只会原封不动的把流量转发过去,所以不会去解密(也不能),也就不需要担心安全问题了。
SNI Proxy Github项目:https://github.com/dlundquist/sniproxy
安装步骤
安装依赖
首先为了确保依赖安装正常、完整,我们需要更换系统 软件包源为最新的稳定源 jessie
(本步骤必做,否则很容易出错)。
默认下面的代码是 美国的镜像源,可以更换下面代码 us.sources.list 中的 us
,具体可以看这里。
- rm -rf /etc/apt/sources.list && wget -N --no-check-certificate -O "/etc/apt/sources.list" https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/sources/us.sources.list
注意:这个更换 镜像源的步骤,Debian 8、Debian 9 不需要执行,可以直接跳过,Debian 7 必须执行!
然后我们更新软件包列表,并开始安装依赖
- apt-get update
- apt-get install autotools-dev cdbs debhelper dh-autoreconf dpkg-dev gettext libev-dev libpcre3-dev libudns-dev pkg-config fakeroot devscripts build-essential unzip -y
- # 安装依赖会很大,可能会有 100-300MB大小,所以一开始的镜像源一定要选近的,否则会很慢。
- # 在安装过程中可能会提示如下内容,选择 Yes 即可。
- ======================== Configuring libc6:amd64 ========================
- x ....... x
- x ....... x
- x Restart services during package upgrades without asking? x
- x x
- x 《Yes》 《No》 x
- x x
- =========================================================================
安装SNI Proxy
- mkdir sniproxy && cd sniproxy
- # 新建一个 SNI Proxy文件夹并进入
- wget -N --no-check-certificate https://github.com/dlundquist/sniproxy/archive/master.zip
- # 下载 SNI Proxy 最新软件包
- unzip master.zip && cd sniproxy-master
- # 解压 SNI Proxy 软件包并进入解压后的文件夹
- ./autogen.sh && dpkg-buildpackage
- # 开始构建 deb 包
- sniproxy_deb=$(ls ..|grep "sniproxy_.*.deb") && echo ${sniproxy_deb}
- # 获取构建后的 deb 包的文件名,正常情况下会返回一个类似于 sniproxy_0.X.X_amd64.deb 这样的文件名
- [[ ! -z ${sniproxy_deb} ]] && dpkg -i ../${sniproxy_deb}
- # 判断获取的文件名是否为空,如果不为空就 安装 deb 包。
最后安装完毕,我们可以用 sniproxy -V
来查看是否安装成功,正常情况下会返回版本号。
安装完毕之后,还需要配置一下配置文件,才能使用,具体看这个教程:一个 反代无需证书 适用于DNS/Hosts的小工具 —— SNI Proxy代理 安装教程
DNS服务搭建教程:
- 『原创』快速自建DNS服务器以 科学上网+屏蔽广告 —— dowsDNS 一键脚本
- Linux 使用 dowsDNS 快速自建DNS服务器以 科学上网+屏蔽广告
- Linux 自建DNS 并使用SNI Proxy实现科学上网 —— DNSmasq配置教程
使用说明
启动:/etc/init.d/sniproxy start(如果运行无反应并没有启动,那么请直接使用 sniproxy 来启动试试)
停止:/etc/init.d/sniproxy stop
重启:/etc/init.d/sniproxy restart
查看状态:/etc/init.d/sniproxy status
配置文件:/etc/sniproxy.conf
通过 dpkg -S sniproxy
命令可以查询 SNI Proxy 的所有安装文件。
运行优化说明
建议在运行 SNIProxy前,执行一下这个命令,作用是提高系统的文件符同时打开数量,对于TCP连接过多的时候系统默认的 1024 就会成为速度瓶颈。
- ulimit -n 51200
这个命令只有临时有效,重启后失效,如果想要永久有效,请执行:
- echo "* soft nofile 51200
- * hard nofile 51200" >> /etc/security/limits.conf
然后最后再执行一下 ulimit -n 51200
即可。
添加开机启动
- update-rc.d -f sniproxy defaults
取消开机启动
- update-rc.d -f sniproxy remove
卸载SNI Proxy
- apt-get remove --purge sniproxy
--------------------