frp端口映射穿透内网

时间:2021-06-15 07:03:25

frp端口映射穿透内网

前言

frp 是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务,支持 TCP、UDP、HTTP、HTTPS 等协议类型,并且 web 服务支持根据域名进行路由转发。

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

安装frp

Releases: https://github.com/fatedier/frp/releases

可以直接下载编译好的压缩包,在 Releases 页面中找到对应平台的压缩包,解压后就可以直接用,或者自己下载源码编译。

为了表示对作者的尊敬,我决定用 GO 编译。

搭建GO环境

安装依赖

1
2
3
4
# Ubuntu
$ sudo apt-get install bison ed gawk gcc libc6-dev make
# CentOS
$ sudo yum install gcc

下载go支持包

各版本的下载地址 https://www.golangtc.com/static/go/,我使用的是当前最新的1.9rc2

1
$ wget https://www.golangtc.com/static/go/1.9rc2/go1.9rc2.linux-amd64.tar.gz

解压go包

1
$ sudo tar -C /usr/local -xzf go1.9rc2.linux-amd64.tar.gz

添加环境变量和go工作区

1
$ vim /etc/profile

在文件的底部添加以下两行:

1
2
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/usr/local/gopath

:wq 保存退出后,重新加载环境变量

1
$ source /etc/profile

测试

1
2
$ mkdir -p /usr/local/gopath && cd /usr/local/gopath
$ vim test.go

简单的打印测试:

1
2
3
4
5
6
7
package main
import "fmt"
func () {
fmt.Println("Hello World!")
}

使用go编译运行:

1
2
$ go run test.go
Hello World!

至此,go环境搭建完毕。

下载编译frp

1
2
3
$ go get github.com/fatedier/frp
$ cd /usr/local/gopath/src/github.com/fatedier/frp/
$ make

配置

创建frps配置文件

make 编译完成后,frp里会多出一个bin目录,放着frpcfrps,对应客户端和服务端的可执行文件。服务端上只需要用到 frps,可以删掉 frpc,客户端则相反。除此之外,还需要一个配置文件。

1
2
$ rm -rf frpc
$ vim frps.ini

详细的配置请看 https://github.com/fatedier/frp/blob/master/README_zh.md,官方的 README 介绍得非常详细。我再怎么写也没有官方的介绍更详细,这里直接贴我的配置。

1
2
3
4
5
6
7
8
9
10
11

[common]
bind_addr = 0.0.0.0
bind_port = 7001
vhost_http_port = 6666
dashboard_port = 7501
dashboard_user = {username}
dashboard_pwd = {password}
auth_token = {token}
privilege_token = {privilege_token}
privilege_mode = true

我开启了privilege_mode,也就是开启了特权模式,这样服务端就不再需要配置每一条诸如 tcp、http 等的隧道,只需要把这个 frps 服务启动即可。

运行服务端

1
2
3
4
5
6
$ ./frps -c frps.ini
2017/09/23 17:28:00 [I] [service.go:83] frps tcp listen on 0.0.0.0:7001
2017/09/23 17:28:00 [I] [service.go:108] http service listen on 0.0.0.0:6666
2017/09/23 17:28:00 [I] [service.go:134] Dashboard listen on 0.0.0.0:7501
2017/09/23 17:28:00 [I] [main.go:112] Start frps success
2017/09/23 17:28:00 [I] [main.go:114] PrivilegeMode is enabled, you should pay more attention to security issues

一般会挂在后台运行这个服务,可以用 nohup:

1
$ sudo nohup ./frps -c frps.ini >/dev/null 2>&1 &

也许我有强迫症,我很讨厌生成的 nohup.out,所以使用 >/dev/null 2>&1 来避免 shell 命令运行中有内容输出。

把 frps 服务跑起来后,公网服务器的配置就全部搞完了,当然,还得搞点手脚,让服务器开机自动启动这个服务,否则服务器重启就断开了。这个在 NAT 客户端上也是一样的,放到后面讲。

创建frpc配置文件

接下来,需要在内网中的客户端做同样的操作,搭建go环境(如果你有兴趣的话)、下载编译frp,唯一不同的就是反过来删除 frps,保留 frpc。

1
2
$ rm -rf frps
$ vim frpc.ini

由于开启了特权模式,所以,所有的隧道都可以直接在 frpc.ini 里配置。同样,直接贴上我的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# frpc.ini
[common]
大专栏  frp端口映射穿透内网ass="line">server_addr = 120.76.207.187
server_port = 7001
auth_token = {token}
privilege_token = {privilege_token}
[bingo_pi_web]
type = http
local_port = 80
remote_port = 6666
custom_domains = pi.bingo.ren
[ssh]
type = tcp
local_port = 22
remote_port = 3692

这里我配置了两条隧道,一条是 http 类型的,一条是 tcp 的。然后,开启 frpc 服务即可。

运行客户端

1
$ sudo nohup ./frpc -c frpc.ini >/dev/null 2>&1 &

设置frp服务开机自启

只需要在 /etc/rc.local 文件的最后,添加 frp 服务的启动命令即可。

1
$ vim /etc/rc.local

exit 0 是脚本退出的意思,只要将命令加在 exit 0 之前就可以开机启动了。

服务端,设置开机自启 frps 服务。

1
2
3
4
5
...
nohup /usr/local/gopath/src/github.com/fatedier/frp/bin/frps -c /usr/local/gopath/src/github.com/fatedier/frp/bin/frps.ini >/dev/null 2>&1 &
exit 0

客户端,设置开机自启 frpc 服务。

1
2
3
4
5
...
nohup /usr/local/etc/frp_0.13.0_linux_arm/frpc -c /usr/local/etc/frp_0.13.0_linux_arm/frpc.ini >/dev/null 2>&1 &
exit 0

设置完 reboot 重启一下,就会发现 frp 服务已经自动启动了。

1
2
3
$ ps -ef | grep frp
root 570 1 0 18:29 ? 00:00:00 /usr/local/etc/frp_0.13.0_linux_arm/frpc -c /usr/local/etc/frp_0.13.0_linux_arm/frpc.ini
root 856 806 0 18:30 pts/0 00:00:00 grep --color frp

测试

经过以上配置,正常情况下,在任何设备上,访问 https://pi.bingo.ren,就可以访问到内网 80 端口的 HTTP 服务。

1
2
3
4
5
6
7
8
9
$ curl https://pi.bingo.ren
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<h1>This is index page of Bingo's Raspberry PI.