无垠之码

深度剖析代码之道


科学上网-去你妈的gfw

0.代理方案


代理是一种网络技术,允许用户或应用通过中间服务器(代理服务器)与目标服务器进行通信,从而实现数据传输的控制、过滤、加速等功能。普通的HTTP/HTTPS代理、SOCKS代理、VPN等传统代理通常不专门设计来对抗防火墙和审查系统,其功能主要是聚焦于流量转发、访问控制、加密通信等。专用于GFW的代理在设计时就考虑到深度包检查、流量分析和阻断,其通过强加密、流量伪装与混淆等方式对抗网络封锁,一般都会采用客户端服务器模式

1.NavieProxy

NaïveProxy是一个基于Chromium网络栈(net 模块)开发的轻量级代理工具,其核心设计目标是模拟普通HTTPS流量,以规避深度包检测和流量审查。其客户端部分使用github-action构建项目,服务端使用Caddy充当代理服务器。

[Browser → Naïve client] ⟶ Censor ⟶ [Frontend → Naïve server] ⟶ Internet

代理过程中客户端浏览器的HTTPS请求被Naïve客户端接收(其用一个伪造的证书(如自动申请的免费证书)来和客户端完成TLS握手,拿到明文数据),随后客户端把明文包装成自己的HTTPS请求,再通过另一个 TLS连接发往后端真实代理服务器,代理服务器收到再解密、还原原始请求,再访问真实目标网站,数据的返程封装与请求过程一致。

安装

二进制安装,https://github.com/klzgrad/forwardproxy/releases中选择对应平台的二进制进程直接绿色安装

配置

服务器配置:
{
    order forward_proxy before file_server
}
:443, hostdare.diyao.me {
    tls hostdare@diyao.me
    forward_proxy {
        basic_auth diyao cauc.peter@gmail.com
        hide_ip
        hide_via
        probe_resistance
    }
    file_server {
        root /var/www/html
    }
}

客户端配置:
{
    "listen": "socks://127.0.0.1:1080",
    "proxy": "https://diyao:cauc.peter@gmail.com@hostdare.diyao.me"
}

2.Tuic

Tuic(全称为TUIC - Tailscale UDP In Congestion control)是一个现代、高性能、低延迟的UDP传输协议,专为代理和绕过网络限制场景而设计,尤其适合替代传统的TCP/TLS + HTTP/HTTPS代理技术。它本质上是一个基于QUIC协议的应用层代理协议。QUIC内建的多路复用,加密(TLS 1.3),快速握手,自带拥塞控制和重传机制,使得Tuic天生就具备低延迟、无HOL(头阻塞)和NAT穿透能力强等优势

安装

二进制安装,https://github.com/EAimTY/tuic/releases中选择对应平台的二进制进程直接绿色安装

配置

服务器配置:
{
    "server": "[::]:44443",
    "users": {
        "00000000-0000-0000-0000-000000000000": "cauc.peter@gmail.com"
    },
    "certificate": "/etc/letsencrypt/live/hostdare.diyao.me/fullchain.pem",
    "private_key": "/etc/letsencrypt/live/hostdare.diyao.me/privkey.pem",
    "congestion_control": "cubic",
    "alpn": ["h3", "spdy/3.1"],
    "udp_relay_ipv6": true,
    "zero_rtt_handshake": false,
    "dual_stack": true,
    "auth_timeout": "3s",
    "task_negotiation_timeout": "3s",
    "max_idle_time": "10s",
    "max_external_packet_size": 1500,
    "send_window": 16777216,
    "receive_window": 8388608,
    "gc_interval": "3s",
    "gc_lifetime": "15s",
    "log_level": "warn"
}  

客户端配置:
{
    "relay": {
        "server": "hostdare.diyao.me:44443",
        "uuid": "00000000-0000-0000-0000-000000000000",
        "password": "cauc.peter@gmail.com",
        "ip": "185.238.248.111",
        "congestion_control": "bbr",
        "alpn": ["h3"]
    },
    "local": {
        "server": "127.0.0.1:50000"
    },
    "log_level": "info"
}

