OpenWrt 使用 frp 实现内网穿透

最后更新时间:2018年11月17日

有时我们需要为了方便,远程访问路由器,不过远程访问可能并没有那么容易。

如果你有公网 IP 的话,打开某些端口就可以访问,但 IPv4 地址就那么点,不够给每个人或每台设备分配,IPv6 还没完全普及。这时候需要另一种方法:内网穿透。

什么是内网穿透?简单来讲就是:内网设备和公网设备之间保持一个持久连接,当用户访问公网设备时,公网设备将请求转发给内网设备,由内网设备处理请求再把数据返回给公网设备接着返回给用户,从而可以远程访问内网设备。

内网穿透可以使用内网穿透软件来实现,比如:Ngrok 和 frp。

Ngrok 搭建比较复杂,需要从 Google 下载文件,对国内 VPS 不太友好。 frp 就好多了,配置简单,支持多种协议,这次我们就用 frp 来搭建一个内网穿透。

OpenWrt 使用 frp 实现内网穿透

准备工作

一台公网设备,比如:服务器、VPS 或者 其他有公网 IP 的设备。

路由器可用空间需大于 5M

搭建内网穿透

进入 https://github.com/fatedier/frp/releases/latest 下载公网设备和路由器对应的版本

公网设备如果是服务器或者 VPS,系统是 Windows 下载 Windows 版本,Linux 下载 Linux 版本,然后根据系统位数再选择 i386 或 amd64。

路由器根据 CPU 架构下载对应的 Linux 版本,这个我说过很多次了。

压缩包会有两个可执行文件 frps 和 frpc,s 是服务端,c 是客户端。服务端上传到公网设备,客户端上传到路由器,配置文件也需要上传,frps.ini 和 frpc.ini。

首先创建一个存放 frp 的目录:mkdir /usr/local/frp

然后将 frp 的可执行文件上传到/usr/local/frp,当然,你可以上传到别的位置。

设置可执行文件权限:chmod +x /usr/local/frp/frp*

创建可执行文件的软连接:ln -s /usr/local/frp/frps /usr/bin/frpsln -s /usr/local/frp/frpc /usr/bin/frpc

下面配置以单人使用为例,如果需要配置多人使用,请自行查看官方文档进行修改。

配置服务端

打开配置文件:frps.ini

bind_port = 7000是 frps 的端口,可以改,也可以用默认的。

添加一个配置项:token,这个用来做身份验证,推荐开启。只有 frps 和 frpc 一致才可以建立连接,注意,它们之间时间差不能超过 15 分钟,可以通过添加authentication_timeout配置项来更改这个时间,单位为秒,默认为 900。如果你使用的是国外 VPS 的话,需要注意这一点。

如果有需要的话,添加 log_file配置项保存日志,比如:log_file = /var/log/frps.log,注意,添加此项后,运行 frp 不会输出任何信息。

添加vhost_http_portvhost_https_port配置项,设置客户端的转发协议为 HTTP 或 HTTPS 时的访问端口。

示例配置文件:https://cdn.mivm.cn/www.mivm.cn/archives/openwrt-frp/frps.ini

配置客户端

打开配置文件:frpc.ini

server_addrserver_port是 frps 的 IP 和端口。

下面默认有一个 SSH 配置,把它删了。

如果你在 frps 设置了token,那 frpc 也需要同样的配置项。

如果有需要的话,添加log_file配置项保存日志,比如:log_file = /var/log/frpc.log ,注意,添加此项后,运行 frp 将不会有任何输出信息。

可以添加login_fail_exit配置项决定是否让 fprc 连接 frps 失败后退出程序,推荐设置为false,防止异常退出。

添加一个配置节点:[web]

添加type配置项,设置转发协议,支持:http、https、tcp、udp 等,转发 Web 使用 HTTP(S),当然,也可以使用 TCP。

添加local_iplocal_port设置本地 IP 和端口,IP 设置为 127.0.0.1,端口设置为你要转发的端口即可,Web 一般为 80 和 443 (HTTPS)

