中国的网络封锁技术方案与网民的反网络封锁技术方案

目录

  1. GFW是什么
  2. 网络封锁的技术方案
    • 内容审查
    • 屏蔽IP
    • DNS劫持
  1. 反网络封锁的技术方案
    • 使用SSL加密对抗关键字审查
    • 给网站换IP避开IP屏蔽
    • 用tor来避开DNS干扰
    • 使用在线RSS阅读器来

GFW是什么

GFW是Great Fire Wall的缩写,是金盾工程。这个工程由若干个部分组成,实现不同功能。防火长城主要指中国政府监控和过滤互联网内容的软硬件系统,由服务器和路由器等设备,加上相关的应用程序所构成。

首先,需要强调的是,由于中国网络审查广泛,中国国内含有“不合适”内容的的网站,会受到政府直接的行政干预,被要求自我审查、自我监管,乃至关闭,故GFW的主要作用在于分析和过滤中国境内外网络的资讯互相访问。

GFW对网络内容的过滤和分析是双向的,GFW不仅针对国内读者访问中国境外的网站进行干扰,也干扰国外读者访问主机在中国大陆的网站,本文讨论GFW屏蔽国外网络上传播的内容的方法及相应的对策。

网络封锁的技术方案

GFW在网络上封锁的技术方案有:

  1. 内容审查
  2. 屏蔽IP
  3. DNS劫持

GFW如何屏蔽网络上传播的内容?网络上封锁的具体方式:

  1. 内容审查GFW的内容审查针对HTTP传输协议的默认端口的80端口,HTTP传播的内容是明文的内容,没有经过加密,GFW是一个IDS[Intrusion detection system (入侵检测系统)],GFW有一个敏感字名单,若在中国大陆访问境外的主机的HTTP的数据流里发现敏感字眼,就在两台主机间伪造一个"reset”信号,导致双方主机以为对方中止了请求。如用Firefox浏览器访问
    http://newsvote.bbc.co.uk/chinese/
    http://knol.google.com/k/-/-/3jhi1zdzvxj3f/2 就会出现以下画面:
  2. 屏蔽IP屏蔽IP是GFW通过路由器(router)来控制的,在通往国外的最后一个网关上加上一条伪造的路由规则,导致通往某些被屏蔽的网站的所有IP数据包无法到达。路由器的正常工作方式是学习别的路由器广播的路由规则,遇到符合已知的IP转发规则的数据包,则按已经规则发送,遇到未知规则IP的数据,则转发到上一级网关。GFW的路由器按黑名单(blacklist)来转发特定的IP数据包,则可屏蔽特定的网站的IP,此IP黑名单不是固定的,会更新。如访问 http://www.dw-world.de/chinese/ 出现以下画面:

  3. DNS劫持DNS劫持是针对某些网站的最严重的干扰。干扰的方式有两种:

    1. 一种是通过网络服务提供商(Internet Service Provider/ISP)提供的DNS服务器进行DNS欺骗,当人们访问某个网站时,需要要把域名转换为一个IP地址,DNS服务器负责将域名转换为IP地址,中国大陆的ISP接受通信管理局的屏蔽网站的指令后在DNS服务器里加入某些特定域名的虚假A记录,当使用此DNS服务器的网络用户访问此特定网站时,DNS服务便给出假的IP地址,导致访问网站失败,甚至返回ISP运营商提供的出错页面和广告页面。
    2. 另一种是GFW在DNS查询使用的UDP 53端口上根据黑名单进行过滤,遇到通往国外的使用UDP的53端口进行查询的DNS请求,就返回一个虚假的IP地址

例子:
在大陆访问 http://www.zuola.com/ 就可能出现“服务器响应时间过长”。
我家目前用的中国电信提供的网络接入:
Internet connection
Connection type:PPPoE
IP Address:220.168.9.112
Gateway address:220.168.8.1
DNS Server:222.246.129.80, 59.51.78.210
当我使用中国电信提供的DNS服务器进行查询时,出现以下画面:甚至我在中国大陆使用用国外的OPENNDS或其他DNS服务器进行查询,都会被GFW干扰而得到虚假的IP地址,
通过远程登录在美国的主机进行DNS查询后,此时的DNS查询是完全无GFW干扰的,可得到 www.zuola.com的真实IP地址是 75.119.214.237

