frp在v0.6.0版本引入了 虚拟网络(VirtualNet) 功能,不过目前只支持Linux和macOS系统,还需要root/管理员权限来创建tun虚拟网络。
一、流程
frp支持p2p的内网穿透,之前也写过在小米路由安装frpc,但是要代理的端口太多了,需要复制粘贴一大堆的配置,比较麻烦,于是就到了用小米路由 与 nas组建虚拟网,实现效果还是和之前内网穿透一样。

前提条件:
- 一台公网frps服务器
- 家里Nas,已经配置好 SMB文件共享(端口445) 、WebDav(端口80,可选端口443) 等端口
- 出租屋解锁SSH的小米路由,我家是小米路由器 AX3000T 解锁 SSH
- 小米路由IP: 192.168.1.1
实现目标:
- 小米路由内客户端访问虚拟网(如:100.86.0.1)相当于访问了远程的飞牛Nas
二、配置frp虚拟局域网
1. 在Nas端配置虚拟网服务器
# 服务器域名端口
serverAddr = "公网服务器ip或域名"
serverPort = 5000
# 权限认证
auth.method = "token"
auth.token = "123456"
# 开启 VirtualNet
featureGates = { VirtualNet = true }
# 配置虚拟网络接口
virtualNet.address = "100.86.0.1/24"
[[proxies]]
name = "vnet-server"
type = "stcp"
secretKey = "your-secret-key"
[proxies.plugin]
type = "virtual_net"
2. 小米路由frp安装配置
# 服务器域名端口
serverAddr = "公网服务器ip或域名"
serverPort = 5000
# 权限认证
auth.method = "token"
auth.token = "123456"
# 开启 VirtualNet
featureGates = { VirtualNet = true }
# 配置虚拟网络接口
virtualNet.address = "100.86.0.2/24"
[[visitors]]
name = "vnet-visitor"
type = "stcp"
serverName = "vnet-server"
secretKey = "your-secret-key"
bindPort = -1
[visitors.plugin]
type = "virtual_net"
destinationIP = "100.86.0.1"
3. 测试连接
到这,小米路由和nas之间的虚拟网已经组建成功。可以互ping测试
# 小米路由上:
ping 100.86.0.1
# nas 上:
ping 100.86.0.2
三、小米路由上配置转发路由
小米路由内的局域网设备,此时还是不能访问 虚拟局域网中的nas 100.86.0.1,这时需要在路由上添加静态路由、和配置转发规则等。先用ifconfig查看网卡信息:
- 外网出口(192.168.1.0/24的接口)为 br-lan
- 虚拟网(100.86.0.2的接口)为 utun0
# 1. 将 192.168.1.0 网段ip 修改为 100.86.0.2 发给 100.86.0.1
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 100.86.0.1 -j MASQUERADE
# 2. 允许局域网 → 虚拟网 的转发
iptables -A FORWARD -i br-lan -o utun0 -d 100.86.0.0/24 -j ACCEPT
# 3. 允许虚拟网 → 局域网 的回程转发
iptables -A FORWARD -i utun0 -o br-lan -s 100.86.0.0/24 -j ACCEPT
# 4. 在本机绑定虚拟 IP
ip addr add 100.86.0.1/32 dev lo
# 5. 允许访问本机的虚拟 IP
iptables -I INPUT -d 100.86.0.1 -j ACCEPT
设置好后,可以在局域网设备中访问 100.86.0.1 相关于访问了远程的Nas。

路由持久化
小米路由上不管是/etc/rc.local 还是防火墙配置/etc/firewall.user在重启的时候都会被重置。所以要持久化就用开机启动执行脚本来实现,参考 小米路由安装frpc 的开机启动脚本的最后添加上面5条命令。
vi /data/frp/auto.sh
#!/bin/sh
...
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 100.86.0.1 -j MASQUERADE
iptables -A FORWARD -i br-lan -o utun0 -d 100.86.0.0/24 -j ACCEPT
iptables -A FORWARD -i utun0 -o br-lan -s 100.86.0.0/24 -j ACCEPT
ip addr add 100.86.0.1/32 dev lo
iptables -I INPUT -d 100.86.0.1 -j ACCEPT
评论区