可以添加custom_domains设置自定义域名,如果配置了多个 Web 服务,可以用不同的域名来访问。

可以添加use_encryption = trueuse_compression = true加密和压缩数据,但会消耗额外的 CPU 资源。

可以添加http_userhttp_pwd来保护 Web 服务,仅支持 HTTP。

如果你需要转发 TCP 和 UDP,只需要在配置节点里添加remote_port配置项,设置远程端口即可。比如转发 SSH,remote_port设置为 222,那么只需要访问 ssh://远程IP:222 就可以了。

示例配置文件:https://cdn.mivm.cn/www.mivm.cn/archives/openwrt-frp/frpc.ini

你可以直接在我的示例配置文件基础上进行修改。

更多配置参数可以参考官方文档

配置文件修改完成后,同样上传到你的公网设备和路由器的 frp 目录。

一切配置完成后,先在前端运行测试一下。

服务端:frps -c /usr/local/frp/frps.ini

客户端:frpc -c /usr/local/frp/frpc.ini

如果提示命令不存在,请检查你的软连接是否创建有误。

务必先运行服务端再运行客户端,否则客户端会自动退出。

运行成功后访问测试一下,没问题的话,就可以放在后台运行了。

后台运行

第一种:

运行:frpc -c /usr/local/frp/frpc.ini >/dev/null 2>&1 &

结束:killall frpc

开机运行:sed -i '/exit 0/i\sleep 10 && frpc -c /usr/local/frp/frpc.ini >/dev/null 2>&1 &' /etc/rc.local

取消开机运行:sed -i '/sleep 10 && frpc -c \/usr\/local\/frp\/frpc.ini >\/dev\/null 2>&1 &/d' /etc/rc.local

不过这种方法后台运行 frp,好像特别容易挂掉。

使用这种方法推荐开启日志保存

第二种:使用 screen

路由器安装命令:opkg update && opkg install screen,服务器安装命令:sudo apt-get install screen -ysudo yum install screen -y

screen 的详细用法大家可以去百度一下,我这里只说怎么用它来后台运行 frp。

运行:screen -dmS frpc frpc -c /usr/local/frp/frpc.ini

查看运行状态:screen -r frpc

查看运行状态后,按 Ctrl + C 结束 frpc,按 Ctrl + A + D (A 和 D 依次按下) 为暂时退出,依然保持后台运行。

开机运行:sed -i '/exit 0/i\sleep 10 && screen -dmS frpc frpc -c /usr/local/frp/frpc.ini' /etc/rc.local

取消开机运行:sed -i '/sleep 10 && screen -dmS frpc frpc -c \/usr\/local\/frp\/frpc.ini/d' /etc/rc.local

开机延迟 10 秒运行是确保路由器联网,避免 frpc 自动退出。

第三种(仅适用于有 systemd 的 Linux 发行版):

下载客户端和服务端对应的 systemd 服务文件,里面的路径是默认的/usr/local/frp,如果你的路径不是这个,注意更改。

服务端:sudo wget https://cdn.mivm.cn/www.mivm.cn/archives/openwrt-frp/frps.service -O /lib/systemd/system/frps.service

客户端:sudo wget https://cdn.mivm.cn/www.mivm.cn/archives/openwrt-frp/frps.service -O /lib/systemd/system/frps.service

开机启动 systemd 服务:systemctl enable fprc.servicesystemctl enable fprs.service

启动 systemd 服务:systemctl start fprc.servicesystemctl start fprs.service

查看 systemd 服务状态:systemctl status fprc.servicesystemctl status fprs.service

如果提示 running 则表示运行正常

如果你想远程电脑,可以在电脑上安装 TeamViewer,然后开启主板 BIOS 里的 PCI 设备唤醒,路由器安装 WOL 网络唤醒,这样你就可以远程开机,并且使用 TeamViewer 控制电脑。

当然,你也可以转发内网内其他设备的服务,将 frpc 的 local_ip 配置项改为内网其他设备的 IP 即可。

GitHub: https://github.com/fatedier/frp

微信公众号二维码

微信扫描二维码关注我们

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.