树莓派 + FRP + V2Ray 链式代理搭建实践

本文档记录了在海外树莓派(ARM64)上部署 V2Ray 服务端,通过 FRP 内网穿透
将服务暴露到国内NAS,最终实现链式代理的完整实践过程。

背景和需求

概述

整体架构

┌─────────────┐      ┌─────────────────────────────────────────────────────┐
│  你的客户端   │ ──→ │  国内服务器 (NAS)                                    │
│ (手机/电脑)  │      │  ┌─────────────────────────────────────────────┐   │
└─────────────┘      │  │ V2Ray 入站 (SS/VMess) 端口: 1234/5678      │   │
                     │  │         ↓                                   │   │
                     │  │ V2Ray 出站 (VMess) → 127.0.0.1:8848       │   │
                     │  │         ↓                                   │   │
                     │  │ frps 服务端 → 监听 0.0.0.0:7000           │   │
                     │  └─────────────────────────────────────────────┘   │
                     └──────────────────────┬──────────────────────────────┘
                                            │ FRP 隧道 (主动连接)
                                            ↓
                     ┌─────────────────────────────────────────────────────┐
                     │  国外树莓派 (ARM64)                                 │
                     │  ┌─────────────────────────────────────────────┐   │
                     │  │ frpc 客户端 → 连接 frps:7000              │   │
                     │  │         ↓                                   │   │
                     │  │ 代理转发: localhost:8086 → remotePort:8848│   │
                     │  │         ↓                                   │   │
                     │  │ V2Ray 服务端 → 监听 127.0.0.1:8086        │   │
                     │  │         ↓                                   │   │
                     │  │ outbound: freedom → 访问互联网              │   │
                     │  └─────────────────────────────────────────────┘   │
                     └─────────────────────────────────────────────────────┘

一、国外树莓派端配置(ARM64)

1.1 创建 V2Ray 配置文件

mkdir -p ~/v2ray
nano ~/v2ray/config.json

配置文件内容(~/v2ray/config.json):

{
  "log": {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "port": 8086,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "xxxx-xxxx-xxxx-xxxx-xxxx",
            "alterId": 0
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "tcpSettings": {
          "header": {
            "type": "none"
          }
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct",
      "settings": {}
    },
    {
      "protocol": "blackhole",
      "tag": "block",
      "settings": {}
    }
  ],
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "outboundTag": "block",
        "domain": ["geosite:category-ads-all"]
      },
      {
        "type": "field",
        "outboundTag": "direct",
        "ip": ["geoip:private"]
      }
    ]
  }
}

1.2 启动 V2Ray 服务端

# 拉取镜像(官方镜像支持 ARM64)
docker pull v2fly/v2fly-core:v5.24.0

# 启动容器
docker run -d \
  --name v2ray-server \
  --restart always \
  --network host \
  -v ~/v2ray/config.json:/etc/v2ray/config.json:ro \
  -v ~/v2ray/logs:/var/log/v2ray \
  v2fly/v2fly-core:v5.24.0 \
  run -c /etc/v2ray/config.json

1.3 创建 FRP 客户端配置

mkdir -p ~/frp
nano ~/frp/frpc.toml

配置文件内容(~/frp/frpc.toml):

# frpc.toml - 树莓派客户端配置
serverAddr = "国内NAS公网IP或DDNS域名"
serverPort = 7000

auth.token = "YourStrongTokenHere123!"

log.to = "/var/log/frp/frpc.log"
log.level = "info"
log.maxDays = 3

[[proxies]]
name = "v2ray-backend"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8086
remotePort = 8848

1.4 启动 FRP 客户端

# 拉取镜像
docker pull snowdreamtech/frpc:0.70.1-debian

# 启动容器
docker run -d \
  --name frpc \
  --restart always \
  --network host \
  -v ~/frp/frpc.toml:/etc/frp/frpc.toml:ro \
  -v ~/frp:/var/log/frp \
  snowdreamtech/frpc:0.70.1-debian \
  -c /etc/frp/frpc.toml

1.5 验证树莓派端服务

# 查看 V2Ray 日志
docker logs v2ray-server

# 查看 FRP 客户端日志
docker logs frpc | grep "start success"

# 检查端口监听
sudo netstat -tlnp | grep 8086

二、国内NAS端配置

2.1 创建 FRP 服务端配置

mkdir -p /volume1/docker/frp
nano /volume1/docker/frp/frps.toml

配置文件内容(/volume1/docker/frp/frps.toml):

# frps.toml - 国内NAS端配置
bindAddr = "0.0.0.0"
bindPort = 7000

auth.token = "YourStrongTokenHere123!"

webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "AdminPassword123"

log.to = "/var/log/frp/frps.log"
log.level = "info"
log.maxDays = 3

allowPorts = [
    { start = 8848, end = 8848 }
]

2.2 创建 docker-compose.yml

version: '3.8'

services:
  frps:
    image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/snowdreamtech/frps:0.70.1-debian
    container_name: frps
    restart: always
    network_mode: host
    volumes:
      - /volume1/docker/frp/frps.toml:/etc/frp/frps.toml:ro
      - /volume1/docker/frp/logs:/var/log/frp
    environment:
      - TZ=Asia/Shanghai

2.3 启动 FRP 服务端

cd /volume1/docker/frp
docker-compose up -d

2.4 国内 V2Ray 配置调整
国内 V2Ray 的 outbounds 中,将原来直连树莓派的配置改为指向本地 FRP 端口:

"outbounds": [{
    "protocol": "vmess",
    "tag": "proxy",
    "settings": {
        "vnext": [{
            "address": "127.0.0.1",
            "port": 8848,
            "users": [{
                "id": "xxxx-xxxx-xxxx-xxxx-xxxx",
                "alterId": 0
            }]
        }]
    },
    "streamSettings": {
        "network": "tcp",
        "tcpSettings": {
            "header": {
                "type": "none"
            }
        }
    }
},
// ... 其他 outbound 配置保持不变

2.5 验证国内NAS端服务

# 查看 frps 日志
cd /volume1/docker/frp
docker-compose logs -f

# 访问 Dashboard(可选)
# http://你的国内IP:7500

端口对照总览

组件.    位置             端口             说明
V2Ray   服务端           树莓派:8086       监听 VMess 协议
frpc    localPort       树莓派:8086       连接本地 V2Ray
frps    bindPort        NAS:7000         接收 frpc 连接
frpc    remotePort      NAS:8848         暴露的代理端口
V2Ray   出站 port        NAS:8848         连接 FRP 隧道
frps    Dashboard       NAS:7500         Web 管理面板(可选)
V2Ray   入站(客户端)    NAS:1234/5678    Shadowsocks/VMess 入口

注意事项

  1. 防火墙端口:国内NAS需开放 7000(FRP 控制端口)、8848(代理端口)、7500(Dashboard,可选)。
  2. 认证 Token:frps.toml 和 frpc.toml 中的 auth.token 必须完全一致。
  3. 协议一致性:国内 V2Ray 出站使用 vmess,树莓派 V2Ray 入站也必须使用 vmess 协议,且 id 和 alterId 完全匹配。
  4. 架构兼容:树莓派需使用支持 linux/arm64 的镜像(v2fly/v2fly-core 官方镜像已支持)。
  5. 配置文件格式:新版本 FRP 推荐使用 toml 格式,避免使用 ini 格式导致功能异常。

最终验证

完成所有配置后,使用客户端连接国内服务器的 1234(Shadowsocks)或 5678(VMess)端口,访问 Google 验证代理是否生效。

标签:raspberry pi, nas

评论区

快来做第一个评论的人吧~