GFW在OSI结构模型的两个层面进行审查和封锁,一种在传输层(Transport Layer)进行干扰,一种是在网络层(Network Layer)进行干扰:

  1. 在传输层(Transport Layer)进行干扰:
    1. DNS劫持  GFW在UDP 53端口上进行传输层完成干扰;
    2. 内容审查   GFW对默认端口TCP 80端口上进行内容过滤,在http传输协议上,对tcp 80端口上传输的内容进行内容审查,遇到关键字,GFW就在会话中插入“reset”信号,导致网页被重置。
  1. 屏蔽IP是GFW在网络层(Network Layer)上的封锁和干扰,是在IP路由协议上完成干扰。



GFW审查在OSI模型上的审查的位置:

 

反网络封锁的技术方案

GFW针对具体网站的方案有以下三种:

  1. GFW把域名为作敏感字来屏蔽
  2. GFW把域名所在的IP屏蔽
  3. GFW干扰域名DNS解析

相应对抗GFW,网站的主人有下面几个方法:

  1. 网站使用SSL加密对抗关键字审查;
  2. 给网站换IP避开IP屏蔽;
  3. 推荐大陆的网站访问者使用国外的DNS解析服务器,或推荐大陆的访问者使用tor来避开DNS干扰
  4. 推荐读者使用在线RSS阅读器来读取最新文章

