frp反向代理工具

frp反向代理工具

最近在内网环境使用 postfix + dovecot 搭建了邮件服务器,内网测试没有问题了,需要在公网使用。于是找到了 frp 这个工具,可以将 内网 的端口映射到 VPS 服务器上。总结了一下搭建过程。

官方文档参看 https://gofrp.org/zh-cn/docs/

之前介绍了 ssh隧道的方法,可以参看往期文章:https://www.madbull.site/?p=794 。但是这种方法不太稳定,临时用可以,不适合长期运行。

1、下载

从 github 选择适合自己系统的 frp 版本,地址在 https://github.com/fatedier/frp/releases 。我用的 ubuntu 系统,选择的是 frp_0.63.0_linux_amd64.tar.gz 版本。

frp 用的 golang 写的,解压后即可用。

解压后共4个文件:

  • frps和frps.toml 服务端程序 和 服务端配置文件
  • frpc和frpc.toml 客户端程序 和 客户端配置文件

在 VPS 跑服务端,在内网主机上运行客户端。我这里直接解压在了 /opt 目录,并把目录改名字改成了 /opt/frp

2、配置

对于暴漏在公网的代理,有一个基本的安全要求:需要客户端认证通过后才允许连接。这里使用的 tls 证书双向认证,具体配置如下:

2.1 在服务端

bindPort = yourport
transport.tls.force = true
transport.tls.certFile = "xx/xx/server.crt"
transport.tls.keyFile = "xx/xx/server.key"
transport.tls.trustedCaFile = "xx/xx/ca.crt"

配置解释:

  • bindPort:frp服务端监听端口。要保证 VPS 上的网络安全策略开通了,能够访问。
  • transport.tls.force:强制使用 tls 认证
  • transport.tls.certFile 、 transport.tls.keyFile:证书文件和私钥文件
  • transport.tls.trustedCaFile:frp 信任的证书。也就是说:以这个证书作为 CA 根证书,给其他 服务或者客户端 颁发的证书才能够通过认证。

2.2 在客户端

serverAddr = "xx.xx.xx.xx"
serverPort = yourport
transport.tls.enable = true
transport.tls.certFile = "xx/xx/client.crt"
transport.tls.keyFile = "xx/xx/client.key"
transport.tls.trustedCaFile = "xx/xx/ca.crt"

[[proxies]]
name = "smtp_25"
type = "tcp"
localIP = "yy.yy.yy.yy"
localPort = 25
remotePort = 25
transport.proxyProtocolVersion = "v2"

[[proxies]]
name = "smtp_465"
type = "tcp"
localIP = "yy.yy.yy.yy"
localPort = 465
remotePort = 465
transport.proxyProtocolVersion = "v2"

[[proxies]]
name = "imap_143"
type = "tcp"
localIP = "127.0.0.1"
localPort = 143
remotePort = 143

[[proxies]]
name = "imap_993"
type = "tcp"
localIP = "127.0.0.1"
localPort = 993
remotePort = 993

......................

有几个关键的配置解释一下:

  • serverAddr:frp服务端的连接地址
  • serverPort :frp服务端监听的端口
  • [[proxies]]:每一个模块都是一个端口映射关系
  • localIP:本地服务(例如:postfix)的IP地址。注意:对于 postfix , 如果配置当 ,连接 127.0.0.1 可以任意发送邮件,所以尽量连接网卡上的地址,而不是 127.0.0.1 和 localhost。
  • localPort:本地服务(例如:dovecot)监听的端口。
  • remotePort:在服务端要对外开放的端口。一旦frp客户端在frp服务端认证成功,就会创建的监听端口。
  • transport.proxyProtocolVersion:这是 proxy protocol 协议的版本。可以让服务端获取到真实的 源IP 和 目的IP。这里给 postfix 打开此功能,可以通过配置来获取真实的 源IP 地址。

2.3、配置证书

需要创建 3 个证书/私钥对,共6个文件。根据上边的配置,分别介绍一下这些文件。

  • 第一对:根证书 ca.crt 和 根私钥 ca.key。
    • ca.crt 服务端和客户段都 需要部署,放在 transport.tls.trustedCaFile 的位置
    • ca.key 用来给客户端和服务端颁发证书使用,服务端和客户端都 不需要部署
  • 第二对:服务端证书 server.crt 和 服务端私钥 server.key。放在服务端 transport.tls.certFile 、 transport.tls.keyFile 指定的位置
  • 第三对:客户端证书 client.crt 和 客户端私钥 client.key。放在客户端 transport.tls.certFile 、 transport.tls.keyFile 指定的位置

根证书 可以使用 自签名 证书即可,参考往期文章:https://www.madbull.site/?p=601

客户端证书 用根证书颁发,参考往期文章:https://www.madbull.site/?p=601 中第 2.1、2.2、2.3 所介绍的内容。

服务端证书 必须要使用 包含主题替代名 的证书,参考往期文章:https://www.madbull.site/?p=1111。csr.conf 配置文件中 alt_names 段里的 DNS.1 和 IP.1 设置成你合适的 域名 和 IP 即可。

3、启动

可以直接手动启动,例如:/opt/frp/frps -c /opt/frp/frps.toml。为了方便,我分别写了两个 service 配置。

3.1、服务端

文件路径:/usr/lib/systemd/system/frps.service

[Unit]
Description=frps Service
After=basic.target network.target redis.service mysqld.service

[Service]
Type=simple
WorkingDirectory=/opt/frp
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=always
RestartSec=5
StartLimitBurst=0

[Install]
WantedBy=multi-user.target

3.2、客户端

文件路径:/usr/lib/systemd/system/frpc.service

[Unit]
Description=frpc Service
After=basic.target network.target redis.service mysqld.service dovecot.service postfix.service

[Service]
Type=simple
WorkingDirectory=/opt/frp
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.toml
Restart=always
RestartSec=5
StartLimitBurst=0

[Install]
WantedBy=multi-user.target

4、最后

以上就已经部署完毕,使用 systemctl start/stop/status/enable 来启停、设置开机启动即可。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注