| 
 | 
 
一、简介# O: ~) f6 V; h( G 
2 p6 J& K/ _; y 
众所周知,国内运营商的家用宽带大多不提供公网IP,这就导致家中或公司中的设备无法通过外网直接访问,这时就需要我们利用内网穿透工具,如花生壳、Ngrok等。最近GitHub上出现了一款叫做FRP的内网穿透工具,使用非常简便(GitHub地址:FRP-内网穿透工具)。由于我刚开始关注该软件时,作者并不提供编译好的mipsle架构版本(如newifi、斐讯k1、小米路由3等均为此架构),而我又想在路由器上运行FRP,所以只能硬着头皮研究GO程序的编译,由于自己基础薄弱,进展很慢。通过几天的研究和众位大神的指点,终于搞定了,然而搞定之后,我却发现作者发布新版本的同时,提供了编译好mipsle版本,哎。不过还是把这个教程发布出来,就算是给自己留个笔记了。 
6 q5 i) d) R3 a* w& r6 L9 m/ G# k3 m0 I 
二、GO编译环境的安装# z4 C+ K, U1 R 
, k' N, O- E, F( k5 @ 
FRP的编译教程,网上并不是没有,比如这个和这个,但是这两个教程,都是需要先编译一个go-mips32,也就是一个可以编译生成mips架构软件的GO编译环境才行。然而GitHub上这个go-mips32看起来已经年久失修,而且是基于GO1.4版本的,最新的GO已经1.8了,而且在我的Ubuntu16.10上,这个go-mips32编译总是不成功(不过在debian上没问题,搞不懂)。通过咨询FRP的作者,了解到GO1.8版本已经支持了交叉编译,可以直接编译任意架构的二进制文件,所以直接安装GO1.8就可以了,下面先说说GO1.8的安装配置。 
7 U) i, k: B% K: D! [* I( M/ U 
/ }7 {  s; W* I0 x1、首先要先准备一个干净的Linux操作系统,Ubuntu啊,Debian啊,都可以,并在用户文件夹下新建一个文件夹,用来存放GO1.8,本文以建立的文件夹名为GOFiles为例。 
0 m8 ~7 U+ l# d# N; Q6 b; y" n: r0 q2 @4 r6 n* o 
2、到https://golang.org/dl/的最下面下载对应你CPU型号的压缩包,我的虚拟机是32位CPU的,所以下载的是go1.8.linux-386.tar.gz,注意一定要下载1.8版本的。1 y, W# J" H' g! w 
$ [, I6 q7 @& b/ A% [: x 
3、进入压缩包的下载目录,运行如下命令解压,将GO1.8安装到/home/dave/GOFiles(这样可以防止后期需要用root用户才能编译),请注意更换压缩包名。以用户名dave为例( `) _2 `  p( ~% e/ X 
 
; Z$ a: s6 k3 d3 \sudo tar -C /home/dave/GOFiles -xzf go1.8.linux-386.tar.gz 
$ Z, \+ s7 s& z. k4、在用户文件夹下建立一个文件夹,命名自选(本文以用户名dave,文件夹名wksp为例,读者请注意替换为自己的名称)。在wksp下建立一个go文件夹,并在go文件夹内建立三个文件夹,分别命名为src、pkg、bin,请注意这三个文件夹的名称不能修改,必须如此。7 u2 W7 o% O0 X6 e2 q7 S3 |6 y% o$ n 
& ^5 O6 ^! m  @! p( E. o2 t 
5、修改/etc/profile环境变量,在最后加入如下代码(读者请注意修改路径): 
9 K- b: [" c' |! {  g 
" S1 \+ M# W0 P% @8 ^( T( Aexport PATH=$PATH:/home/dave/GOFiles/go/bin 
; t  i  q' t' M& _* j4 N9 t" q 
0 D8 h3 o& b3 b9 Y6 @0 I7 u3 {export GOROOT=/home/dave/GOFiles/go/ 
. h, q; Y! v4 a. _/ o 
, N! r+ Y' G; h3 H6 Oexport GOPATH=/home/dave/wksp/go 
% A3 r" {' ]+ O6、重启系统,进入终端,运行如下命令:. u, H& g6 `4 l8 c$ x+ O/ p 
- j  l$ ]4 Q2 v& ?7 F( p 
go version& r4 Z# i$ [$ X: {4 e, m 
如果显示如下,说明GO1.8安装完成。 
1 ~$ Y! ^( b. i  f 
* s# l- v; k  V$ ngo version go1.8 linux/386 
( o( E) b( u4 p4 C/ s- Y7 B三、编译FRP# h$ S9 z) s6 l9 E 
 
% A: X+ }0 I! @; q9 o1、最好先升级一下源和软件,运行一下如下命令:. `7 j( w$ u% d: F& z' C 
. l7 S: f7 D2 ]/ [& ] 
sudo apt update 
! a0 Z5 ?- l* o& A6 J8 U+ r( ?& \4 v  S/ ]4 h 
sudo apt upgrade 
3 T2 V& [; |( y( f5 l0 E/ U3 {2、安装git和make。 
; H8 m% @& _. }) Z  |: c7 |2 j' _ 
% b) a$ E( r) W& L! k9 \9 `sudo apt install git make 
: y7 S0 D# P. S  o4 z, c3、进入/home/dave/wksp/go/src目录# b* i' k: a9 J 
 
: H! v; _. I; I( E7 j) p5 k4、运行如下代码下载FRP源码(建议科学上网,不然很慢): ~6 p9 k- m7 y5 L9 e 
 
- h4 U; O9 J2 V# K% Ygit clone https://github.com/fatedier/frp.git 
9 Q5 w2 L) s6 E9 D& n5、进入frp目录$ ^. R' ?  T2 T3 ]( Y, D5 ` 
4 O/ E, m+ C: ^' h 
6、运行如下代码设置目标架构和系统,我的路由器为mipsle架构,Linux系统,如果要编译其他架构和系统的,请替换为相应命令。8 d' b# `, k- q 
 
# E: Q% J/ e$ a6 E( }9 Mexport GOARCH=mipsle5 u- p9 `+ s6 x" F8 r. N 
6 ?/ f7 ^$ Z: ?" q) Z 
export GOOS=linux 
$ [5 q% |1 M4 r& T$ a+ M7、逐一运行如下代码,不报错的话,即可完成FRP的编译。# Z6 j- n: F' a$ a  t0 b5 D# N 
 
% d" @# S4 b( c0 O  s) A0 Cgo get -v  github.com/docopt/docopt-go. ~3 }# L3 \+ g, g4 K# M$ m 
 
) {0 l- z. V  A! p( ~6 b' mgo get -v  github.com/fatedier/frp/src/models/client 
- l5 k. c& B; {1 L 
. f8 v9 a* e. Ggo get -v  github.com/fatedier/frp/src/utils/log 
" o- j8 I. G, N3 L1 }6 q# F 
7 G& z. ^& Y4 S+ H( p( bgo get -v  github.com/fatedier/frp/src/utils/version 
" h8 |# j9 X& V3 e, Z/ W6 W 
) B3 O0 m4 o4 t: h8 S- ]+ C) v& Hgo get -v  github.com/mitchellh/gox 
" t2 s3 H' V" g 
3 B5 D9 V4 w0 j* ^5 wgo get -v  github.com/rakyll/statik5 C; f" L, v9 r. R8 w* ~ 
/ M+ w# ^, T6 @" _# Q 
make$ S) s7 m, R( K3 U+ P, |# J 
编译好的FPR就在frp/bin目录内。$ @: `1 o. L1 |2 | 
开源地址:https://github.com/fatedier/frp 
% W5 o" G/ `2 @! t* b$ u 
; B8 s2 B$ W  k0 K" ~  G1 G  {  E0 d* Q  n6 o" p 
 |   
 
 
 
 |