GFW的存在极大地降低了网络世界的效率。除了移民,国内移除这个干扰的方法只能是在防火墙外设置中间代理机器,让流量通过这台机器中转,因为GFW的目的是干扰特定网站的访问,所以不可能封锁所有的境外流量。
GFW 的工作原理
- DNS污染
- 封锁IP或者端口
- 封锁TCP/UDP
抗干扰方法
针对DNS污染
- 维护并设置hosts
- 设置无污染的公共DNS服务器
- 自己搭建无污染的DNS服务器
封锁IP或端口
- 更换 IP 或者使用 IPv6
- 更换端口或者使用正常网络服务端口,比如web服务的80或者443端口
封锁TCP/UDP
- 使用VPN或者代理
VPN 原理
在两个私有网络之间打通一个隧道,也称“打洞”,并配置路由使流量走这个隧道。
因为我们知道数据物理上依然还是走的公网,我们耳熟能详的IPsec VPN,其中一中形式就是基于以上的隧道,对数据进行加密保护的一种VPN。通常把这种通过两边的路由器建立隧道然后实现两个私网网段互通的VPN的形态称为端到端VPN。
另外一种VPN形态,就是比如说出差员工用的笔记本电脑,想在酒店接到北京公司内部的服务器上,我们就不可能在酒店路由器上再去配置VPN了,还有出差员工地点也不固定,而不变的是笔记本电脑,我们可不可以用笔记本电脑和北京的路由器建立隧道呢?答案当然是肯定的,这种形态我们称为点到端VPN。
PPTP is a fast, easy-to-use protocol. It is a good choice if OpenVPN isn’t supported by your device.
L2TP/IPsec is a good choice if OpenVPN isn’t supported by your device and security is top priority.
OpenVPN is the recommended protocol for desktops including Windows, Mac OS X and Linux.
代理协议
- HTTPS
- Socks5-tls
- Shadowsocks
- V2ray 的 VMESS
以上协议都是基于 TCP 的代理协议,代理协议(Proxy Procotol)与 VPN 不同,仅可被用于通过代理服务器转发 TCP 连接(shadowsocks 支持代理 UDP),而 VPN 可被用于 IP 层上的所有协议,如 TCP、UDP、ICMP 等。所以在使用代理时,ping 等 ICMP 应用是不可以被代理的。
HTTPS 协议使用广泛,有众多成熟的工业级工具,如 squid,haproxy,nghttp2 等等,但是由于 HTTPS 协议本身比较复杂,配置起来参数众多,有很多性能相关参数需要自己调优,所以一般用户配置起来会有难度。 Shadowsocks 经过多年发展,目前也已经有众多的软件支持,但是对于不同特性的支持度不一。由于参数简单,部署配置起来极其方便。
HTTP代理会自动提取用户数据包的HTTP Request数据并且把Response的数据转发给发送请求的客户端。
传输协议
V2ray 可以配置多种传输协议
- 基于 TCP
- HTTP
- WebSocket
- HTTP/2
- 基于 UDP
- mKCP
- QUIC
传输安全
传输性能
部分 ISP 对于非 HTTP 和 TLS 的未知流量,会进行降速限制,这个可以通过配置 shadowsocks 的 obfs 解决。
可以设置负载均衡和优化TCP参数
网络探测
- wireshark 或者命令行版 tshark
- tcpdump
- ping, tracert, iperf
- …
客户端使用
在用户网络上设置代理,可以设置在两个位置,不管是哪种设置方法是一样的,而且都可以配置转发规则,或则在下层(比如Proxy SwitchyOmega)配置转发规则设置是否走代理网络。
- 在路由器上设置全局代理
- 在单机上设置代理
在单机上设置代理
在命令行终端设置代理
以ClashX为例,HTTP代理端口为7890,Socks5端口为7891
# 通用设置:
export http_proxy=http://127.0.0.1:7890 https_proxy=http://127.0.0.1:7890 ftp_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891
# cURL:
# 普通HTTP
curl -x 127.0.0.1:7890 http://example.com/
# 通过 CONNECT 方法建立 HTTPS 的 TCP 隧道
curl -x proxy.example.com:80 https://example.com/
# 隧道模式
curl -p -x http://proxy.example.com:80 ftp://ftp.example.com/file.txt
# 设置环境变量,除了http_proxy,其他变量设置成全大写是同样效果
export http_proxy=http://127.0.0.1:7890 https_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891
export ftp_proxy=http://127.0.0.1:7890
export NO_PROXY=baidu.com,qq.com
export NO_PROXY='*'
# Git: (除了ssh协议,同时支持通用环境变量)
git config --global http.proxy http://127.0.0.1:7890
# or
git config --global http.proxy socks5://127.0.0.1:7890
# 注意:文档里并没有 https.proxy 这个选项,而且有人反馈说这个选项并没有起效果,所以网络上设置这个选项是误传
# 注意: 代理地址不要加引号
# socks5h:// 更好, 使用远端DNS
# 如果是ssh协议,需要添加下列配置到 ~/.ssh/config,代理协议为 socks5
Host github.com
ProxyCommand nc -X 5 -x 127.0.0.1:7891 %h %p
# 或者使用 connect 命令建立 socket 连接 http://www.patthoyts.tk/blog/using-git-with-socks-proxy.html
# 取消
git config --global --unset http.proxy
# 只对github.com
git config --global http.https://github.com.proxy socks5://127.0.0.1:7890
git config --global --unset http.https://github.com.proxy
# npm:
npm config set proxy http://proxy_host:port # HTTP 流量
npm config set https-proxy https://proxy_host:port # HTTPS 流量
npm config set https-proxy http://proxy_host:port # HTTPS 流量但是使用明文 HTTP 代理协议
# wget: 添加以下配置到 /etc/wgetrc 或 ~/.wgetrc (同时支持通用环境变量)
use_proxy=yes
http_proxy=127.0.0.1:8080
https_proxy=127.0.0.1:8080
# yum: 添加以下行到 /etc/yum.conf 的 main 里 (同时支持通用环境变量)
[main]
proxy=http://127.0.0.1:7890
proxy_username=<Proxy-User-Name>
proxy_password=<Proxy-Password>
# apt: 添加以下行到 /etc/apt/apt.conf.d/proxy.conf 或 /etc/apt/apt.conf
Acquire::http::Proxy "http://user:[email protected]:port/";
Acquire::https::Proxy "http://user:[email protected]:port/";
# pacman:支持 ftp_proxy http_proxy https_proxy no_proxy
# gpg import key fro keyserver
# 注意: apt-add-repository 只认小写格式的环境变量 http_proxy https_proxy
gpg --keyserver-options "http_proxy=http://proxy.server:post" --recv-keys 6A755776
# docker containers: 见 https://jingsam.github.io/2018/10/16/host-in-docker.html
# 使用 host.docker.internal 解析到宿主机器
# 使用 --net host 参数
# Windows https://martin.hoppenheit.info/blog/2015/set-windows-proxy-with-powershell/ 效果未测试
# pip https://stackoverflow.com/a/11869484/5281824
pip install --proxy http://user:pass@proxyAddress:proxyPort ...
- http_proxy 和 https_proxy 的区别
- Proxies - Everything curl
- Git - git-config Documentation
- git 设置和取消代理
- Using yum with a Proxy Server
- AptGet/Howto - Community Help Wiki
在程序内设置代理
- Go http - The Go Programming Language
- Python requests Advanced Usage — Requests 2.23.0 documentation
- Python aiohttp Advanced Client Usage — aiohttp 3.6.2 documentation
- NodeJS axios axios/axios: Promise based HTTP client for the browser and node.js
- NodeJS node-fetch node-fetch / support of http proxy
- Rust reqwest reqwest::Proxy - Rust
为全局或者单个应用设置代理
- 使用 HTTP 代理 Proxifier Alternatives and Similar Software - AlternativeTo.net
- 劫持系统网络相关的动态库 Proxychains Alternatives and Similar Software - AlternativeTo.net
匿名网络与监控
- Proxy server - Wikipedia
- Darknet - Wikipedia
- Deep web - Wikipedia
- Discovered Artifacts in Decrypted HTTPS - NETRESEC Blog
- aol/moloch: Moloch is an open source, large scale, full packet capturing, indexing, and database system.