这个是逗比根据地的备份镜像站(非官方)。牢记域名: [doubibackup.com]。搜索:标签云
投稿文章 | 广告合作 | Telegram 群组 / 公告频道 / 使用教程
广告

一个 反代无需证书 适用于DNS/Hosts的小工具 —— SNI Proxy代理 安装教程

网络资源 Toyo 48评论
广告
本文最后更新于 2018年7月19日 12:10 可能会因为没有更新而失效。如已失效或需要修正,请留言!

现在有很多可以 科学上网的DNS和Hosts,那么他们是如何实现的呢?一些人可能觉得是,找到谷歌等网站没有被墙的IP,但是实际上经过几年的封杀,谷歌等网站的可用IP现在非常有限,通过这种方式效率低而且麻烦。

所以那些可以 科学上网的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 的安装方法请看这个:Debian 编译安装 SNI Proxy 反向代理教程(可用于Hosts/DNS服务器)

安装步骤

apt-get install python-software-properties software-properties-common -y
add-apt-repository ppa:dlundquist/sniproxy

第二行代码执行后提示大概如下:

[email protected]:~# 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。

[email protected]:~# 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方法。

DNS

如果你有一台国内服务器的话,你可以搭建一个DNS服务器,然后把谷歌等域名的解析IP都指向你的SNI Proxy服务器,然后当你使用这个DNS的时候,就会解析到SNI Proxy服务器并反向代理去访问谷歌等网站。

但是搭建DNS服务器,必须有国内服务器,否则会被墙DNS污染,所以没有国内服务器的可以看看下面这几个可以科学上网的DNS。

Xsico DNS

官方网站 – 科学上网

Public Dns:115.159.157.26

Scholar Dns:115.159.158.38

Mogu DNS

官方网站 – 科学上网+广告过滤

北方推荐:122.114.245.45

南方推荐:115.159.96.69

Pure DNS

官方网站 – 科学上网+广告过滤

北方推荐:123.207.137.88

南方推荐:115.159.220.214

GoGo

GoGo新版本也是支持 SNI Proxy 代理的,所以可以添加自己的 SNI Proxy 代理来使用。

GoGo添加SNI Proxy代理很简单,首先进入管理面板-代理列表http://127.0.0.1:9092/proxies

然后点击右上角的 添加SNI代理 按钮,然后出现下图,按下图格式添加,比如你的SNI Proxy代理服务器IP为 233.233.233.233 ,那么就填写 233.233.233.233:443 ,然后点击下面的  确认添加 按钮就行了。

添加完毕后,你可以在 代理列表的筛选中,选择 SNI代理 - 启用 ,然后点击 查看 按钮,筛选出刚才SNI代理。

然后找到我们刚才添加的 SNI代理,并设置 优先(否则可能不会使用这个代理)。

这就算添加完毕了,GoGo客户端使用教程:一个免费且快速的HTTP/SOCKS5代理软件 —— GoGotunnel

dowsDNS

打开配置文件 config.json 找到 "sni_proxy_ip":"219.76.4.3" 参数,把IP改为你自己搭建的 SNI Proxy IP即可。

转载请超链接注明:逗比根据地 » 一个 反代无需证书 适用于DNS/Hosts的小工具 —— SNI Proxy代理 安装教程
责任声明:本站一切资源仅用作交流学习,请勿用作商业或违法行为!如造成任何后果,本站概不负责!

