naive节点搭建教程-完美解决tls指纹暴露问题
最近,或许你已经感觉到V2Ray在没有套CDN时,受到干扰的频率越来越高,Telegram群里也经常有小伙伴反馈端口频繁被封。同时随着Trojan技术逐渐被GFW精准识别,NaiveProxy迅速走上了前台被人们关注,NaiveProxy是一种基于HTTP/2协议,并类似于Trojan协议,伪装成最流行的HTTPS流量的新代理技术协议。有关naive节点搭建的方法,网上已经有很多教程,正常情况下按照不良林、一灯不是和尚等大佬的教程都可以完美搭建naive节点。ifeng通过测试,已经在hax.co.id/woiden.id小笨鸡上成功搭建naive节点,且运行稳定。这篇教程会谈到一些其他教程中没有提及的内容。
一、NaiveProxy介绍
1、NaiveProxy是什么?
NaiveProxy,挪威语叫NaïveProxy,翻译成中文:“天真的代理”,可以理解为安装了Naive插件的caddy,是2019年底由klzgrad大神开发的一种突破GFW网络审查的新型科学上网代理技术,它使用Chrome的网络堆栈来伪装流量,具有较强的抗审查能力和较低的可检测性,重用Chrome网络堆栈是确保性能和安全性的最佳实践。
NaiveProxy还可以缓解以下流量攻击:
- 网站指纹识别/流量分类:通过HTTP/2中的流量多路复用来缓解。
- TLS参数指纹识别:因重用Chrome的网络堆栈而失败。
- 主动探测:被应用程序前端击败,即通过应用层路由将代理服务器隐藏在常用前端的后面。
- 基于长度的流量分析:通过长度填充缓解。
该代码由一系列补丁程序组成,这些补丁程序在每个新的Chrome版本中都经过了变形和重新设计。
NaiveProxy项目地址:https://github.com/klzgrad/naiveproxy
2、NaiveProxy的工作原理
工作原理架构:[浏览器 → NaiveProxy客户端] ⟶ GFW ⟶ [常用前端 → NaiveProxy服务端] ⟶ 互联网
由于NaiveProxy使用Chrome的网络堆栈,GFW审查截获的流量行为与Chrome和标准前端(如 Caddy、HAProxy)之间的常规 HTTP/2流量完全相同。前端还会将未经身份验证的用户和活动探测器重新路由到后端HTTP服务器,从而使得无法检测到代理的存在,比如像这样:探查⟶常用前端⟶网站页面。
从 NaiveProxy V84版本开始,用户可以在没有Naive服务器的情况下运行Caddy转发代理的Naive分支。
3、NaiveProxy与Trojan的优点与区别
Trojan最大的优点就是伪装成互联网最常见的HTTPS流量,而NaiveProxy最大的优势不仅伪装成HTTP/2的流量,而且使用互联网最常用的浏览器Chrome网络堆栈的指纹,更加难以被识别。
二、搭建Naive节点的条件
服务器/VPS一台,如果是采用openvz虚拟技术的vps,内存1G以上;域名一个;邮箱一个。
三、在服务器端搭建Naive节点
1、对于hax.co.id/woiden.id等纯ipv6主机,打开DNS64,其他主机跳过这一步。
echo -e "nameserver 2a01:4f8:c2c:123f::1" > /etc/resolv.conf
2、升级操作系统内核
建议升级一下系统内核,避免产生缺失某些依赖环境造成go语言无法运行的现象。
hostnamectl | grep -i system | cut -d: -f2
使用上述命令查询你的操作系统。
#Debian、Ubuntu等操作系统使用以下命令升级 apt update apt upgrade -y apt full-upgrade -y apt-get install socat #Redhat、Centos、Fedora等操作系统使用以下命令升级 yum -y update rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm yum --enablerepo=elrepo-kernel install kernel-ml grub2-set-default 0 yum -y remove kernel-3.* yum install -y socat
3、安装bbr加速模块
hostnamectl | grep -i openvz
使用上述命令查询vps采用的虚拟技术,如果是openvz,跳过这一步。
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf sysctl -p echo "tcp_bbr" >> /etc/modules-load.d/modules.conf
4、检查vps内存大小,设置swap分区
编译naive过程中,要求系统至少1G内存,可以使用如下命令查询内存大小。
free -h
如果你的内存小于1G,编译过程中会因为内存溢出(Out Of Memory:简称OOM)异常中止,会提示如下错误。
2022/11/24 03:08:44 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /root/caddy -ldflags -w -s -trimpath go build github.com/lucas-clemente/quic-go: /usr/local/go/pkg/tool/linux_amd64/compile: signal: terminated 2022/11/24 03:08:49 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-11-24-0306.4090021060 2022/11/24 03:08:49 [FATAL] exit status 1
解决方法为设置swap分区,首先使用下面命令查询vps采用的虚拟技术。
hostnamectl | grep -i openvz
请注意,openvz虚拟技术不支持自行设置swap分区。如果你的vps采用的是KVM虚拟技术,可以使用如下方法。
#增加一个512M的swap空间 dd if=/dev/zero of=/var/swap bs=1024 count=512000 #创建swap文件 mkswap -f /var/swap #加载该文件 swapon /var/swap #添加至/etc/fstab echo "/var/swap swap swap defaults 0 0" >> /etc/fstab #修改swappiness值为30 sudo sysctl vm.swappiness=30 #修改sysctl.conf,确保系统重启后生效 echo "vm.swappiness =30" >> /etc/sysctl.conf
5、开启防火墙端口
firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=80/udp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --permanent --add-port=443/udp firewall-cmd --reload #如果你的naive准备使用自定义端口(例如:10527),使用如下命令开启 firewall-cmd --permanent --add-port=10527/tcp firewall-cmd --permanent --add-port=10527/udp firewall-cmd --reload
6、安装go语言环境
使用如下命令查询系统构架。
uname -m
到官网下载对应的版本,目前最新版本为1.19.4。例如:https://go.dev/dl/go1.19.4.linux-amd64.tar.gz
wget https://go.dev/dl/go1.19.4.linux-amd64.tar.gz tar -C /usr/local -xzf go1.19.4.linux-amd64.tar.gz export PATH="/usr/local/go/bin:$PATH" go env -w GO111MODULE=on rm -f go1.19.4.linux-amd64.tar.gz
7、安装caddy+naive
请注意,服务器配置不同,编译caddy所需的时间不同,我使用hax.co.id小笨鸡测试,用了50分钟才编译完成,只要程序不异常退出,耐心等待即可。如果不放心,可以使用ssh再开一个连接,使用free命令查询内存的使用情况。
cd && go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest ~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive rm -rf go
8、使用自定义端口,将Caddy作为守护进程运行
官方文档(https://github.com/klzgrad/naiveproxy/wiki/Run-Caddy-as-a-daemon)提到,Caddy作为守护进程运行,systemctl的版本需要>=232。经过我的实际测试,systemd版本为219,可以正常稳定运行。
#使Caddy可执行并将caddy二进制文件移动到/usr/bin/ chmod a+x caddy mv caddy /usr/bin/ #创建/etc/caddy目录 mkdir /etc/caddy #创建用户和组 groupadd --system caddy useradd --system \ --gid caddy \ --create-home \ --home-dir /var/lib/caddy \ --shell /usr/sbin/nologin \ --comment "Caddy web server" \ caddy #在/etc/systemd/system/目录创建caddy.service cat > /etc/systemd/system/caddy.service <<EOF [Unit] Description=Caddy Documentation=https://caddyserver.com/docs/ After=network.target network-online.target Requires=network-online.target [Service] User=caddy Group=caddy ExecStart= ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/config.json ExecReload= ExecReload=/usr/bin/caddy reload --config /etc/caddy/config.json TimeoutStopSec=5s LimitNOFILE=1048576 LimitNPROC=512 PrivateTmp=true ProtectSystem=full AmbientCapabilities=CAP_NET_BIND_SERVICE [Install] WantedBy=multi-user.target EOF #在/etc/caddy/目录创建config.json。请注意,config.json中10527为端口, # example.domain.com为域名,根据情况自行修改。 cat > /etc/caddy/config.json <<EOF { "apps": { "http": { "servers": { "srv0": { "listen": [ ":10527" ], "routes": [ { "handle": [ { "auth_user_deprecated": "user", "auth_pass_deprecated": "password", "handler": "forward_proxy", "hide_ip": true, "hide_via": true, "probe_resistance": {} } ] }, { "handle": [ { "handler": "reverse_proxy", "headers": { "request": { "set": { "Host": [ "{http.reverse_proxy.upstream.hostport}" ], "X-Forwarded-Host": [ "{http.request.host}" ] } } }, "transport": { "protocol": "http", "tls": {} }, "upstreams": [ { "dial": "demo.cloudreve.org:443" } ] } ] } ], "tls_connection_policies": [ { "match": { "sni": [ "example.domain.com" ] }, "certificate_selection": { "any_tag": [ "cert0" ] } } ], "automatic_https": { "disable": true } } } }, "tls": { "certificates": { "load_files": [ { "certificate": "/etc/caddy/example.domain.com.pem", "key": "/etc/caddy/example.domain.com.key", "tags": [ "cert0" ] } ] } } } } EOF
9、申请域名证书
确认你的域名已经正确解析后执行以下命令。
curl https://get.acme.sh | sh ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh acme.sh --set-default-ca --server letsencrypt #example.domain.com请替换为你的真实域名 #注意:hax.co.id/woiden.id等纯ipv6主机,在下面命令中加上--listen-v6参数 acme.sh --issue -d example.domain.com --keylength ec-256 --standalone --insecure acme.sh --install-cert -d example.domain.com --ecc \ --key-file /etc/caddy/example.domain.com.key \ --fullchain-file /etc/caddy/example.domain.com.pem
10、启动Caddy
chown -R caddy:caddy /etc/caddy/ systemctl daemon-reload systemctl enable caddy systemctl start caddy #查看当前状态 systemctl status caddy #使用更改的配置文件重新加载caddy systemctl reload caddy
这时,你应该可以使用https://example.domain.com:10527访问caddy的伪装网站。
四、客户端配置
naive客户端:https://github.com/klzgrad/naiveproxy/releases/latest
1、根据客户端操作系统,下载对应的naive客户端,以64位windows操作系统为例。
在官方网站下载naiveproxy-v108.0.5359.94-1-win-x64.zip后解压。将naive.exe文件copy到v2rayN安装目录。用记事本创建一个config.json文件,内容如下:
{ "listen": "socks://127.0.0.1:1080", "proxy": "https://user:[email protected]:10527" }
根据服务器的设置,对应修改上述配置文件中的user,password,域名和端口。
2、v2rayN客户端配置,点击菜单上“服务器”中的“添加自定义服务器”,如果你的v2rayN没有下述选项,请在官网下载最新版本。
3、导入上一步配置好的config.json文件,Core类型选择naiveproxy,Socks端口填1080后点确定按钮。
4、苹果手机Shadowrocket客户端配置,类型选择HTTPS或HTTP2。
五、其他说明
1、naive节点不支持CDN。
2、设置用户名和密码时,建议不要使用特殊符号,例如冒号等。可能产生字符串解析错误,无法运行。
本文出处:HiFeng'Blog
本文链接:https://hicairo.com/post/49.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!