WireGuard+FRP回家教程

家宽无公网IP也可以出门在外畅联家中网络

第一步:

在VPS上部署服务端FRPS,docker-compose.yaml内容参考如下

services:
  frps:
    restart: always
    network_mode: host
    volumes:
      - './frps.toml:/etc/frp/frps.toml'
    container_name: frps
    image: snowdreamtech/frps
    environment:
      TZ: Asia/Shanghai

frps.toml文件填写如下

[common]
#frp 监听端口,与客户端绑定端口
bind_port= 5443
kcp_bind_port = 5443
#dashboard用户名
dashboard_user= vector
#dashboard密码
dashboard_pwd= password
#dashboard端口,启动成功后可通过浏览器访问如http://ip:9527
dashboard_port= 9527
#设置客户端token,对应客户端有页需要配置一定要记住,如果客户端不填写你连不上服务端
token = xxxxxxxxxx

在vps上开放端口

iptables -I INPUT -p udp --dport 51820 -j ACCEPT
iptables -I INPUT -p tcp --dport 51821 -j ACCEPT

第二步:

在家里NAS部署客户端FRPC,docker-compose.yaml内容参考如下

services:
  frpc:
    restart: always
    network_mode: host
    volumes:
      - './frpc.toml:/etc/frp/frpc.toml'
    container_name: frpc
    image: snowdreamtech/frpc
    environment:
      TZ: Asia/Shanghai

frpc.toml文件参考如下:

[common]
server_addr = vps的ip
server_port = 5443
token = xxxxxxxxxx

# 代理1: 穿透 WireGuard 的 UDP 数据端口
[wg-data]
type = udp
local_ip = 127.0.0.1
local_port = 51820
remote_port = 51820

# 代理2: 穿透 wg-easy 的 TCP Web UI 端口
[wg-ui]
type = tcp
local_ip = 127.0.0.1
local_port = 51821
remote_port = 51821

第三步:

在家中NAS部署WireGuard,以wg-easy为例

volumes:
  etc_wireguard: # 持久化存储 WireGuard 配置

services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy:latest # 使用 latest 或指定稳定版本,如 :14
    container_name: wg-easy
    environment:
      # --- 核心配置 ---
      # !!!重要:这里填写你的 frp 公网服务器的 IP 地址 !!!
      # 这是客户端配置文件中 Endpoint 的地址
      - WG_HOST=vps的ip

      # !!!重要:wg-easy Web UI 的管理员密码哈希 !!!
      # 强烈建议修改默认密码 'foobar123'
      # 可以使用 `docker run --rm ghcr.io/wg-easy/wg-easy:latest --pw your_strong_password` 生成哈希
      # 或者使用在线 bcrypt 生成器 (注意 rounds=5, 示例为 'foobar123' 的哈希)
      # - PASSWORD_HASH=$2y$05$6n2x0AdkZ5lJ8kHufbXrr.dU.UHMBh04HKYXoPb0w484wN75877Eu # (需要双 $$ 符号)

      # --- 网络配置 ---
      # WireGuard 服务监听的 UDP 端口 (容器内)
      - WG_PORT=51820
      # wg-easy Web UI 监听的 TCP 端口 (容器内)
      - PORT=51821

      # VPN 客户端分配的 IP 地址范围 (选择一个未使用的私有网段)
      - WG_DEFAULT_ADDRESS=10.8.0.x # 客户端将获取 10.8.0.2, 10.8.0.3 ...
      # 客户端使用的 DNS 服务器 (可使用公共 DNS 或内网 DNS)
      - WG_DEFAULT_DNS=114.114.114.114, 8.8.8.8

      # !!!重要:客户端允许访问的 IP 范围 !!!
      # 决定了哪些流量会通过 VPN 隧道
      # 10.8.0.0/24: 允许客户端之间互相访问 (如果需要)
      # 192.168.125.0/24: 允许客户端访问 test 服务器所在的局域网
      - WG_ALLOWED_IPS=10.8.0.0/24, 192.168.125.0/24

      # --- 可选配置 ---
      # 保持连接,防止 NAT 超时断开 (单位: 秒)
      - WG_PERSISTENT_KEEPALIVE=25
      # Web UI 语言 (支持 en, chs 등)
      - LANG=chs
      # 启用/禁用 Web UI 中的流量统计图表 (true/false)
      # - UI_TRAFFIC_STATS=true
      # 在 Web UI 中允许通过 HTTP 访问,如果前面没有反向代理做HTTPS,则需要设置为 true
      # 生产环境强烈建议配合反向代理使用 HTTPS
      # - INSECURE=true

    volumes:
      # 将 WireGuard 配置持久化到宿主机
      - etc_wireguard:/etc/wireguard
    ports:
      # 将宿主机的端口映射到容器端口
      # 格式: "宿主机端口:容器端口/协议"
      - "51820:51820/udp" # WireGuard 数据端口 (与 WG_PORT 一致)
      - "51821:51821/tcp" # wg-easy Web UI 端口 (与 PORT 一致)
    restart: unless-stopped
    cap_add:
      # 赋予容器必要的网络管理权限
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      # 启用 IP 转发,允许 VPN 客户端通过此服务器访问其他网络
      - net.ipv4.ip_forward=1
      # 确保 WireGuard 的网络标记正常工作
      - net.ipv4.conf.all.src_valid_mark=1
      # - net.ipv6.conf.all.forwarding=1 # 如果需要 IPv6 支持,取消注释