3.Hysteria

Hysteria2是一个专为高性能网络代理设计的传输协议,特别擅长在 高丢包、高延迟、不稳定网络(如移动网络、跨境链路)中保持良好体验。它与Tuic一样,是新一代的"传输层代理",但实现方式不同,底层使用UDP + uTLS + 自定义协议(高效的流复用、多路并发、拥塞控制)

安装

二进制安装,https://github.com/apernet/hysteria/releases中选择对应平台的二进制进程直接绿色安装

配置

服务器配置:  
    listen: :44445
    tls: 
    cert: /etc/letsencrypt/live/hysteria2.diyao.me/fullchain.pem
    key: /etc/letsencrypt/live/hysteria2.diyao.me/privkey.pem 
    auth:
    type: password
    password: cauc.peter@gmail.com
    masquerade:
    type: proxy
    listenHTTPS: :44445
    proxy:
        url: https://news.cctv.com/
        rewriteHost: true

客户端配置:
    server: hysteria2.diyao.me:44445 
    auth: cauc.peter@gmail.com
    socks5:
    listen: 127.0.0.1:9999

4.Trojan

Trojan是一种将代理数据使用TLS协议封装,使得网络流量躲避GFW的检测和运营商Qos限制的技术手段。Trojan是典型的TLS in TLS协议,将用户的https请求封装在正常的TLS请求中,在代理服务器侧还原请求,转发至真实服务器,完成代理功能。Trojan-Go使用Golang语言实现Trojan代理协议。

Trojan-Go支持:

  1. 多路复用提升并发性能
  2. 使用路由模块实现国内外分流
  3. 支持CDN流量中转(基于 WebSocket over TLS)
  4. 支持使用AEAD对Trojan流量进行二次加密(基于Shadowsocks AEAD)
  5. 支持可插拔的传输层插件
  6. 允许替换TLS使用其他加密隧道传输Trojan协议流量

安装

yum install git golang
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
export https_proxy=http://127.0.0.1:2080
export http_proxy=http://127.0.0.1:2080
git clone https://github.com/p4gefau1t/trojan-go.git
cd trojan-go && make && make install #安装systemd服务等,可选

配置

配置详细说明: https://p4gefau1t.github.io/trojan-go/basic/full-config/

{
    "run_type": "server",
    "local_addr": "0.0.0.0",
    "local_port": 4443,
    "remote_addr": "HOST_IP",
    "remote_port": 8081,
    "log_level": 1,
    "log_file": "",
    "password": ["PASSWORD"],
    "buffer_size": 6553600,
    "dns": [],
    "disable_http_check": false,
    "ssl": {
        "verify": true,
        "verify_hostname": false,
        "cert": "/etc/trojan-go/cert1.pem",
        "key": "/etc/trojan-go/privkey1.pem",
        "key_password": "",
        "cipher": "",
        "curves": "",
        "prefer_server_cipher": false,
        "sni": "wuhan.chinalemon.net",
        "alpn": [
            "http/1.1"
        ],
        "session_ticket": true,
        "reuse_session": true,
        "plain_http_response": "",
        "fallback_addr": "HOST_IP",
        "fallback_port": 1234,
        "fingerprint": "firefox"
    },
    "tcp": {
        "no_delay": true,
        "keep_alive": true,
        "prefer_ipv4": false
    },
    "mux": {
        "enabled": true,
        "concurrency": 1024,
        "idle_timeout": 30
    },
    "router": {
        "enabled": false,
        "bypass": [],
        "proxy": [],
        "block": [],
        "default_policy": "proxy",
        "domain_strategy": "as_is",
        "geoip": "/usr/local/bin/geoip.dat",
        "geosite": "/usr/local/bin/geosite.dat"
    },
    "websocket": {
        "enabled": false,
        "path": "",
        "hostname": ""
    },
    "shadowsocks": {
        "enabled": false,
        "method": "AES-128-GCM",
        "password": ""
    },
    "transport_plugin": {
        "enabled": false,
        "type": "",
        "command": "",
        "plugin_option": "",
        "arg": [],
        "env": []
    },
    "forward_proxy": {
        "enabled": false,
        "proxy_addr": "",
        "proxy_port": 0,
        "username": "",
        "password": ""
    },
    "mysql": {
        "enabled": false,
        "server_addr": "MYSQL_HOST",
        "server_port": 53306,
        "database": "vps",
        "username": "trojan",
        "password": "PASSWORD",
        "check_rate": 600
    },
    "redis": {
        "enabled": false,
        "server_addr": "localhost",
        "server_port": 6379,
        "password": "PASSWORD"
    },
    "api": {
        "enabled": true,
        "api_addr": "0.0.0.0",
        "api_port": 10000,
        "api_tls": true,
        "ssl": {
        "cert": "/etc/trojan-go/server-cert.pem",
        "key": "/etc/trojan-go/server-key.pem",
        "key_password": "PASSWORD",
        "client_cert": []
        }
    }
}

