一、frp 是什么?
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
二、frp的文档
三、frp的代码
https://github.com/fatedier/frp/
四、frp的下载
https://github.com/fatedier/frp/releases/tag/v0.33.0
一般选择:
-
frp_0.33.0_linux_amd64.tar.gz
解压之后frps开头是服务端、frpc开头的是客户端,并包括各自的配置样例文件。另外,systemd是启动关闭服务用的。 -
frp_0.33.0_windows_amd64.zip
五、服务端配置要点
cp frps.ini /etc/frp/frps.ini
vim /etc/frp/frps.ini
========================================================================
[common]
bind_port = 7000
vhost_http_port = 8080
# 配置dashboard可以使用web界面管理frp
# 通过 http://[server_addr]:7500 访问 Dashboard 界面,用户名密码默认都为 admin。
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
cp frps /usr/bin
cd systemd
cp frps.service /usr/lib/systemd/system
systemctl start frps.service
systemctl status frps.service
systemctl enable frps.service
六、客户端配置要点
cp frpc.ini /etc/frp/frpc.ini
vim frpc.ini
==================================================================
[common]
server_addr=x.x.x.x # frps的地址
server_port=7000
[web]
type=http
local_ip=127.0.0.1
local_port=8080
custom_domains=a.domain.com
# 测试
./frpc -c frpc.ini
# 加入系统服务
cp frpc /usr/bin
cd systemd
cp frpc.service /usr/lib/systemd/system
systemctl start frpc.service
systemctl status frpc.service
systemctl enable frpc.service
七、Windows下如何注册服务
下载winsw开源软件注册windows系统服务。
winsw的下载地址:https://github.com/winsw/winsw
下载好后把winsw.exe放在frpc的同级目录并且编写一个xml配置文件(myapp.xml)
<service>
<id>frp</id>
<name>frp这里是服务的名称</name>
<description>这里是服务的介绍,随便写</description>
<executable>frpc</executable>这里是运行的软件名
<arguments>-c frpc.ini</arguments>这里是运行的软件配置文件
<onfailure action=”restart” delay=”60 sec”/>
<onfailure action=”restart” delay=”120 sec”/>
<logmode>reset</logmode>
</service>
然后以管理员启动cmd命令窗口,cd到frp目录,执行两条命令winsw install和winsw start就行了。
如果要卸载先执行winsw stop再执行winsw uninstall。
八、为本地 HTTP 服务启用 HTTPS
通过 https2http 插件可以让本地 HTTP 服务转换成 HTTPS 服务对外提供。
frps.ini 内容如下:
[common]
bind_port = 7000
frpc.ini 内容如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[test_htts2http]
type = https
custom_domains = test.yourdomain.com
plugin = https2http
plugin_local_addr = 127.0.0.1:80
# HTTPS 证书相关的配置
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp
分别启动 frps 和 frpc。
通过浏览器访问 https://test.yourdomain.com。
九、安全地暴露内网服务
对于某些服务来说如果直接暴露于公网上将会存在安全隐患。
使用 stcp(secret tcp) 类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc 客户端。
frps.ini 内容如下:
[common]
bind_port = 7000
在需要暴露到内网的机器上部署 frpc,且配置如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[secret_ssh]
type = stcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
在想要访问内网服务的机器上也部署 frpc,且配置如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[secret_ssh_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 绑定本地端口用于访问 SSH 服务
bind_addr = 127.0.0.1
bind_port = 6000
通过 SSH 访问内网机器,假设用户名为 test:
ssh -oPort=6000 test@127.0.0.1
十、转发 DNS 查询请求
DNS 查询请求通常使用 UDP 协议,frp 支持对内网 UDP 服务的穿透,配置方式和 TCP 基本一致。
frps.ini 内容如下:
[common]
bind_port = 7000
frpc.ini 内容如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000
这里反代了 Google 的 DNS 查询服务器的地址,仅仅用于测试 UDP 代理,并无实际意义。
分别启动 frps 和 frpc。
通过 dig 测试 UDP 包转发是否成功,预期会返回 www.baidu.com 域名的解析结果。
dig @x.x.x.x -p 6000 www.baidu.com
十一、通过自定义域名访问内网的 Web 服务
HTTP 类型的代理相比于 TCP 类型,不仅在服务端只需要监听一个额外的端口 vhost_http_port 用于接收 HTTP 请求,还额外提供了基于 HTTP 协议的诸多功能。
修改 frps.ini 文件,设置监听 HTTP 请求端口为 8080:
[common]
bind_port = 7000
vhost_http_port = 8080
修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 Web 服务监听的端口, 绑定自定义域名为 custom_domains。
[common]
server_addr = x.x.x.x
server_port = 7000
[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
[web2]
type = http
local_port = 8080
custom_domains = www.yourdomain2.com
分别启动 frps 和 frpc。
将 www.yourdomain.com 和 www.yourdomain2.com 的域名 A 记录解析到 IP x.x.x.x,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。或者可以通过修改 HTTP 请求的 Host 字段来实现同样的效果。
通过浏览器访问 http://www.yourdomain.com:8080 即可访问到处于内网机器上 80 端口的服务,访问 http://www.yourdomain2.com:8080 则访问到内网机器上 8080 端口的服务。
十二、安全的SSH内网穿透案例
- frps的配置(代理服务器)
vim /etc/frp/frps.ini
===========================================================
[common]
bind_port = 7000
privilege_token = serverAuthKey
- frpc的配置(被代理的内网客户端)
vim /etc/frp/frpc.ini
===========================================================
[common]
server_addr = 192.168.74.205
server_port = 7000
privilege_token = serverAuthKey
[secret_ssh]
type = stcp
sk = match2publicUserKey
local_ip = 127.0.0.1
local_port = 22
use_encryption = true
use_compression = true
- 公网用户的frpc配置
vim /etc/frp/frpc.ini
===========================================================
[common]
server_addr = 192.168.74.205
server_port = 7000
[secret_ssh_visitor]
type = stcp
role = visitor
server_name = secret_ssh
sk = match2publicUserKey
bind_addr = 127.0.0.1
bind_port = 4567
启动测试
./frpc -c ./frpc.ini
ssh -p 4567 bee@127.0.0.1
十三、Win10远程桌面的代理
被代理的内网服务器 frpc.ini 内容如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[RDP]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7002
远端公网用户mstsc,输入x.x.x.x:7002即可内网穿透连接远程桌面。