This page looks best with JavaScript enabled

NaiveProxy | 墙高一尺我高一丈

超速爬墙!

 ·  ☕ 7 min read

自北京时间2022年10月3日起,超过一百名用户报告他们至少有一台基于TLS的翻墙服务器被封锁了。被封锁的服务器使用的协议包括了trojan,Xray,V2Ray TLS+Websocket,VLESS,以及gRPC。我们还未收到任何naiveproxy被封锁的消息。
来源:Github

本文的劳动成果属于kwaa,本文仅作备忘使用,鞠躬。
原文地址:https://kwaa.dev/docker-proxy

临近二十大,GFW大规模地封锁基于TLS的翻墙服务器。目前我的手里只有两个欧盟地区(线路优化差,所以冷门,比美国地区不容易封锁)的小服务器,搭建了一个Shadowsocks-libev代理和两个基于Shadowsocks-libev的Outline代理。鉴于臭名昭著的泉州白名单机制,虽然SS协议目前还比较安全,但我周围的人都开始搭Trojan和V2ray了,所以我另辟蹊径搭了一个目前来说最隐蔽的抗封锁代理NaiveProxy,搭配网络优化工具Hysteria使用。

NaiveProxy,挪威语叫NaïveProxy,翻译成中文:“天真的代理”,是2019年底由klzgrad开发的一种突破GFW网络审查的新型科学上网代理技术,它使用Chrome的网络堆栈来伪装流量,具有较强的抗审查能力和较低的可检测性,重用Chrome网络堆栈是确保性能和安全性的最佳实践。

NaiveProxy还可以缓解以下流量攻击:

  • 网站指纹识别/流量分类:通过 HTTP/2 中的流量多路复用来缓解。
  • TLS参数指纹识别:因重用Chrome的网络堆栈而失败。
  • 主动探测:被应用程序前端击败,即通过应用层路由将代理服务器隐藏在常用前端的后面。
  • 基于长度的流量分析:通过长度填充缓解。

Trojan最大的优点就是伪装成互联网最常见的HTTPS流量,而NaiveProxy最大的优势不仅伪装成 HTTP/2 的流量,而且使用互联网最常用的浏览器Chrome网络堆栈的指纹,更加难以被识别。

准备工作

一个 VPS 和一个设置好解析的域名。 正如标题,代理都通过 Docker 容器搭建,所以搭建之前的步骤都是可选的(但我强烈推荐)。

Debian sid

谁能拒绝在 VPS 上一个滚动更新,软件包版本接近 Arch 的 Debian 呢?

在 Debian bullseye(11) 的基础上升级,更旧的版本最好先升级到 bullseye。

apt update && apt upgrade
nano /etc/apt/sources.list

删干净。然后加一行:

deb http://deb.debian.org/debian unstable main contrib non-free

为什么只需要一行?

  • deb-src 是源代码存储库——除非你想用 Debtoo,所以不需要。
  • sid/unstable 只有软件包维护者的安全更新,所以也不需要。
  • 由于 sid 是滚动更新,自然也不存在什么 sid-backports, sid-update… 还是不需要。

再运行一次apt update && apt upgrade,准备装 cloud 内核。

Linux Cloud

alpine 我用linux-virt,debian 就用linux-image-cloud

一条命令安装并删除旧内核:

apt install linux-image-cloud-amd64 && apt autoremove

reboot重连后就是 sid + cloud 了。

UFW

我很喜欢的一个防火墙工具,因为简单; 没有其他服务的话,只需要放行 SSH / HTTPS 端口。

apt install ufw
ufw limit ssh
ufw allow https
ufw enable # y 回车确认

搭建

首先安装 docker… podman / containerd 应该也行,但我没试过。

Docker

都上 sid 了,当然是直接 apt 安装。

apt install docker.io

NaiveProxy

先创建一个配置文件,使用你的参数替换掉{{注释}}的值并去掉#注释

mkdir /etc/caddy && nano /etc/caddy/Caddyfile
{ # 如果不打算使用 Hysteria 并想为 NaiveProxy 启用 HTTP/3,则使用此段。
  servers {
    protocol {
      experimental_http3
    }
  }
} # 以下是通常配置
:443, {{域名}}
tls {{邮箱}}
route {
  forward_proxy {
    basic_auth {{用户名}} {{密码}} # 如果需要多用户就按照这个格式新增一行
    hide_ip
    hide_via
    probe_resistance
  }
  reverse_proxy {{要反代的网站}} # 最省事的方法,当然也可以自建一个服务
}

然后需要一个包含了 forwardproxy 模块的 caddy,这里我使用自己的镜像kwaa/caddy

同时这也是一个不错的自动编译模板:如果你需要在此基础上添加或删除插件,可以考虑 Fork 一份。

如果不打算使用 Hysteria 并想为 NaiveProxy 启用 HTTP/3,则在-p 443:443 \下新增一行:-p 443:443/udp \

docker run -d \
--name caddy \
-p 80:80 \
-p 443:443 \
-v /etc/caddy/:/etc/caddy/ \
-v /root/.local/share/caddy:/root/.local/share/caddy \
--sysctl net.ipv4.tcp_congestion_control=bbr \
--restart unless-stopped \
kwaabot/caddy