5.SSH正向代理

ssh -NfD 1080 root@hostdare.diyao.me // 不执行ssh远程命令 后台运行 本地创建socks端口代理

6.Kcptun + Shadowsocks

隧道Kcptun

  1. 安装
  1. 配置
{
    "localaddr": ":8388",
    "remoteaddr": "185.238.248.111:5353",
    "key": "yaodi_cauc@163.com",
    // 激进的重传策略, 适合低延时的应用要求
    "mode": "fast3",
    // Differentiated Services Code Point, 配置 IP 数据包的 QoS, 通过对 IP 数据包的头部进行标记,
    // 来实现在网络设备(如路由器、交换机)中优先处理高优先级流量
    // https://en.wikipedia.org/wiki/Differentiated_services#Commonly_used_DSCP_values
    // 46 EF Expedited Forwarding (EF) PHB — dedicated to low-loss, low-latency traffic
    "dscp": 46,         
    // 服务器连接的总数限制
    "conn": 8,
    // 一个连接900s中没有数据传输, 断开连接
    "autoexpire": 900,
    // 进制数据压缩
    "nocomp": true,
    "sockbuf": 16777217
}

代理Shadowsocks

  1. 安装, pip install shadowsocks
  2. 配置
服务端配置
{
    "server":"127.0.0.1",
    "server_port":8388,
    "password":"yaodi_cauc@163.com",
    "timeout":600,
    "method":"aes-256-cfb",    // 内核支持选项 减少三次握手数量
    // 1. 传统交互 syn -> sync + ack -> ack 
    // 2. TFO 首次依旧是传统的三次握手(sync + FOC标记 -> 根据源ip计算出cookie, 发送sync+ack -> 存储cookie下次) 
    //    重连:
    //      1. sync + cookie + data -> 验证cookie 
    //          a. 失败发送sync+ack传统握手 
    //          b. 数据提交应用层 + 发送sync + ack, 不必等待客户端ack, 服务端处理完数据, 发送处理结果 
        
    "fast_open":false,
    "tunnel_remote":"8.8.8.8",
    "dns_server":["8.8.8.8", "8.8.4.4"],
    "tunnel_remote_port":53,
    "tunnel_port":53,
    "libsodium":"/usr/local/lib/libsodium.so",
    "libmbedtls":"/usr/local/lib/libmbedcrypto.2.4.0.dylib"
}

客户端配置
{
    "server":"127.0.0.1",
    "server_port":8388,
    "local_port":1080,
    "password":"yaodi_cauc@163.com",
    "timeout":600,
    "method":"aes-256-cfb",
    "local_address":"192.168.5.9",
    "fast_open":false,
    "tunnel_remote":"8.8.8.8",
    "dns_server":["8.8.8.8", "8.8.4.4"],
    "tunnel_remote_port":53,
    "tunnel_port":53,
    "libsodium":"/usr/local/lib/libsodium.so",
    "libmbedtls":"/usr/local/lib/libmbedcrypto.2.4.0.dylib"
}