相应对抗GFW有的具体方法

  1. 使用SSL加密对抗关键字审查HTTPS是基于SSl的HTTP协议,是安全超文本传输协议。当用户访问使用HTTPS的网站时,用户端的浏览器需要先获取网站的安全证书和来自认证的安全证书发行商的数字签名,此安全证书为服务器的公钥,服务器用私钥把网页内容加密进行传输,客户端浏览器以公钥解密即可得到网页内容。网络内容的传播过程中,内容是加密的,无法被GFW自动审查传输的内容,亦无法被GFW插入"reset"信号。

    1. 实例1:在2007年11月到2008年7月,https://www.zuola.com  曾用HTTPS成功避开GFW的审查,让中国大陆的网民能够直接访问此网站。
    2. 实例2:当人们无法访问http://knol.google.com/k/-/-/3jhi1zdzvxj3f/2时,改用 https://knol.google.com/k/-/-/3jhi1zdzvxj3f/2 就可以访问
  1. 给网站换IP避开IP屏蔽使用SSL加密可对抗GFW的内容审查,GFW如何对付HTTPS呢?
    GFW的工作人员遇到使用HTTPS的网站后,他们知道无法使用机器自动的过滤他们心目中的“敏感内容”和“有害内容”,于是直接屏蔽网站的IP,此时,通往此网站服务器的任何数据包都无法直接越过GFW到达目的地。此时只需要更改网站域名的A记录,换一个IP就可以避开屏蔽IP。此时就像猫和老鼠的游戏了,GFW只好跟在后面不断屏蔽IP,并且GFW的屏蔽IP的工作是人工执行的。无法通过机器自动执行。如果GFW能够自动执行屏蔽IP的操作,那被屏蔽IP的域名的拥有者就可以借用GFW的能力屏蔽任何境外网站了。
    1. 实例3:在2007年11月到2008年7月,https://www.zuola.com  曾用SSL加密+换IP 成功避开GFW的审查,让中国大陆的网民能继续能够直接访问此网站。
    2. 实例4:https://doubleaf.com 也使用SSL加密和换IP的手段让中国大陆的网民能直接访问
  1. 推荐大陆的网站访问者使用国外的DNS解析服务器,或推荐大陆的访问者使用tor来避开DNS干扰在2008年奥运期间,我发现GFW针对 www.zuola.com 使用了DNS劫持的方式一劳永逸的屏蔽方式,导致国内用户无法直接获得我的网站的正确IP,即使使用“无界”“自由门”“VPN”等突破封锁的工具,也会走错门。那就只能推荐读者《使用TOR+FoxyProxy插件突破GFW》了,TOR是一个分布式的、匿名的网络,Foxyproxy是一款代理服务器管理软件,可以让Firefox使用TOR来收发DNS请求:


     
    TOR的工作方式
    Tor 有助于降低简单的和高级的流量分析的风险,Tor 把你的流量分散到互联网上的多个地点,所以不存在单一的一点可以把你和你的目的地联系起来。这就好像用一条拐弯抹角的、难以辨认的路径甩掉跟踪你的人,然后定期擦掉你的脚印。在 Tor 网络上,来源和目的地不是用一条路径直接连接的,而是由一条通过数台中继的随机路径覆盖原始路径,数据包在这条路径上传输,因此,不存在任何单一一点上的观察者能够知道数据从哪里来、到哪里去。


    用 Tor 创建一条私有网络路径时,用户的软件或客户端通过网络上的中继递增地建立一条由若干加密连接组成的环路(circuit)。环路一次扩展一跳(hop),环路上的中继仅仅知道它从哪一个中继接收数据以及向哪一个中继发送数据。没有一台单独的中继会知道数据包的完整路径。客户端与环路上的每一跳都协商一组独立的密钥,这样可以保证数据通过任何一跳时都无法跟踪。


    一旦环路建立完成,多种类型的数据可以在上面进行交换,不同种类的应用程序也可以在 Tor 网络上部署。因为每一台中继最多只能知道环路中的一跳,窃听者或者被入侵的中继都无法通过流量分析把连接的来源和目的地联系起来。 Tor 仅作用于 TCP 数据流,任何支持 SOCKS 的应用程序都可以使用它。
    出于有效性,Tor 为大约在相同的十分钟内发起的连接请求分配同一环路。以后的请求被分配不同的环路,这样他人就不能把你早先的行为和新的行为联系起来。
  2. 推荐读者使用在线RSS阅读器来读取最新文章Really Simple Syndication(RSS)是一种严格XML的信息传递的格式规范,标准的XML格式文档可允许信息在一次发布后通过不同的程序阅读,易于分发和聚合(Sysndicat)。RSS是这种XML应用搭建了信息迅速传播的一个技术平台,网站的最新内容通过RSS Feed传播,能通过在线RSS阅读器自动推送文章到读者的阅读器,人们无需直接访问网站就能看到最新的内容,RSS能够让内容很容易的被分发,只需要知道RSS地址,网络上无数的在线RSS阅读器总能读取到RSS Feed中的内容。RSS是很容易生成并分布的,这是GFW无法拦截或需要大量资源才能够封锁的一种技术。
    实例:
    1. 实例5:我的网站自2007年4月重庆最牛钉子户报道后被屏蔽,但我的FEED地址 http://feed.zuola.com/ 的订阅数却一直在增长,Google Reader订阅用户数量从 700左右增加到2686。不过GFW仍然会干扰Google reader,使用https 的方式 https://www.google.com/reader/view/ 才能看到以下数据
    2. 实例6:《看不见的西藏》是一个藏族人的BLOG,虽然国内读者无法直接访问,但中国大陆的读者仍然能够通过订阅她的RSS FEED来看到她眼中的西藏,这个Feed是可用google reader订阅的 http://woeser.middle-way.net/feeds/posts/default




此文档的其他站点备份:

  1. http://zolaruler.spaces.live.com/blog/cns!D2AC7D299F493A68!241.entry
  2. https://docs.google.com/View?docid=dggh5mp6_0zzmm4fdn
  3. http://zhoushuguang.blogspot.com/2009/03/blog-post.html
  4. https://knol.google.com/k/-/-/3jhi1zdzvxj3f/14

参考文档:

Tor概述》:http://tor.zuo.la/overview.html.zh-cn

手把手教你使用TOR+FoxyProxy突破GFWhttps://knol.google.com/k/-/-/3jhi1zdzvxj3f/2

纠正网友一些对GFW的认识》: https://www.zuola.com/weblog/?p=1228

