最近在内网环境使用 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 来启停、设置开机启动即可。
发表回复