frps+nginx服务器搭建与frpc客户端配置


本文档前提:

  • 有一个拥有外网IP的服务器作为frp服务器端的服务器
  • 有一个域名,这个作为frp服务器虽然不是必须的,但是本文档是基于这个前提
  • 本文档基于frp服务器和客户端的v0.52.3版本

1 服务器端

1.1 frp官方git

https://github.com/fatedier/frp

1.2 frp官方中文文档

https://gofrp.org/zh-cn/docs/reference/

1.3 docker镜像的例子

1.3.1 服务器端配置文件

  • 首先编辑服务器端配置文件frps.toml,本例放在宿主机上/docker_volume/frps/frps.toml
  • 目前使用toml作为配置文件,项目名和以前版本的ini有非常大不同,另外toml是强类型的配置文件,字符串要加引号。
  • 下面标记的“ ※根据需求自行更改”的地方,请根据实际情况更改。
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
37
38
39
bindAddr = "0.0.0.0"
# 服务器端监听客户端连接请求的端口。
# ※根据需求自行更改
bindPort = 1111
# ※根据需求自行更改
tcpmuxHTTPConnectPort = 2222
# 服务器端监听http请求的端口。
# ※根据需求自行更改
vhostHTTPPort = 3333

# 日志文件路径,可以是一个文件路径。
log.to = "console"
# 日志记录错误级别,分为:trace, debug, info, warn, erro
log.level = "warn"
# 日志保存最大天数
log.maxDays = 3
# 可以配置自定义的404页面
# custom404Page = "/xxxx/404.html"

# 客户端连接校验码(客户端需与之相同)。
# ※根据需求自行更改
auth.token = "connect_token_xxxxx"

# 连接池大小,在tcpmux模式下有用
maxPoolCount = 5

# 管理页面的站点配置
webServer.addr = "0.0.0.0"
# ※根据需求自行更改
webServer.port = 4444
# ※根据需求自行更改
webServer.user = "web_admin_user"
# ※根据需求自行更改
webServer.password = "web_admin_password"

# 支持外部访问的域名(需要将域名解析到IP)。
# 之后的web服务都将以子域名*.frp.mydomain.xxx的形式访问。
# ※根据需求自行更改
subDomainHost = "frp.mydomain.xxx"

1.3.2 下载和启动docker镜像

官方镜像可能是:fatedier/frps:v0.52.3,说明太少所以不使用。

星星最多的一个snowdreamtech/frps:latest镜像,看了下dockfile,从官方的github下载tar包,然后解压启动。没有多余操作。可以放心使用。
此镜像的git地址:https://github.com/snowdreamtech/frp

1
2
3
docker pull snowdreamtech/frps:latest
#注意,目前启动的文件已经变成了/etc/frp/frps.toml。可以在docker logs里查看启动的配置文件是什么。
docker run --restart=always --network host -d -v /docker_volume/frps/frps.toml:/etc/frp/frps.toml:ro --name myfrps_snow snowdreamtech/frps

打开防火墙(阿里云的安全策略里的规则也需要添加,下边是系统的防火墙)

  • 开放的端口号,更具自己的服务器配置自行更改。
  • 目前需要开放服务器端配置的bindPort和tcpmuxHTTPConnectPort的端口。
  • vhostHTTPPort的端口后边通过nginx转发,所以不用打开。
  • 最终的目标是bindPort和tcpmuxHTTPConnectPort的端口也通过nginx转发。暂没实现。
1
2
3
sudo firewall-cmd --zone=public --add-port=1111/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2222/tcp --permanent
sudo firewall-cmd --reload

2 DNS配置

2.1 设置A记录

  1. frp主服务的域名的A记录添加,例frpserver.mydomain.xxx
  2. subDomainHost的域名的A记录添加,例如*.frp.mydomain.xxx。客户端会作为它的子域名的形式进行访问,例如server1.frp.mydomain.xxx

3 客户端

3.1 客户端例子

3.1.1 老客户端配置

这里是华硕路由器的例子。注意是ini文件的例子。ini和toml的字段名有很大不同,使用时候一定要注意!

  • ※根据需求自行更改”的地方,需要根据服务器配置更改。此例子是连接路由器的管理页面。为了安全,可以套一层base64的认证(通过http_user和http_pwd设置)。
  • 前提是安装了官改固件或者梅林官改,然后安装frpc的客户端插件
  • frpc插件,不要用插件的配置页面,直接选择自定义配置。然后将下面的配置输入。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# frpc configuration
[common]
# ※根据需求自行更改,服务器的访问URL,通过DNS配置转发到服务器
server_addr = xxxx.mydomain.xxx
# ※根据需求自行更改,服务器端配置的端口
server_port = 1111
# ※根据需求自行更改,服务器端配置的token
token = connect_token_xxxxx

