frp 是什么?
frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。
一、基础配置使用(ssh为例)
下载地址:
1、在具有公网 IP 的机器上部署 frps
部署 frps 并编辑 frps.toml 文件
以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口:
bindPort = 7000
在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。
$ sudo nano /etc/systemd/system/frps.service
写入内容
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frps -c /path/to/frps.toml
[Install]
WantedBy = multi-user.target
命令启动服务器:./frps -c ./frps.toml。
使用 systemd 命令管理 frps 服务
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
设置 frps 开机自启动
sudo systemctl enable frps2、在需要被访问的内网机器上部署 frpc
部署 frpc 并编辑 frpc.toml 文件,假设 frps 所在服务器的公网 IP 地址为 x.x.x.x。示例配置:
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
localIP和localPort配置为需要从公网访问的内网服务的地址和端口。remotePort表示在 frp 服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口。
启动客户端:./frpc -c ./frpc.toml。
3、通过 SSH 访问内网机器
使用以下命令通过 SSH 访问内网机器,假设用户名为 test:
ssh -o Port=6000 test@x.x.x.x
frp 将请求发送到 x.x.x.x:6000 的流量转发到内网机器的 22 端口。
二、更安全地暴露内网服务
通过创建一个只有授权用户能够访问的 SSH 服务代理,实现内网服务的安全暴露。
某些内网服务,如果直接暴露在公网上,可能存在安全风险。使用 stcp(secret tcp) 类型的代理可以让您安全地将内网服务暴露给经过授权的用户,这需要访问者也部署 frpc 客户端。
配置 frps.toml
在 frps.toml 文件中添加以下内容:
bindPort = 7000
部署 frpc 客户端并配置
在需要将内网服务暴露到公网的机器上部署 frpc,并创建如下配置:
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "secret_ssh"
type = "stcp"
# 只有与此处设置的 secretKey 一致的用户才能访问此服务
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
在访问者机器上部署并配置 frpc
在想要访问内网服务的机器上也部署 frpc,并创建如下配置:
serverAddr = "x.x.x.x"
serverPort = 7000
[[visitors]]
name = "secret_ssh_visitor"
type = "stcp"
# 要访问的 stcp 代理的名字
serverName = "secret_ssh"
secretKey = "abcdefg"
# 绑定本地端口以访问 SSH 服务
bindAddr = "127.0.0.1"
bindPort = 6000
通过 SSH 访问内网机器
使用以下命令通过 SSH 访问内网机器,假设用户名为 test:
ssh -o Port=6000 test@127.0.0.1三、通过自定义域名访问内网的 Web 服务
通过简单配置 HTTP 类型的代理,您可以让用户通过自定义域名访问内网的 Web 服务。
HTTP 类型的代理非常适合将内网的 Web 服务通过自定义域名提供给外部用户。相比于 TCP 类型代理,HTTP 代理不仅可以复用端口,还提供了基于 HTTP 协议的许多功能。
HTTPS 与此类似,但是需要注意,frp 的 https 代理需要本地服务是 HTTPS 服务,frps 端不会做 TLS 终止。也可以结合 https2http 插件来实现将本地的 HTTP 服务以 HTTPS 协议暴露出去。
1、配置 frps.toml
在 frps.toml 文件中添加以下内容,以指定 HTTP 请求的监听端口为 8080:
bindPort = 7000 vhostHTTPPort = 8080如果需要配置 HTTPS 代理,还需要设置
vhostHTTPSPort。
2、配置 frpc.toml
在 frpc.toml 文件中添加以下内容,确保设置了正确的服务器 IP 地址、本地 Web 服务监听端口和自定义域名:
serverAddr = "x.x.x.x" serverPort = 7000 [[proxies]] name = "web" type = "http" localPort = 80 customDomains = ["www.yourdomain.com"] [[proxies]] name = "web2" type = "http" localPort = 8080 customDomains = ["www.yourdomain2.com"]
3、启动 frps 和 frpc
略。
4、域名解析
将
www.yourdomain.com和www.yourdomain2.com的域名 A 记录解析到服务器的 IP 地址x.x.x.x。如果服务器已经有对应的域名,您还可以将 CNAME 记录解析到原始域名。另外,通过修改 HTTP 请求的 Host 字段也可以实现相同的效果。
5、通过浏览器访问
使用浏览器访问
http://www.yourdomain.com:8080即可访问内网机器上的 80 端口服务,访问http://www.yourdomain2.com:8080可以访问内网机器上的 8080 端口服务。
四、点对点内网穿透
这个示例将演示如何通过点对点 (P2P) 连接来访问内网服务,流量不会通过服务器中转。
frp 提供了一种新的代理类型 xtcp,用于在需要传输大量数据且不希望流量经过服务器的情况下实现内网穿透。
与 stcp 类似,使用 xtcp 需要在两端都部署 frpc 以建立直接连接。
需要注意的是,xtcp 并不适用于所有类型的 NAT 设备,如果穿透失败,可以尝试使用 stcp 代理。
1、配置需要暴露到外网的机器上的 frpc.toml 文件
在 frpc.toml 文件中添加以下内容,确保设置了正确的服务器地址和端口以及共享密钥 (secretKey),以及本地服务的 IP 地址和端口:
serverAddr = "x.x.x.x"
serverPort = 7000
# 如果默认的 STUN 服务器不可用,可以配置一个新的 STUN 服务器
# natHoleStunServer = "xxx"
[[proxies]]
name = "p2p_ssh"
type = "xtcp"
# 只有共享密钥 (secretKey) 与服务器端一致的用户才能访问该服务
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
2、在想要访问内网服务的机器上部署 frpc
在 frpc.toml 文件中添加以下内容,确保设置了正确的服务器地址和端口,共享密钥 (secretKey) 以及要访问的 P2P 代理的名称:
serverAddr = "x.x.x.x"
serverPort = 7000
# 如果默认的 STUN 服务器不可用,可以配置一个新的 STUN 服务器
# natHoleStunServer = "xxx"
[[visitors]]
name = "p2p_ssh_visitor"
type = "xtcp"
# 要访问的 P2P 代理的名称
serverName = "p2p_ssh"
secretKey = "abcdefg"
# 绑定本地端口以访问 SSH 服务
bindAddr = "127.0.0.1"
bindPort = 6000
# 如果需要自动保持隧道打开,将其设置为 true
# keepTunnelOpen = false
3、通过 SSH 访问内网机器
使用 SSH 命令访问内网机器,假设用户名为 test:
ssh -oPort=6000 test@127.0.0.1
评论区