Zola教你玩:如何对抗GFW的域名劫持》: https://www.zuola.com/weblog/?p=1151

 

 from   中国的网络封锁技术方案与网民的反网络封锁技术方案

https://docs.google.com/document/d/1n79DOFLdUTSUtzASiN1TaxSF7SWuXqoZvwyM-SO6W7c/preview

NAT穿透和内网访问

利用minivtun实现点对点非公网NAT穿透,在学校轻松访问家里的路由器。需要一个中心化公网服务器(VPS)作为打洞实现内网访问。

  

一般这种情况用于

  • 家里路由器挂载离线下载
  • 家里的WEB网络摄像头监控
  • 远程修改某些路由设置
  • 远程控制路由器相关的“智能家居”
  • 远程访问家里的内网或一个网段

现在仅考虑以下拓朴图,本文的目的是想让路由C访问路由A,实现C远程控制A。其中A是非智能路由器,使用非Openwrt系统。A下面挂接一个Openwrt路由器B

前提是A和C能顺利访问该VPS,而且B工作正常。

 minivtun互访

这个minivtun是我常用的tun点对点隧道软件,工作原理与shadowvpn类似,可以当梯子使用。现有我移植的的minivtun-openwrt,可以自行编译安装在路由上面。

按照文档编译安装,服务端运行监听555端口

/usr/sbin/minivtun -l 0.0.0.0:555 -a 172.16.0.1/24 -e password -n mv0 -d

路由器B和C,同样使用minivtun实现与VPS对接,这里指定网络设备为mv001

# Router B: ip 172.16.0.3
/usr/sbin/minivtun -r [YOUR_VPS]:555 -a 172.16.0.3/24 -e password -n mv001 -d

# Router C: ip 172.16.0.55
/usr/sbin/minivtun -r [YOUR_VPS]:555 -a 172.16.0.55/24 -e password -n mv001 -d

使用Ping等工具测试路由B能否顺利访问VPS

ping 172.16.0.1

 Openwrt端口转发

以下三个步骤均在路由B操作

 新建接口

在network->interface标签下添加一个interface: 命名随意,这里命名为minivtun_intf,协议为DHCP Client,手动输入mv001这个物理接口进行绑定(因上面minivtun启动参数设定了mv001网络设备)

检查这个接口minivtun_intf是否获得正确的172.16.0.3/24地址,并且从数字变化过程中看到能有Tx/Rx流量通过。

 入站防火墙

切换到Network->Firewall->Gerneral,添加一个新的Zone,随意命名为minivtun,指定入站出站转发三个都accept,勾选masquerading和MSS clamping进行伪装路由器。Covered Network只需要勾选两个区域即可,其中必选的是minivtun_intf表示源,另一个是目的地根据需要,可以选WAN或者LAN,如果访问Openwrt局域网就指定LAN,如果要访问WAN(比如上一级路由)就指定WAN

因为我是利用B去访问上一级的A,因此我勾选了WAN

 端口转发

切换到Network->Firewall->Port Forward,新建一个转发规则

外部端口随意,(比如外部端口是444,那么在路由C使用minivtun访问172.16.0.3:444就触发端口转发条件)

项目 备注 我的值
名字 随意起名 minivtun_port_fwd
外部区域 入站防火墙名字 minivtun
外部端口 供外部访问端口 800
内部区域 目的端口区域 LAN
内部IP 目的地址 192.168.200.1
内部端口 目的端口 800

 测试方法

从路由器C浏览器地址栏输入http://172.16.0.3:800即可访问路由A的800端口

 公网访问家里内网

考虑以下拓朴,按照上文已经实现B-C互访(即ping成功),现在我的需求是,在C节点上实现访问A路由上的192.168.200.0/24网段(做视频监控等应用)

实现原理是:将A节点的路由表在VPS上面宣告一下,参考minivtun项目的github issue服务端访问客户端内网进行配置。

 添加节点A的路由表

服务端运行监听555端口,增加-v选项宣告路由表,192.168.200.0/24网段的默认网关是节点B,即172.16.0.3

