OpenWRT配置FRPC实现公网访问
This post talks about running frpc (Github), the client of my favorite reverse proxy toolset, on an OpenWrt powered router, to expose one or more specific port of an local/intranet ip address onto public access.
在目前主流网络运营商大多不提供公网IP的大环境下,FRP套装搭配一台低配云主机,是最普遍也相对稳定的ddns替代方案。
长期以来,笔者使用的都是x64(amd64 on Centos/Ubuntu)和arm(树莓派)版本的frp release,启动配置上都是走的linux systemd。今天算另辟蹊径,要介绍一下在一台EX6200v2刷机的OpenWRT上跑frpc,接通阿里云的frps,来实现公网访问内网。
【注】其中frps也即服务端的配置,有两种情况:
- 如果同样是在openWRT上运行frps,那安装方法跟接下来的frpc是一回事。
- 如果跟我一样,云端走frps做转发用,张大妈上几乎每个博主都截图讲一遍,我是用CentOS命令行操作的,不在此赘述了,有需要联系。
在openwrt上运行frpc,要用到的资源来自于这两个Github工程,openwrt-frp和luci-app-frpc。
第一步,先搞清路由器的CPU架构。
本文用到的是NETGEAR EX6200v2,经查板载高通IPQ4018,4核Cortex A7 Neon。如果是用Intel处理器的软路由,那就更好办,直接省去查cpu的这一步。
当然,从ssh登进路由器确认,也是一种办法。
1 2 3 4 5 6 7 8 9 10 11 |
root@aq-OpenWrt:~$ cat /proc/cpuinfo processor : 0 model name : ARMv7 Processor rev 5 (v7l) BogoMIPS : 96.00 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xc07 CPU revision : 5 root@aq-OpenWrt:~$ |
第二步,查看路由器的存储空间是否够安装FRPC,然后去github release下载相应的ipk安装包。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
➜ ~ ssh root@192.168.10.254 [4:55:57] root@192.168.10.254's password: BusyBox v1.28.4 () built-in shell (ash) _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- OpenWrt 18.06.2, r7676-cddd7b4c77 ----------------------------------------------------- root@aq-OpenWrt:~$ root@aq-OpenWrt:~$ root@aq-OpenWrt:~# df -h Filesystem Size Used Available Use% Mounted on /dev/root 3.5M 3.5M 0 100% /rom tmpfs 122.5M 576.0K 121.9M 0% /tmp /dev/mtdblock14 7.8M 496.0K 7.3M 6% /overlay overlayfs:/overlay 7.8M 496.0K 7.3M 6% / tmpfs 512.0K 0 512.0K 0% /dev root@aq-OpenWrt:~$ |
从返回结果看,可用空间还有7.3M,frpc安装包尺寸3.6M,还是可以安装。前提是ipk要放在临时分区也就是/tmp(猜测这货是内存虚拟硬盘吧)中。
在路由器上使用wget下载,遇到一点小问题,需要安装SSL相关的包,否则无法走https下载。
1 2 3 4 |
root@aq-OpenWrt:/tmp/tmp$ wget https://github.com/kuoruan/openwrt-frp/releases/download/v0.31.2-1/frp c_0.31.2-1_arm_cortex-a7_neon-vfpv4.ipk wget: SSL support not available, please install one of the libustream-.*[ssl|tls] packages as well as the ca-bundle and ca-certificates packages. root@aq-OpenWrt:~$ |
为了节省路由器上有限的8M空间,就不装SSL包了。改用其他机器下载后,走scp传到路由器上。
【注】除了frpc客户端外,还要安装一个luci-app-frpc(尺寸很小),这样可以用web页面方便的配置和管理frpc。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
➜ ~ wget https://github.com/kuoruan/openwrt-frp/releases/download/v0.31.2-1/frpc_0.31.2-1_arm_cortex-a7_neon-vfpv4.ipk --2020-02-22 13:12:38-- connected. HTTP request sent, awaiting response... 200 OK Length: 3778185 (3.6M) [application/octet-stream] Saving to: ‘frpc_0.31.2-1_arm_cortex-a7_neon-vfpv4.ipk’ frpc_0.31.2-1_arm_cortex-a7_neon-vfpv4.ipk 100%[=======================>] 3.60M 821KB/s in 4.5s 2020-02-22 13:12:48 (821 KB/s) - ‘frpc_0.31.2-1_arm_cortex-a7_neon-vfpv4.ipk’ saved [3778185/3778185] ➜ ~ wget https://github.com/kuoruan/luci-app-frpc/releases/download/v1.2.1-1/luci-app-frpc_1.2.1-1_all.ipk .. connected. HTTP request sent, awaiting response... 200 OK Length: 7506 (7.3K) [application/octet-stream] Saving to: ‘luci-app-frpc_1.2.1-1_all.ipk’ luci-app-frpc_1.2.1-1_all.ipk 100%[===============>] 7.33K --.-KB/s in 0.001s 2020-02-22 13:43:49 (5.98 MB/s) - ‘luci-app-frpc_1.2.1-1_all.ipk’ saved [7506/7506] ➜ ~ scp ./frpc_0.31.2-1_arm_cortex-a7_neon-vfpv4.ipk root@192.168.10.254:/tmp/tmp/frpc_0.31.2-1_arm_cortex-a7_neon-vfpv4.ipk root@192.168.10.254's password: frpc_0.31.2-1_arm_cortex-a7_neon-vfpv4.ipk 100% 3690KB 167.1KB/s 00:22 ➜ ~ scp ./luci-app-frpc_1.2.1-1_all.ipk root@192.168.10.254:/tmp/tmp/luci-app-frpc_1.2.1-1_all.ipk root@192.168.10.254's password: luci-app-frpc_1.2.1-1_all.ipk 100% 7506 1.8MB/s 00:00 root@aq-OpenWrt:~$ |
在OpenWRT上走ssh运行opkg安装两个包。
1 2 3 4 5 6 7 8 9 |
root@aq-OpenWrt:/tmp/tmp# opkg install frpc_0.31.2-1_arm_cortex-a7_neon-vfpv4.ipk Installing frpc (0.31.2-1) to root... Configuring frpc. root@aq-OpenWrt:/tmp/tmp# opkg install luci-app-frpc_1.2.1-1_all.ipk Installing luci-app-frpc (1.2.1-1) to root... Configuring luci-app-frpc. [info] Instance "main" disabled. root@aq-OpenWrt:~$ |
第三步,登录管理页面,配置fprc。
进入openwrt管理页面后,顶栏菜单Service中,多了frpc,打开后是这样。
【注】如果遇到 module 'luci.cbi' not found: 这样报错,多半是你用了最新的19.07版本openWRT,那么你需要安装 luci-compat 来解决问题。原因是19.xx版将原来的以lua为后端的静态luci,换成了跟当今浏览器接轨的js为主的前端渲染方式,因此不少旧时代的luci界面包都出现问题。如果装了luci-compat仍然不解决问题,可以考虑回退到18.xx的版本。
选择rule,把你需要的转发规则,使用edit和add一条条建出来。要把路由自己的22打到云端的35902就是如图这样一条规则。
假设另有本地机器192.168.10.100的80端口要转发到云端,那么Name=web(随便起,别重复),Type=TCP,Local IP=192.168.10.100,Local Port=80,Remote Port=10080(云端同样用80的话也可,FRPS要做相应设置)。
然后把frpc要访问的服务端(frps)设置搞起来。
Alias名字随便起,别重复。Server Addr是现有FRPS的访问地址,IP或域名都可以。
【注】这里的example.com只是示例,实际上要使用您自己已经设置好FRPS的域名或者server IP。
Server Port不是rule里的代理端口,而是frpc和frps之间通信的端口,默认7000,frps配置改过的话,跟着改。
Token也是frps那边的配置,这里要跟服务器端配置一致,否则登不上。TCP mux也是如此。
最后enable一下,保存应用,frpc就跑起来了。
检查一下frpc的运行情况。
如下,可以看到ps时,fprc进程已经运行。而netstat返回我们与frps服务器7000端口正常通信。
1 2 3 4 5 6 7 8 9 10 |
root@aq-OpenWrt:~# ps | grep frpc 8734 nobody 785m S /usr/bin/frpc -c /var/etc/frpc/frpc.main.ini 8838 root 1064 R grep frpc root@aq-OpenWrt:~# netstat -anlp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ...省略 tcp 0 0 192.168.19.128:54014 12.34.56.78:7000 ESTABLISHED 8734/frpc ...省略 root@aq-OpenWrt:~# |
最后一步,检验成果的时候到了,测试转发连通性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
➜ ~ ssh -p 35902 root@example.com The authenticity of host '[example.com]:35902 ([12.34.56.78]:35902)' can't be established. RSA key fingerprint is SHA256:w8Z6j...DqFN8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[example.com]:35902,[12.34.56.78]:35902' (RSA) to the list of known hosts. root@example.com's password: BusyBox v1.28.4 () built-in shell (ash) _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- OpenWrt 18.06.2, r7676-cddd7b4c77 ----------------------------------------------------- root@aq-OpenWrt:~# |
验证转发成功。
感兴趣的话,可以登进云主机,运行netstat -anlp,看客户端(frpc on OpenWRT)是如何通过运营商的出口IP到达云主机上frps侦听的7000端口,完成转发,将客户端tcp 22最终暴露到云端(frps)的35902端口。
潜在问题
在路由上执行top查看资源消耗
可以发现openwrt大部分进程的VSZ(虚拟内存)占用量只有1~3M,而frpc居然有786M之多。当然并非已经消耗,更像是预申请。但这个数字之大,还是令人咂舌,已经达到了物理内存的3倍之多。
虽然对于物理内存,整个路由器所有进程目前只消耗了60M,空闲还有190M。但总觉得如果frpc目前主要为不缺资源的计算机和服务器设计在先,对于路由器这种嵌入式设备看起来没有针对性优化,假定某版本引入bug出现内存泄漏,那么持续吃掉内存最后crash掉整个路由器,并非不可能。
所幸原作者fatedier还是非常主动在维护整个项目,我前几天提交的issue也很快的被解决。主要看frp在嵌入式领域是否存在足够的需求,如果需求量大,相信作者会感兴趣的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
root@aq-OpenWrt:/tmp/log# top Mem: 60252K used, 190640K free, 580K shrd, 3272K buff, 14096K cached CPU: 1% usr 1% sys 0% nic 96% idle 0% io 0% irq 0% sirq Load average: 0.03 0.10 0.09 2/90 3835 PID PPID USER STAT VSZ %VSZ %CPU COMMAND 3835 3453 py27 R 1072 0% 3% top 2225 2 root IW 0 0% 1% [kworker/1:0] 1768 1 nobody S 786m 320% 0% /usr/bin/frpc -c /var/etc/frpc/frpc.main.ini 1320 1 root S 3168 1% 0% /usr/bin/monit -I 2728 1 root S 1616 1% 0% /usr/sbin/hostapd -s -P /var/run/wifi-phy1.pid -B /var/run/ 2400 1 root S 1616 1% 0% /usr/sbin/hostapd -s -P /var/run/wifi-phy0.pid -B /var/run/ 649 1 root S 1532 1% 0% /sbin/netifd 513 1 root S 1396 1% 0% /sbin/rpcd -s /var/run/ubus.sock -t 30 1 0 root S 1340 1% 0% /sbin/procd 687 1 root S 1228 0% 0% /usr/sbin/odhcpd ...以下省略 |
文章的脚注信息由WordPress的wp-posturl插件自动生成
我的机器:
system type : Qualcomm Atheros QCA9558 ver 1 rev 0
machine : ARRIS SBR-AC1750
processor : 0
cpu model : MIPS 74Kc V5.0
BogoMIPS : 358.80
wait instruction : yes
microsecond timers : yes
tlb_entries : 32
extra interrupt vector : yes
hardware watchpoint : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa : mips1 mips2 mips32r1 mips32r2
ASEs implemented : mips16 dsp dsp2
shadow register sets : 1
kscratch registers : 0
core : 0
VCED exceptions : not available
VCEI exceptions : not available
这个版本安装不上:
opkg install frpc_0.32.1-1_mips_mips32.ipk
Unknown package ‘frpc’.
Collected errors:
* pkg_hash_fetch_best_installation_candidate: Packages for frpc found, but incompatible with the architectures configured
* opkg_install_cmd: Cannot install package frpc.
界面可以安装,无语
不熟悉mips,看起来相关build好几个,你确定是这个mips32的build吗?
此外,真想玩还可以搞个源码自己build试一下