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后点确定按钮。

v2rayN配置naive4、苹果手机Shadowrocket客户端配置,类型选择HTTPS或HTTP2。

Shadowrocket客户端naive节点配置.webp

五、其他说明

1、naive节点不支持CDN。

2、设置用户名和密码时,建议不要使用特殊符号,例如冒号等。可能产生字符串解析错误,无法运行。


本文出处:HiFeng'Blog
本文链接:
https://hicairo.com/post/49.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!