/usr/sbin/minivtun -l 0.0.0.0:555 -a 172.16.0.1/24 -e password -n mv0 -d -v "192.168.200.0/24=172.16.0.3"

然后服务器端Linux系统的路由表增加默认路由,192.168.200.0/24走minivtun接口。

ip route add 192.168.200.0/24 dev mv0

服务器端测试一下能否ping到节点A,若成功就说明公网下使用minivtun可以实现访问192.168.200.0网段。

ping 192.168.200.1

 配合shadowsocks进行访问内网

假设服务器上已经有ss-server在运行。在shadowsocks-android上新建一个服务器配置,路由设置为自定义规则,自定义规则可以根据实际修改,满足规则才走ss转发,这样可以实现手机访问节点A内网

若电脑windows实现内网访问,个人猜测可使用ss的全局模式,或者配合SwitchyOmega等浏览器指定走socks5代理,我没有测试过。

fromhttp://web.archive.org/web/20190811172300/https://lixingcong.github.io/2016/10/03/openwrt-port-forward/

appworks.tw

The Supports We Offer

AppWorks provides 2 main services that ca

Thehttps://appworks.tw/Supports We Offer

AppWorks provides 2 main services that cater to startups in 2 different stages. AppWorks
Accelerator helps seed-stage startups go from 0 to 1. AppWorks Funds provide financing
to help growth-stage startups scale faster. On top of that, our AppWorks School provides 
education to talents and prepare them for a thriving career in the startup land.

ter to startups in 2 different stages. AppWorks
Accelerator helps seed-stage startups go from 0 to 1. AppWorks Funds provide financing
to help growth-stage startups scale faster. On top of that, our AppWorks School provides 
education to talents and prepare them for a thriving career in the startup land.

SNI Proxy代理 安装教程

那些可以科学上网的DNS和hosts,都是使用的自建或者公共SNI代理。

原理说明

SNI详细的我也不懂,假如你有一台 海外的服务器 IP为: 233.233.233.233 ,上面搭建了 SNI Proxy,并且配置正常并启动。

然后你本地Hosts文件在最后添加一条:

  1. 233.233.233.233 www.google.com

保存Hosts文件并打开浏览器访问 https://www.google.com ,然后你就会发现你可以进入 https://www.google.com 网站了。

原理解析:

  1. 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 的安装方法请看随后的文章

安装步骤

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

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

  1. root@ubuntu:~# add-apt-repository ppa:dlundquist/sniproxy
  2.  
  3. More info: https://launchpad.net/~dlundquist/+archive/ubuntu/sniproxy
  4. Press [ENTER] to continue or ctrl-c to cancel adding it
  5.  
  6. gpg: keyring `/tmp/tmpnr3gi1cx/secring.gpg' created
  7. gpg: keyring `/tmp/tmpnr3gi1cx/pubring.gpg' created
  8. gpg: requesting key ED122FA0 from hkp server keyserver.ubuntu.com
  9. gpg: /tmp/tmpnr3gi1cx/trustdb.gpg: trustdb created
  10. gpg: key ED122FA0: public key "Launchpad PPA for Dustin Lundquist" imported
  11. gpg: Total number processed: 1
  12. gpg: imported: 1 (RSA: 1)
  13. OK

继续安装

  1. apt-get update && apt-get install sniproxy -y

配置说明

SNI Proxy的默认配置文件:/etc/sniproxy.conf

vim的具体使用教程:Linux中VIM编辑器的真 · 简单使用教程

我们可以使用 VIM 等编辑器添加修改,也可以直接用 echo写入文件。

VIM操作简单说明(可选):

  1. echo "" > /etc/sniproxy.conf
  2. # 清空配置文件
  3. vi /etc/sniproxy.conf
  4. # 打开配置文件

然后按 I 键 进入编辑模式,复制下面的内容到配置文件中(手动把 echo -e "和 " > /etc/sniproxy.conf 去掉),然后按 Esc 键 推出编辑模式,然后输入 :wq 保存并退出vi。

下面是 echo 方式直接写入配置文件。