目前常见的代理工具远不止前文提到的这些,实际上还有许多其他有效的代理方案可供使用。例如,VLESS和VMess等工具不仅功能更强大(all in one),而且伪装效果可能更加出色。由于时间有限,后续有机会再进一步补充

1.管理面板


git clone https://github.com/v2board/v2board-docker.git
cd v2board-docker/
git submodule update --init
echo '  branch = dev' >> .gitmodules
git submodule update --remote

image image

管理员界面 https://xboard.diyao.me/13241964
用户界面 https://xboard.diyao.me/

2.环境变量


一般情况系统可以通过设置 http_proxy|https_porxy|ftp_proxy|all_proxy|no_proxy|socks_proxy 配置代理

常用工具代理配置

  1. curl
curl --proxy=http://127.0.0.1:2080 your.forbidden.resources
echo proxy=http://127.0.0.1:2080 >> ~/.curlrc
  1. wget
https_proxy=http://127.0.0.1:2080 wget https://your.forbidden.resources
  1. git
git config --global|--local http.proxy http://127.0.0.1:2080
git config --global --unset http.proxy
git clone https://github.com/v2board/v2board.git
  1. apt
apt-get install cmake -o Acquire::Http::Proxy=http://127.0.0.1:2080
cat << EOF > /etc/apt/apt.conf.d/proxy.conf
Acquire::Http::Proxy "http://127.0.0.1:2080";
Acquire::Https::Proxy "http://127.0.0.1:2080";
EOF
  1. yum
http_proxy=http://127.0.0.1:2080 yum install cmake
cat << EOF > /etc/yum.conf
proxy=http://127.0.0.1:2080
EOF
  1. docker(most systemd管理应用均使用drop in可插拔方式)
mkdir -p /etc/systemd/system/docker.service.d
cat << EOF > /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:2080"
Environment="ALL_PROXY=http://127.0.0.1:2080"
Environment="HTTPS_PROXY=http://127.0.0.1:2080"
Environment="NO_PROXY=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,127.0.0.0/8,localhost"  
EOF

3.高级主题


