OpenWrt部署最新版FRP服务端教程

1. What

在有公网IP的OpenWrt软路由上部署FRP服务端,可以使其他内网环境中的设备映射指定端口到OpenWrt,实现内网穿透。原理图如下:

alt text

2. How

FRP工具分为FRPS(服务端)和FRPC(客户端),FRPS负责监听来自FRPC的连接请求,并将请求的端口映射到自己的公网IP上。

OpenWrt默认的的软件源内其实已经包含了FRPS,并且有图形页的luci-app,但是FRPS的版本比较老:

alt text

并且我个人更习惯使用命令行操作,所以本文只介绍命令行使用最新的FRPS。

2.1. 配置FRP

下载FRPS:

1
2
3
4
5
6
7
8
9
opkg update  # 更新软件源
opkg install wget coreutils-nohup # 安装依赖
mkdir /root/frp; cd /root/frp # 创建目录并进入
wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_arm64.tar.gz # ARM架构下载这个
# wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz # X86架构下载这个
tar -xvf frp_0.61.1_linux_*.tar.gz # 解压
mv frp_0.61.1_linux_*/frps* . # 将解压后需要的文件移动到当前目录
rm -rf frp_0.61.1_linux_* # 删除不需要的文件
./frp -v # 查看版本

alt text

修改FRPS配置文件:

1
2
3
4
5
cat > /root/frp/frps.toml <<EOF
bindPort = 7000
auth.method = "token"
auth.token = "替换为你的密码"
EOF

假设客户端需要映射80端口到公网,则对应的FRPC配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
serverAddr = "OpenWrt的公网IP或者DDNS域名"
serverPort = 7000
auth.method = "token"
auth.token = "替换为你的密码"

[[proxies]]
name = "HTTP-80"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80 # 需要映射的本机端口
remotePort = 8080 # 映射到OpenWRT的端口

完整配置模板推荐查看官方文档:https://github.com/fatedier/frp/tree/184223cb2f240b844f90b3390645672d2225da88/conf

创建守护进程:

参考: https://openwrt.org/docs/techref/initscripts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat > /etc/init.d/frps <<EOF
#!/bin/sh /etc/rc.common

START=99

start(){
nohup /root/frp/frps -c /root/frp/frps.toml > /root/frp/frps.log 2>&1 &
}

stop(){
kill -9 `ps | grep "/root/frp/frps -c /root/frp/frps.toml" | grep -v "grep" | awk '{print $1}'`
}

restart(){
kill -9 `ps | grep "/root/frp/frps -c /root/frp/frps.toml" | grep -v "grep" | awk '{print $1}'`
nohup /root/frp/frps -c /root/frp/frps.toml > /root/frp/frps.log 2>&1 &
}
EOF
chmod +x /etc/init.d/frps

进程管理:

1
2
3
4
service frps enable  # 开机自启
service frps start # 启动
service frps stop # 停止
service frps restart # 重启

查看FRPS日志:tail /root/frp/frps.log -f

2.2. 配置防火墙

OpenWrt的防火墙默认拒绝所有入站流量:

alt text

因此为了能让FRPC连接到FRPS的7000端口以及向FRPS映射指定的端口,需要配置防火墙的端口转发规则。

进入防火墙设置页面:http://[OpenWrt地址]/cgi-bin/luci/admin/network/firewall/forwards

点击左下角“添加”按钮添加转发规则,名称随意,外部端口填写7000,内部IP选OpenWRT的内网IP,内部端口填写7000:

alt text

最后点击“保存并应用”按钮保存设置即可。映射端口的放行方式同理。