赞 (18)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(48)个小伙伴在吐槽
  1. 执行这一步apt-get update && apt-get install sniproxy -y,部分显示:
    Err:7 http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu xenial/main amd64 Packages
      404  Not Found
    Err:8 http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu xenial/main i386 Packages
      404  Not Found
    Ign:9 http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu xenial/main all Packages
    Ign:10 http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu xenial/main Translation-en_US
    Ign:11 http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu xenial/main Translation-en
    Reading package lists... Done
    W: The repository 'http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu xenial Release' does not have a Release file.
    N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use.
    N: See apt-secure(8) manpage for repository creation and user configuration details.
    E: Failed to fetch http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu/dists/xenial/main/binary-amd64/Packages  404  Not Found
    E: Failed to fetch http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu/dists/xenial/main/binary-i386/Packages  404  Not Found
    E: Some index files failed to download. They have been ignored, or old ones used instead.
    
    hjl2018-11-11 23:17 回复
    • 软件包源找不到文件,建议更换源文件,或者使用更高版本的系统。
      Toyo2018-11-11 23:27 回复
  2. QUIC的情况我不记得了,反正我记得也是挂了,进行XOR混淆域名后就又复活了,UDP没有RST,好像是被墙丢了包吧。
    fxxkgfw2018-08-20 19:03 回复
  3. 我记得SNI代理在大概一年还是多久之前就已经挂了。甚至好像连UDP的QUIC也跟着挂了。 原因大概就是墙检测出了Client Hello请求里带有的明文域名信息,然后TCP RST(而不是HTTPS证书,因为如果用IP访问的话,不会被RST)。 博主那边居然还能用?难道是地区问题?还是说因为我的VPS被墙特别关照了? 当时我甚至自己搞了一个iptables XOR模块,瞄准域名字段把它给XOR掉,就能工作了。后来觉得这样太麻烦,而且基本只能用到openwrt路由器上(Linux电脑也行,但我的电脑平时不用Linux),就不搞了。
    fxxkgfw2018-08-20 19:02 回复
  4. 墙会不会识别SNI进行封锁啊? 我知道有的时候会根据证书封锁,但是现在已经有tls1.3了,证书封锁无效,那么SNI会不会成为墙封锁的依据呢?
    JemmyLoveJenny2018-08-11 21:57 回复
    • SNI 代理有个问题就是,例如你搭建SNI代理后,把谷歌域名指向SNI代理,流量小的时候没事,如果用的人多,流量大了,那就很容易引起墙的注意,因为通过这种指定IP的方式访问被DNS污染的域名(例如谷歌),墙或者运营商或者上层路由都可以看到你在访问谷歌域名,流量大了,墙就会发现异常,然后封锁IP。
      Toyo2018-08-12 00:10 回复
  5. Reading package lists... Done W: The repository 'http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu xenial Release' does not have a Release file. N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. N: See apt-secure(8) manpage for repository creation and user configuration details. E: Failed to fetch http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu/dists/xenial/main/binary-amd64/Packages 404 Not Found E: Some index files failed to download. They have been ignored, or old ones used instead. 安装提示这个咋办呢
    啸天2018-08-08 11:29 回复
  6. 有没有可能在国内VPS上摆SS客户端和SNI,然后SNI走SS通道穿墙到国外VPS,这样本地使用的时候就不用开启客户端程序,只需要修改hosts即可?
    TY2018-07-25 18:07 回复
  7. 有用php实现的sni吗,想在虚拟主机上面弄一个
    Shark2018-05-28 21:01 回复
  8. 运行了但是查网络连接端口监听情况的时候并没有443的使用,后面也没有看到sniproxy。查sniproxy的状态显示的是Active: active (exited)
    2018-05-11 20:02 回复
  9. Err:8 http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu xenial/main amd64 Packages 404 Not Found 是不是因为这个导致启动不了
    zyl2018-04-30 18:39 回复
  10. Failed to initialize listener [::]:443 443没占用啊... 这是什么鬼
    genji2017-12-19 23:31 回复
  11. listen 443 是监听443端口,table https_hosts { .* *:443 } 这里的443又是什么意思呀
    哈哈2017-10-06 16:19 回复
    • 监听所有 https 443端口的网站(域名)。
      Toyo2017-10-06 19:30 回复
  12. 楼主误人子弟了。那句配置第二行pidfile根本不能识别。ubunto14应该是这样的。才对。 echo -e "user daemon listen 443 { proto tls table all_hosts } table all_hosts { .* *:443 }" > /etc/sniproxy.conf
    h弹弹堂2017-09-18 03:56 回复
    • 本教程我用Ubuntu14.04测试通过,才开始写教程的,当然对于不同系统或者不同版本的SNI Proxy,可能部分代码不兼容。
      pidfile 代码是指定一个 PID文件地址,当软件启动时,会创建PID文件并写入进程PID,等软件关闭时,会删除PID文件,PID文件是软件自身用来判断进程是否运行的,不写这个代码,软件也会有个默认PID文件参数。
      Toyo2017-09-18 11:58 回复
  13. 客户端/服务端加密版本不匹配要怎么办呢
    lpc2017-08-12 01:55 回复
  14. 希望知道这个方法的童鞋不要传播低调使用,枪打出头鸟,刀砍地头蛇。这个方法用了https对内容加密来翻墙,https的域名是不加密的。要是G·F·W改用过滤域名,就完蛋了。请大家低调使用,谢谢。
    膜拜大佬2017-07-20 20:04 回复
    • hosts全挂了 :cool:
      哈哈2017-10-01 23:19 回复
  15. dalao的教程好厉害,不知道能不能给个口令验证的教程就是,利用443反代之余开通80端口,利用白名单来防止他人偷流量。具体思路是:搭建好sni后,设备需要先登录IP+80端口输入口令,口令正确,vps自动将设备的mac地址加入白名单,才能利用sni进行反代。如果口令错误,利用白名单直接过滤掉设备。这样应该可以防止自己的vps被人盗刷流量了。对linux不熟,不知道dalao能不能补充个教程,期待!
    膜拜大佬2017-07-19 17:17 回复
    • 不清楚有没有这种软件。
      Toyo2017-07-20 00:07 回复
      • 之前看你的帖子zmirror就是用了这个方法来阻止一般人使用他的镜像。如果在那个基础上加上iptable应该可以做到,希望大佬研究一下,感谢! :cool:
        膜拜大佬2017-07-20 20:03 回复
  16. www.youtube.com 使用了不受支持的协议。 搭好后 访问谷歌或者toutube之类的经常出现这个提示,得刷新几下才能出来页面
    heike2017-05-21 13:58 回复
    • 原来是ubuntu14.04自带的版本不能用欸。自行编译升级了openssl到最新版(1.0.2g)后不再弹出这个提示了。
      heike2017-05-26 11:41 回复
  17. 自己服务器上建的SNIproxy会被扫到然后恶意使用么……被别人用了感觉容易崩啊
    create2017-05-12 15:48 回复
    • 扫是没什么办法扫的,自己保护好就行了,这玩意没什么验证机制。
      Toyo2017-05-12 16:55 回复
      • 谢谢~~~
        create2017-05-12 17:10 回复
  18. 我是cent os怎么办
    chx8182017-05-07 15:31 回复
    • 换Debian/Ubuntu,经常看我教程就知道,我基本不用CentOS,所以要么不看,要么和我一样。
      Toyo2017-05-07 16:53 回复
  19. apt-get update && apt-get install sniproxy -y到这步的时候报错: W: The repository 'http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu xenial Release' does not have a Release file. N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. N: See apt-secure(8) manpage for repository creation and user configuration details. E: Failed to fetch http://ppa.launchpad.net/dlundquist/sniproxy/ubuntu/dists/xenial/main/binary-amd64/Packages 404 Not Found E: Some index files failed to download. They have been ignored, or old ones used instead. 看样子好像是安装包404了,没法安装了
    heike2017-05-04 15:48 回复
    • 尝试更新 包管理器源。不过ubuntu我也很少用,我还是主要使用 debian。
      Toyo2017-05-04 16:37 回复
    • 我也是,你弄好了吗
      啸天2018-08-08 11:31 回复
  20. vu貌似有关于debian是如何安装sni的教程,可以参考下 https://www.vultr.com/docs/setup-sni-proxy-on-debian-7-x64
    kurokitomoko2017-04-03 19:05 回复
    • 这个我知道的,sni proxy的github写了这个编译的方法,但是要安装一堆依赖,然后编译还不一定成功等等,很麻烦。
      Toyo2017-04-03 19:16 回复
  21. [email protected]:~# 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 - 为什么我的显示为-,并且不能用,求教啊啊啊啊啊 PS:我用的vps有点特别,ssh22号端口,我要用31382才能连上,也就是内外网端口不一致,有影响吗?
    S'S2017-03-13 17:58 回复
    • 不清楚这个问题。
      Toyo2017-03-13 19:18 回复
      • 能帮我想想解决办法吗,或者说一下你操作的环境是怎样的,急呀
        S'S2017-03-13 22:13 回复
        • 不是我不帮你想,而是我根本不知道,我又不是万能的。
          我的测试系统是 Ubuntu14.04 x64 。
          Toyo2017-03-13 22:40 回复
  22. 这个对vps内存要求高不高 能不能当cdn用..
    cn2017-03-05 10:48 回复
    • 可以当CDN用,内存要求主要看处理的流量。
      Toyo2017-03-05 14:41 回复
  23. 自己搭建了个SNI Proxy,在路由器里用dnsmasq把所有谷歌的地址都泛解析到SNI Proxy的IP了,网页都正常,但是google play store不能安装软件了,可以浏览play store的内容,但是无法下载软件
    麦子2017-01-31 16:30 回复
    • 那说明 下载软件时候的域名 没有指向SNI代理。
      一般一些网站的下载文件都是CDN域名,和网站本身的域名是分开的,就像Github和Youtube视频。
      Toyo2017-01-31 17:11 回复
    • 老哥请教一下怎么搞,我ubuntu 14装不上...
      超级逗比2017-11-11 19:04 回复
  24. 所以,如果使用公共的科学上网DNS,比如Xsico DNS,那么访问谷歌时,我收到的数据包其实是从通过Xsico的SNI Proxy服务器把谷歌的数据包转发到我的电脑上的,并不是直接连接谷歌的服务器,这样理解对吗?如果这样理解对的话,那SNI Proxy岂不是要承受巨大的流量?而因为数据包被中转了,是否也有可能在SNI Proxy服务器上被劫持和篡改导致隐私泄露呢?
    麦子2017-01-30 15:27 回复
    • 你使用DNS,然后访问谷歌,DNS返回谷歌域名对应的IP,就是SNI代理服务器,然后你访问SNI代理服务器,然后SNI代理服务器访问谷歌网站获取数据并转发给你。
      SNI的特性是不需要网站对应的SSL证书就可以反向代理网站,就是因为他是直接把网站数据整体转发给你,SNI代理服务器没有SSL证书的密匙,无法解密SSL证书的,只是一个单纯的数据转发工具。
      但是这个工具是开源的,意味着可能会被修改来劫持用户数据等。
      公共代理均存在风险,自己要有安全意识。
      Toyo2017-01-30 18:45 回复
      • 理解了,谢谢!
        麦子2017-01-30 23:47 回复
  25. 垃圾偷油 微风到此一游 :idea:
    微风2017-01-20 17:57 回复