frp内网穿透

查看系统cpu架构

1
2
3
4
5
#查看cpu详情
lscpu

#直接返回cpu架构类型,例如: amd64 或 arm64
dpkg --print-architecture

公网服务器下载frp

1
wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz

解压命令

1
tar -zxvf frp_0.58.1_linux_amd64.tar.gz

编辑frps.toml文件

1
cd frp_0.58.1_linux_amd64 && nano frps.toml

frps.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
######################################################################
# 公网服务器开启端口: 6000, 7000, 6080, 6081, 6082, 6443, 8080, 8443 #
######################################################################

# 官网 https://gofrp.org/zh-cn/docs/overview/

# 服务端frps与客户端frpc绑定进行通信的端口(此端口只作为两者通信用,具体应用还需要开启相应的端口)
bindPort = 7000

### http 或 https 代理
### 如果 公网服务器的 80 和 443 已经被占用,只能指定其它端口,只是在访问的时候url后面要加上相应的端口,比如:
### http://test.abc.com:8080 或 https://demo.abc.com:8443
vhostHTTPPort = 8080
vhostHTTPSPort = 8443

局域网设备下载frp

1
wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_arm64.tar.gz

解压命令

1
tar -zxvf frp_0.58.1_linux_arm64.tar.gz

编辑frpc.toml文件

1
cd frp_0.58.1_linux_arm64 && nano frpc.toml

frpc.toml

通用部分配置

1
2
3
4
5
6
7
8
9
10
######################################################################
# 公网服务器开启端口: 6000, 7000, 6080, 6081, 6082, 6443, 8080, 8443 #
######################################################################

# 官网 https://gofrp.org/zh-cn/docs/overview/

# 公网服务器ip
serverAddr = "88.218.238.208"
# 服务端frps与客户端frpc绑定进行通信的端口(此端口只作为两者通信用,具体应用还需要开启相应的端口)
serverPort = 7000

远程 ssh 配置

1
2
3
4
5
6
7
8
# 远程 ssh 配置
# 88.218.238.208:6000 相当于在局域网中 ip:22
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

http 或 https 代理配置

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
31
32
33
34
35
36
### 路由及自定义域名设置 https://gofrp.org/zh-cn/docs/features/http-https/route/
### 按照以下的示例配置后,w1.abc.com 这个域名下所有以 /news 以及 /about 作为前缀的 URL 请求
### 都会被转发到 http81,其余的请求会被转发到 http80。
[[proxies]]
name = "http80"
type = "http"
localPort = 80
## 原理 http://w1.abc.com:8080/ --->>> 127.0.0.1:80/
customDomains = ["w1.abc.com"]
locations = ["/"]

[[proxies]]
name = "http81"
type = "http"
localPort = 81
## 原理 http://w1.abc.com:8080/news/ --->>> 127.0.0.1:81/news/
customDomains = ["w1.abc.com"]
locations = ["/news", "/about"]
### 用户名和密码的访问设置,访问时要验证才能查看页面,仅对 http 代理有效
#httpUser = "demo"
#httpPassword = "1234"

### https 自定义域名设置,https 会提示不安全,你可以强制访问。
[[proxies]]
name = "https443"
type = "https"
localPort = 443
## 原理 https://w1.abc.com:8443 --->>> 127.0.0.1:443
customDomains = ["w1.abc.com"]

[[proxies]]
name = "https444"
type = "https"
localPort = 444
## 原理 https://w2.abc.com:8443 --->>> 127.0.0.1:444
customDomains = ["w2.abc.com"]

tcp 代理配置
注意:每个tcp代理的 remotePort 不能一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
### 开启公网服务器端口 6080、6443
[[proxies]]
name = "tcp80"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
## 原理 http://88.218.238.208:6080 --->>> 127.0.0.1:80
remotePort = 6080

[[proxies]]
name = "tcp443"
type = "tcp"
localIP = "127.0.0.1"
localPort = 443
## 原理 https://88.218.238.208:6443 --->>> 127.0.0.1:443
remotePort = 6443

frp实现的负载均衡

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
31
32
33
### 注意:
### 一般情况下,每个 tcp 代理的 remotePort 不能重复;但是负载均衡时,要一样
### group 值相同的代理,会以轮询的方式实现负载均衡
### groupKey 为可选项,如果有,则值必须要相同
### 同一台服务器对应多个客户端设备时 name 值不能重复,必须唯一
### localIP 值也可以写成设备的局域网ip,比如:192.168.1.121
### http://88.218.238.208:6081 --->>> 127.0.0.1:80(device001)、127.0.0.1:80(device002)
### 查看效果时,要有耐心,多刷新几次(快速点击F5键),不然看不到负载均衡切换效果

#### 客户端设备001的配置项
[[proxies]]
name = "device001"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
## 原理 http://88.218.238.208:6081 --->>> 127.0.0.1:80(device001)
remotePort = 6081
loadBalancer.group = "web"
#loadBalancer.groupKey = "str123"

########## 以下是另一台客户端设备的配置项
########## 如果想在同一台设备使用多个配置
########## localPort 需要指定不同端口
#### 客户端设备002的配置项
[[proxies]]
name = "device002"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
## 原理 http://88.218.238.208:6081 --->>> 127.0.0.1:80(device002)
remotePort = 6081
loadBalancer.group = "web"
#loadBalancer.groupKey = "str123"

http 转 https 插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#### http 转 https, 适用于公网服务器 443 端口没有占用的情况
#### 如果 公网服务器 443 端口被占用,可以指定 其它端口,但是访问的时候需要加上端口,比如 https://demo.abc.com:8443
#### 插件的 type = "https2http" 值是固定的

[[proxies]]
name = "plugin_htts2http"
type = "https"
customDomains = ["test.abc.com"]
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:80"
# HTTPS 证书配置(局域网客户端上的证书路径)
crtPath = "/www1/web/ssl/abc.com/cert.pem"
keyPath = "/www1/web/ssl/abc.com/key.pem"

Unix 域套接字插件

1
2
3
4
5
6
7
8
9
10
11
12
### Unix 域套接字插件
#### 插件的 type = "unix_domain_socket" 值是固定的

[[proxies]]
name = "plugin_unix_domain_socket"
type = "tcp"
remotePort = 6082
### http://88.218.238.208:6082/version 返回 `docker version` 命令查询到的版本信息
[proxies.plugin]
type = "unix_domain_socket"
### Unix 域套接字路径
unixPath = "/var/run/docker.sock"

命令行运行

1
2
3
4
5
#公网服务器开启frps命令
./frps -c ./frps.toml

#局域网设备开启frpc命令
./frpc -c ./frpc.toml

docker 容器中运行

1
2
3
4
5
#公网服务器创建 frps 容器
docker run -itd --restart=always --network host -v /etc/frp/frps.toml:/etc/frp/frps.toml --name frps snowdreamtech/frps

#局域网设备创建 frpc 容器
docker run -itd --restart=always --network host -v /etc/frp/frpc.toml:/etc/frp/frpc.toml --name frpc snowdreamtech/frpc