泛反向代理:

泛反向代理,指的是所有请求 SNI Proxy 的域名都会反向代理。

  1. echo -e "user daemon
  2. pidfile /var/run/sniproxy.pid
  3.  
  4. listen 443 {
  5. proto tls
  6. table https_hosts
  7. access_log {
  8. filename /var/log/sniproxy/https_access.log
  9. priority notice
  10. }
  11. }
  12. table https_hosts {
  13. .* *:443
  14. }" > /etc/sniproxy.conf

自定义反向代理:

自定义反向代理,指的是自己指定域名,只有通过这些域名请求 SNI Proxy 的才会反向代理。

比如只设置了 (.*.|)google.com$ * ,那么你只能通过www.google.com、google.com 和其他以 google.com 为主的二级 三级域名 访问SNI Proxy并请求反向代理。其他没有设置的域名都会忽略。

要反向代理什么域名就在 table https_hosts {} 中添加规则,例如 我要反向代理任何以 google.com 为主的二级 三级域名 ,那么就写:

  1. (.*.|)google.com$ *

这样只要是以 google.com 为主的域名都会被反向代理,比如www.google.com news.google.com mail.google.com 都会反向代理。

  1. echo -e "user daemon
  2. pidfile /var/run/sniproxy.pid
  3.  
  4. listen 443 {
  5. proto tls
  6. table https_hosts
  7. access_log {
  8. filename /var/log/sniproxy/https_access.log
  9. priority notice
  10. }
  11. }
  12. table https_hosts {
  13. .* *:443
  14. }
  15.  
  16. table https_hosts {
  17. (.*.|)google.com$ *
  18. (.*.|)google.com.hk$ *
  19. (.*.|)googlemail.com$ *
  20. (.*.|)googlecode.com$ *
  21. (.*.|)blogspot.com$ *
  22. (.*.|)gmail.com$ *
  23. (.*.|)youtube.com$ *
  24. }" > /etc/sniproxy.conf

使用说明

使用命令

  1. service sniproxy start
  2. # 如果运行无反应并没有启动,那么请直接使用 sniproxy 来启动试试
  3. # 启动SNI Proxy
  4.  
  5. service sniproxy stop
  6. # 停止SNI Proxy
  7.  
  8. service sniproxy restart
  9. # 重启SNI Proxy
  10.  
  11. service sniproxy status
  12. # 查看状态

启动SNI Proxy后,查看一下 网络连接端口监听情况:

  1. netstat -lntp

当出现大概如下所示的信息时,代表正常启动并监听端口443,注意最后的sniproxy。

  1. root@ubuntu:~# netstat -lntp
  2. Active Internet connections (only servers)
  3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  4. tcp6 0 0 :::443 :::* LISTEN 11673/sniproxy

如果没有发现 sniproxy 的监听端口信息,那么看一下是否有其他的进程/服务 占用了 443 端口,如果有的话请关闭后再尝试启动 SNI Proxy。

如果没有异常情况,那么我们就可以使用 SNI Proxy 代理了。

运行优化说明

建议在运行 SNIProxy前,执行一下这个命令,作用是提高系统的文件符同时打开数量,对于TCP连接过多的时候系统默认的 1024 就会成为速度瓶颈。

  1. ulimit -n 51200

这个命令只有临时有效,重启后失效,如果想要永久有效,请执行:

  1. echo "* soft nofile 51200
  2. * 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

  1. 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 ,具体可以看这里

  1. 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 必须执行!

然后我们更新软件包列表,并开始安装依赖

  1. apt-get update
  2. 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
  3. # 安装依赖会很大,可能会有 100-300MB大小,所以一开始的镜像源一定要选近的,否则会很慢。
  1. # 在安装过程中可能会提示如下内容,选择 Yes 即可。
  2. ======================== Configuring libc6:amd64 ========================
  3. x ....... x
  4. x ....... x
  5. x Restart services during package upgrades without asking? x
  6. x x
  7. x Yes No x
  8. x x
  9. =========================================================================