第四步:

那么在外面回家时可以使用WireGuard客户端进行连接,下面以loon为例:

首先在wireguard的web界面创建配置文件,比如ios-loon

loon→仪表→节点→右上角+→本地节点→扫一扫,扫面web界面的二维码即可添加,别名比如:HomeWG

在loon配置文件中[Proxy Group]位置增加下面内容

回家 = ssid,defaul=HomeWG,cellular=HomeWG,”家里的wifi名称”=DIRECT

wg-easy得docker-compose.yaml文件中增加环境变量PASSWORD_HASH,在NAS终端运行

docker run [ghcr.io/wg-easy/wg-easy:14](http://ghcr.io/wg-easy/wg-easy:14) node -e 'const bcrypt = require("bcryptjs"); const hash = bcrypt.hashSync("YOUR_PASSWORD", 10); console.log(hash.replace(/\$/g, "$$$$"));'

YOUR_PASSWORD 替换为自己想要设置的密码,拷贝输出结果并将其添加到 PASSWORD_HASH 环境变量中。

37 Likes

推荐一个二次开发的wireguard服务端,https://github.com/Safe3/firefly

4 Likes

UI颜值在线,好看

1 Like

感谢大佬教程

2 Likes

收藏一下,哪天有心情捣鼓捣鼓

1 Like

感谢大佬, :smiley:我刚放弃了 wireguard的方案,之前调通了, 后面换VPS 好像又被阻断了, 具体运营商会不会阻断, 不确定,
后面又尝试 加一层 udp2raw 转来转去 没搞成功.

最近换了 openvpn 方案.

室外 android → VPS frp 转发 udp → 室内 immortalWRT路由器 (openVPN server)

1 Like

学习一下

1 Like

使用一段时间看看,要是阻断就不好玩了

1 Like

mark一下

1 Like

没有 nas :sob:

1 Like

国内没应用起来的原因是 wireguard 特征明显 被宽带商Q :grinning_face_with_smiling_eyes:

不过确实配置简单好用…

1 Like

WireGuard 套 VLESS XTLS Reality 就行了

3 Likes

如果没有组网需求,可以直接用 VLESS XTLS Reality

1 Like

为什么不vps上直接部署wg-easy

1 Like

感谢分享 :hand_with_index_finger_and_thumb_crossed:

好 教程

感谢佬友分享

唔其实
frp不管是客户端还是服务端的dashboard其实都有点食之无味弃之可惜
唯一能干的事情似乎只是看连接状态的简单统计 frpc还多一个(其实也没什么用的)编辑配置文件的工具 仅此而已了)
所以我平时都懒得配置面板)

可以尝试一下headscale或者netbird,感觉方案要简单许多,网络带宽不会受限VPS带宽

直接frpc ssh 不香吗 如果需要家里的网路 v2 起码不会被封端口