家宽无公网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
环境变量中。