参数:

  • 容器名称caddy
  • 映射容器的 80 & 443 端口到宿主机
  • 映射容器的/etc/caddy(配置)和/root/.local/share/caddy(证书)文件夹到宿主机
  • 重启策略:无论退出状态如何都始终重启容器(除非手动停止)

Hysteria

追加内容!

README所述,Hysteria 是一个功能丰富的,专为恶劣网络环境进行优化的网络工具。

这里我尝试用它来代理流量,并和 caddy 共用 443 端口。

创建一个配置文件/etc/hysteria.json,在里面设置域名、证书和混淆密码。 caddy 之前已经映射了文件夹,所以只需要使用文件夹内的证书即可。 将证书文件夹映射到容器的/etc/hysteria/,最简配置:

{
  "listen": ":443",
  "cert": "/etc/hysteria/{{域名}}/{{域名}}.crt",
  "key": "/etc/hysteria/{{域名}}/{{域名}}.key",
  "obfs": "{{密码}}"
}

2024/11/15更新:

Hysteria升级至v2版本,实现了v1绝大部分功能,但与v1完全不兼容。此外本文配置有部分更新,请检查。
另外官方文档使用的配置是yaml,这里沿用kwaa的配置格式,依旧使用json(Hysteria都是支持的)。

然后创建容器,Hysteria 提供了 Docker 镜像。

如果设置了 acme_ca,则需要修改证书目录为签发者 URL。

docker run -dt \
--name hysteria \
-p 443:443/udp \
-v /etc/hysteria.json:/etc/hysteria.json \
-v /root/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/:/etc/hysteria/ \
--sysctl net.ipv4.tcp_congestion_control=bbr \
--restart unless-stopped \
tobyxdd/hysteria -config /etc/hysteria.json server

参数:

  • 容器名称hysteria
  • 映射容器的 80 & 443 端口到宿主机
  • 映射/etc/hysteria.json到容器
  • 映射/root/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/(证书)文件夹到容器的/etc/hysteria/
  • 重启策略:无论退出状态如何都始终重启容器(除非手动停止)

自动更新镜像

说实话这个用不用无所谓,但我还是用了。

docker run -dt \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart unless-stopped \
containrrr/watchtower \
--cleanup -i 86400

参数:

  • 容器名称 watchtower
  • 映射宿主机的/var/run/docker.sock(Docker 守护进程)文件夹到容器
  • 重启策略:无论退出状态如何都始终重启容器(除非手动停止)
  • 自动清理过期镜像,每天检查一次更新

性能调优

总结一下:

# bbr
net.ipv4.tcp_congestion_control=bbr
net.core.default_qdisc=cake
# naiveproxy recommend
net.ipv4.tcp_slow_start_after_idle=0
net.ipv4.tcp_notsent_lowat=16384
# hysteria recommend
net.core.rmem_max=4000000

一条搞定。

echo -e 'net.ipv4.tcp_congestion_control=bbr\nnet.core.default_qdisc=cake\nnet.ipv4.tcp_slow_start_after_idle=0\nnet.ipv4.tcp_notsent_lowat=16384\nnet.core.rmem_max=4000000' >> /etc/sysctl.conf && sysctl -p

验证结果

NaiveProxy 客户端配置(如果使用 HTTP3 则将 https:// 改为 quic://):

{
  "listen": "socks://0.0.0.0:{{本地端口1}}",
  "proxy": "https://{{用户名}}:{{密码}}@{{域名}}"
}

Hysteria 客户端配置:

{
  "server": "{{域名}}:443",
  "obfs": "{{密码}}",
  "socks5": {
    "listen": "0.0.0.0:{{本地端口2}}"
  }
}

连上互联网了,本文结束。

2024/11/15更新

由于 Hysteria v2 释出,下面更新相关配置。

对于/etc/hysteria.json配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
  "listen": ":443",
  "tls": {
    "cert": "/etc/hysteria/{{域名}}/{{域名}}.crt",
    "key": "/etc/hysteria/{{域名}}/{{域名}}.key"
  },
  "auth": {
    "type": "password",
    "password": "{{认证密码}}"
  },
  "obfs": {
    "type": "salamander", 
    "salamander": {
      "password": "{{混淆密码}}"
    }
  },
  "masquerade": {
    "type": "proxy",
    "proxy": {
      "url": "{{要反代的网站}}, 
      "rewriteHost": true 
    }
  }
}

详细解释一下:

  • 证书签名:可以选择使用 tlsacme,但不能同时包含两者。tls是证书自签,前面已经用 caddy 签好了这里直接放证书地址。
  • auth:认证的部分,方式有password | userpass | http | command。选择密码。
  • obfs(混淆):“Salamander” 的混淆实现,将数据包混淆成没有特征的 UDP 包。启用混淆将使服务器与标准的 QUIC 连接不兼容,失去 HTTP/3 伪装的能力。
  • masquerade:伪装成标准的 HTTP/3 流量。

Hysteria 客户端方面:添加一个认证参数auth

但是 Hysteria 是有争议的,浅看了一下作者的仓库,新增了一个 OpenGFW 的项目。看了一眼简介和一些细节,声称比真正的 GFW 还要优秀。自产矛与盾,多余的话不可多说。


Roelxy
WRITTEN BY
Roelxy
新世紀摸魚戰士