安装SNI Proxy

  1. mkdir sniproxy && cd sniproxy
  2. # 新建一个 SNI Proxy文件夹并进入
  3.  
  4. wget -N --no-check-certificate https://github.com/dlundquist/sniproxy/archive/master.zip
  5. # 下载 SNI Proxy 最新软件包
  6.  
  7. unzip master.zip && cd sniproxy-master
  8. # 解压 SNI Proxy 软件包并进入解压后的文件夹
  9.  
  10. ./autogen.sh && dpkg-buildpackage
  11. # 开始构建 deb 包
  12.  
  13. sniproxy_deb=$(ls ..|grep "sniproxy_.*.deb") && echo ${sniproxy_deb}
  14. # 获取构建后的 deb 包的文件名,正常情况下会返回一个类似于 sniproxy_0.X.X_amd64.deb 这样的文件名
  15.  
  16. [[ ! -z ${sniproxy_deb} ]] && dpkg -i ../${sniproxy_deb}
  17. # 判断获取的文件名是否为空,如果不为空就 安装 deb 包。

最后安装完毕,我们可以用 sniproxy -V 来查看是否安装成功,正常情况下会返回版本号。

安装完毕之后,还需要配置一下配置文件,才能使用,具体看这个教程:一个 反代无需证书 适用于DNS/Hosts的小工具 —— SNI Proxy代理 安装教程

DNS服务搭建教程:

  1. 『原创』快速自建DNS服务器以 科学上网+屏蔽广告 —— dowsDNS 一键脚本
  2. Linux 使用 dowsDNS 快速自建DNS服务器以 科学上网+屏蔽广告
  3. 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 就会成为速度瓶颈。

  1. ulimit -n 51200

这个命令只有临时有效,重启后失效,如果想要永久有效,请执行:

  1. echo "* soft nofile 51200
  2. * hard nofile 51200" >> /etc/security/limits.conf

然后最后再执行一下 ulimit -n 51200 即可。

添加开机启动

  1. update-rc.d -f sniproxy defaults

取消开机启动

  1. update-rc.d -f sniproxy remove

卸载SNI Proxy

  1. apt-get remove --purge sniproxy

--------------------

 

利用dingo解决dns污染问题

在mac机器上。

wget https://github.com/pforemski/dingo/releases/download/0.13/dingo-darwin-amd64
chmod 755 dingo-darwin-amd64
./dingo-darwin-amd64 --help会出现dingo的参数说明.

 

使用实例:

sudo wg-quick up wg0
sudo networksetup -setdnsservers "Wi-Fi" 127.0.0.1

sudo ~/dingo-darwin-amd64 -port 53 -odns:server 67.215.70.81 -odns:workers 2 or:

sudo ~/dingo-darwin-amd64 -port 53 -odns:host api.openresolve.com -odns:workers 2

 

 

使用dnscrypt-proxy v2.x和Unbound搭建更好用的 DNS 服务器


需要的程序:

dnscrypt-proxy v2.x

unbound


DNSCrypt-proxy的配置

修改文件/usr/local/etc/dnscrypt-proxy.toml,

127.0.0.1:5353 就是下面 unbound 的配置里 DNSCrypt 的监听地址。


Unbound的配置

修改文件/usr/local/etc/unbound/unbound.conf。没有这个文件的话,一般需要找一下。


软件包里提供的配置 example 文件复制过去。这里列出的仅包含需要修改的部分,


其他的按照默认配置一般没有问题。

 

num-threads: 2 # 线程数可以修改为物理核心数

interface: 0.0.0.0 # 侦听所有 IPv4 地址

interface: ::0 # 侦听所有 IPv6 地址

# 如果只需要本机使用,则一个 interface: 127.0.0.1 即可

so-rcvbuf: 4m

so-sndbuf: 4m # 本机使用的话,这俩 buf 可以取消注释

so-reuseport: yes # 如果开了多线程,就写 yes

msg-cache-size: 64m # 本机可以设置 4m 或者更小

rrset-cache-size: 128m # 本机可以设置 4m 或者更小