在掌握基本的科学上网原理与工具使用之后,本节进一步探索更深入的网络策略与优化手段。这些高级主题不仅有助于提升连接的稳定性与速度,还能增强整体系统的可用性与隐蔽性。无论是在应对复杂网络环境,还是在追求更高匿名性与抗干扰能力的场景中,这些进阶内容都至关重要。

  1. 高可用, 负载均衡 haproxy

    通过将多个后端代理节点挂在HAProxy后面,即使某个节点宕机,客户端请求仍可被路由到其他健康节点,保证服务不中断。同时,HAProxy还支持基于端口、协议、路径的智能路由,可应对复杂的流量分发需求,是科学上网架构中提升可靠性和可维护性的常见手段

    listen admin_stats
    stats   enable
    bind    *:28888    #监听的ip端口号
    mode    http    #开关
    option  httplog
    log     global
    maxconn 10
    stats   refresh 1s   #统计页面自动刷新时间
    stats   uri /admin?stats    #访问的uri   ip:8080/admin
    stats   realm haproxy
    stats   auth diyao:625886  #认证用户名和密码
    stats   hide-version   #隐藏HAProxy的版本号
    stats   admin if TRUE   #管理界面,如果认证成功了,可通过webui管理节点
    
    global
        maxconn 5120         #默认最大连接数
        log 127.0.0.1:514 local0 debug #输出到本机,info级别 
        #log 192.168.5.170:9001 local0 debug #输出到本机,info级别 
    
    defaults
        mode   tcp           #所处理的类别,默认采用http模式
        option  forwardfor   #将客户端真实ip加到HTTP Header中供后端服务器读取
        option  httpclose    #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只>能模拟这种模式的实现
        retries 2            #2次连接失败就认为服务器不可用,主要通过后面的check检查
        option  redispatch   #当serverid对应的服务器挂掉后,强制定向到其他健康服务器
        option  abortonclose #当服务器负载很高时,自动结束掉当前队列中处理比较久的链接
        timeout connect 180000  #连接超时时间
        timeout client  180000 #客户端连接超时时间
        timeout server  180000 #服务器端连接超时时间
        maxconn 5120         #默认最大连接数
        log     global
    
    userlist UsersFor_ProxyAuth  
        user diyao insecure-password 625886
    
    frontend trojan-in
        mode http
        option  httplog
        option http_proxy   
        option http-use-proxy-header   
        capture request header proxy-authorization len 128 
        capture response header status-code len 32 
        http-request set-log-level debug 
        bind 0.0.0.0:38888-38890 alpn h2,http/1.1 
        default_backend trojan-client
        acl auth_acl http_auth(UsersFor_ProxyAuth)  
        http-request auth realm BasicAuth unless auth_acl  
    
    
    backend trojan-client
        mode http 
        option http-use-proxy-header 
        timeout server 180000
        balance uri 
        option httpchk GET /generate_204 HTTP/1.1\r\nHost:\ client3.google.com\r\nProxy-Connection:\ Keep-Alive 
        server 185.238.248.111 127.0.0.1:1443 maxconn 5120 weight 60 check inter 30000 rise 2 fall 3
    
  2. dns-cache dnsmasq systemd-resovled

    计算机科学中有两大难题:命名、缓存失效和off-by-one错误。在代理服务器上开启systemd-resovled,优化dns缓存配置可以提升DNS解析速度和连接稳定性

  3. 代理内部优化

    代理内部优化主要涉及代理工具的配置参数调整,不同的代理方案配置选项不同。

  4. 隐蔽ip 1. cloudfare proxy 2. tor网络

    • cloudfare,利用其cdn功能可以防止公网ip的暴露,缓解直接封锁。更高级的玩法还有域前置、TLS 加密、混淆协议、ESNI/ECH、分布式代理等技术,进一步提高代理安全性
    • tor网络,其实与科学上网并无很大关联,它的核心目标是匿名通信,而非绕过特定国家或地区的网络封锁。但可以在代理服务器侧接入tor网络,可以提升匿名性与抗审查能力
  5. gfw绕过 https://github.com/gfwlist/gfwlist.git

    gfwlist是一个由社区维护的域名列表,包含了在中国大陆被防火长城(GFW)屏蔽的网站域名。这份列表最初用于配合代理软件(如Shadowsocks、Privoxy、SwitchyOmega等)实现"按需代理"功能,即仅对列表中被屏蔽的站点走代理,其余流量则直连,大幅降低代理负载,提高访问效率。其使用Adblock Plus的规则语法,格式简洁易于解析。许多科学上网工具(如 Clash、V2Ray)也提供了与gfwlist兼容的配置方式,或支持将其转换为YAML、PAC等格式用于路由策略。在实际使用中,建议将gfwlist作为基础策略。鉴于新版的chrome浏览器停止对扩展Manifest V2版本的支持,用户需要使用zeroomega加载gfwlist作为基础代理策略

  6. 切换内核拥塞控制算法bbr

    TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是由Google开发的一种TCP拥塞控制算法,旨在显著提高互联网传输速度,同时减少网络延迟。BBR的核心思想是基于网络的瓶颈带宽和往返时间(RTT)来控制网络流量,而不是依赖于传统方法中的数据包丢失作为网络拥塞的主要指标。BBR拥塞控制算法在内核4.9版本正式发布,用户只需要简单开启即可。BBR积极地争取带宽使用权,能更快突破GFW的限速窗口,其对抗GFW限速、丢包等轻度干扰效果明显。现在BBR算法存在多个版本,如需最新版本可能需要重新编译内核模块。

    echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf 
    echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p
    

4.参考文献

  1. 内存管理之自定义内存分配器
  2. Chromium 文档翻译:PartitionAlloc Design
  3. v2ray移动客户端
  4. v2ray电脑客户端
  5. nekoray电脑客户端
  6. NekoBoxForAndroid移动客户端
  7. zeroOmega源码
comments powered by Disqus