log_file = /tmp/frpc.log
log_level = info
log_max_days = 3
protocol = tcp
login_fail_exit = false
# ※根据需求自行更改
[router]
type = http
local_ip = 192.168.50.1
local_port = 80
http_user = base认证的user
http_pwd = base认证的密码
subdomain = router

通过上面subdomain的配置和服务器端的subDomainHost的值连在一起,就是访问此映射的URL
例如此例子就是通过router.frp.mydomain.xxx来访问。 后面nginx的配置的部分,会给*.frp.mydomain.xxx的内容转发给frp

3.1.2 docker镜像客户端的例子

下面是docker的snowdreamtech/frpc:latest镜像的例子。启动和服务器端差不多。此处省略记载。
下边是客户端的配置文件frpc.toml的内容。

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
37
38
# ※根据需求自行更改,服务器端的地址
serverAddr = "frp_server.mydomain.xxx"
# ※根据需求自行更改,根据服务器配置更改
serverPort = 1111
# ※根据需求自行更改,根据服务器配置更改
auth.token = "connect_token_xxxxx"

log.level = "info"

# ※根据需求自行更改,这里是一个局域网web服务的例子
[[proxies]]
name = "web_healthcheck"
type = "http"
localIp = "192.168.50.123"
localPort = 8000
subdomain = "healthcheck"
httpUser = "base64User"
httpPassword = "base64password"

# ※根据需求自行更改,这里是一个局域网ssh服务的例子
[[proxies]]
name = "ssh"
type = "tcpmux"
multiplexer = "httpconnect"
# customDomains可以不写成域名样子,就一个字符串的名字就行。
customDomains = ["mysshsample"]
localIp = "192.168.50.123"
localPort = 22

# ※根据需求自行更改,这里是一个局域网openvpn的例子
[[proxies]]
name = "openvpn"
type = "tcpmux"
multiplexer = "httpconnect"
# OpenVPN客户端会check格式,所以需要写成域名的样子。下面这个域名不用设置DNS,是frp内部用的名字,不走DNS。
customDomains = ["openvpn.mydomain.xxx"]
localIp = "192.168.50.123"
localPort = 1234

3.1.3 访问方法

  1. 上面例子的web服务的访问地址
    https://healthcheck.frp.mydomain.xxx
  2. 例子中的ssh的访问方式,22是内网机器的ssh端口,2222是服务器配置的tcpmuxHTTPConnectPort的端口,mysshsample是客户端配置的customDomains的名字。

    这里需要安装socat工具

1
ssh -v -o 'proxycommand socat - "PROXY:server.mydomain.xxx:mysshsample:22,proxyport=2222"' ssh_username@mysshsample
  1. 例子中,openvpn的访问方式,
    从服务器端导出.ovpn文件,服务器端连接方式需要是TCP。然后编辑.ovpen文件。
    更改remote,地址是客户端配置的customDomains的名字,端口是局域网的openvpn服务的端口。
    追加http-proxy行,地址是frp服务器的域名地址,端口是服务器端配置的tcpmuxHTTPConnectPort的端口号。
    1
    2
    3
    4
    5
    client
    dev tun
    proto tcp-client
    remote openvpn.mydomain.xxx 1234
    http-proxy frpserver.mydomain.xxx 2222

4 nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 443 ssl;
server_name frpserver.mydomain.xxx *.frp.mydomain.xxx;
include /conf.d/common_ssl.inc;
location / {
proxy_redirect off;
# frp的docker network是用host启动的,所以不能使用docker name来作为访问地址,下边这个ip是用ip adrr取得的宿主机器的局域网IP
proxy_pass http://xxx.xx.xxx.xxx:3333/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}


下面是frp管理界面的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 443 ssl;
server_name frpadm.mydomain.xxxx
include /host_home/conf.d/common_ssl.inc;

location / {
proxy_redirect off;
# frp的docker network是用host启动的,所以不能使用docker name来作为访问地址,下边这个ip是用ip adrr取得的宿主机器的局域网IP
proxy_pass http://xxx.xx.xxx.xxx:4444/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}

5 安全性

从官方文档上来看,v0.50.0 开始,transport.tls.enable 的默认值将会为 true,默认开启 TLS 协议加密。如果 frps 端没有配置证书,则会使用随机生成的证书来加密流量。

如果想用自定义的证书,客户端和服务器都进行验证的话,可以看下边连接。

自定义 TLS 协议加密 | frp (gofrp.org)


Author: ofoo.top
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source ofoo.top !
  TOC