借助FRP反向代理实现内网穿透


一、frp 是什么?

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

frp原理
frp原理

二、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即可内网穿透连接远程桌面。

原文地址:https://www.cnblogs.com/cerana/p/13583687.html