cache-max-ttl: 3600 # 建议设置一个不太大的值...专治各种运营商 DNS 缓存不服

outgoing-num-tcp: 256 # 限制每个线程向上级查询的 TCP 并发数

incoming-num-tcp: 1024 # 限制每个线程接受查询的 TCP 并发数

# 下面这四个不需要解释了吧,不想用那个就写 no

do-ip4: yes

do-ip6: yes

do-udp: yes

do-tcp: yes

tcp-upstream: no # 默认是 no,隧道状态比较稳的话也不需要写 yes。一些情况下强制使用 tcp 连上游的话写 yes

access-control: 0.0.0.0/0 allow # 本机用的话建议设置 127.0.0.0/8 allow,局域网用适当调整

root-hints: "/etc/unbound/root.hints" # 没有的话在 ftp://FTP.INTERNIC.NET/domain/named.cache 下载一份

hide-identity: yes # 不返回对 id.server 和 hostname.bind 的查询。

hide-version: yes # 不返回对 version.server 和 version.bind 的查询。

# 不过下面有 identity 和 version 的自定义选项,不隐藏这些的话,修改下选项还可以卖个萌(´・ω・`)

harden-glue: yes # 建议打开

module-config: "iterator" # 禁用 DNSSEC 检查,如果上游不支持 DNSSEC 就关掉。注意这个选项有可能在其他 include 的文件里

unwanted-reply-threshold: 10000000 # 针对各种网络不服,数值为建议值,具体可以自己修改看看效果

do-not-query-localhost: no # 一般是为了防止扯皮丢包开着,不过等下要用 DNSCrypt 所以关掉

prefetch: yes # 蛮好用的,开着吧

minimal-responses: yes # 省带宽,开着吧。本机用可以关掉

# 关键部分来了,把默认查询全部丢给 DNSCrypt。使用 [地址]@[端口] 指定查询地址和端口,默认端口 53。

# 然后把国内的地址丢给国内的缓存服务器。这两个选项的顺序不能错哟。

# 如果使用隧道查询,把这个地址改为隧道对端的地址,或者一个国外的 DNS 服务器都可以,例如 8.8.8.8。

# 具体看是在对端开 DNS 还是直接用国外的服务器。后者的话,前面 outgoing-interface 可以直接设置隧道本地端的地址,

不过要配合 dnsmasq-china-list 的话,还是写路由表比较合适,否则不够灵活。

include: "/etc/unbound/accelerated-domains.china.unbound.conf"

forward-zone:

    name: "."

    forward-addr: 127.0.0.1@5353

如果需要 edns-client-subnet 支持的话,需要手动编译源码安装。命令:

# 克隆源码

svn co http://unbound.nlnetlabs.nl/svn/branches/edns-subnet/

# 编译安装

./configure --enable-subnet --with-libevent && make && sudo make install

配置文件的格式:

# 默认向所有服务器发送 edns-client-subnet

send-client-subnet: 0.0.0.0/0

如果只对特定权威 DNS 发送 edns-client-subnet 请求,则按照此格式写多行 IP.

----------------------------------------------------

 

brew install dnscrypt-proxy ,安装完成后,可执行文件为

/usr/local/bin/dnscrypt-proxy


配置文件为/usr/local/etc/dnscrypt-proxy.toml

(如果/usr/local/etc/里面没有dnscrypt-proxy.toml,那么

cp /usr/local/Cellar/dnscrypt-proxy/2.0.19/.bottle/etc/dnscrypt-proxy.toml /usr/local/etc/


nano /usr/local/etc/dnscrypt-proxy.toml

修改后的一些地方:

ipv4_servers = true

 

ipv6_servers = false

 

dnscrypt_servers = true

 

doh_servers = true

 

require_dnssec = false

 

require_nolog = true

 

require_nofilter = true

force_tcp = true

 

proxy = "socks5://127.0.0.1:1080"

 

ignore_system_dns = true

 

修改完成后,你需运行一个本地的socks5代理服务器程序,比如ssh tunnel.

sudo dnscrypt-proxy -config /usr/local/etc/dnscrypt-proxy.toml