frp内网转发代理神器详解

admin 2025年5月19日09:51:48评论2 views字数 8267阅读27分33秒阅读模式

一、frp 是什么

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

二、VPS linux服务器端安装服务器端frps

cd  /opt

wget  wget https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz

tar  -zxvf   frp_0.48.0_linux_amd64.tar.gz  

mv frp_0.48.0_linux_amd64     frp

cd frp

三、服务器端frps的frps.ini进行配置

cd frp

vim  frps.ini :

[common]

# frp监听的端口,默认是7000,可以改成其他的

bind_port = 7000

# HTTP端口       

vhost_http_port = 54321 

# HTTPS端口 

vhost_https_port = 54322 

# 用于身份验证,请自行修改,要保证服务端与客户端一致

token = 123456           

# Dashboard (服务端配置)

# frp管理后台端口,请按自己需求更改

dashboard_port = 7002

# frp管理后台用户名和密码,请改成自己的

dashboard_user = admin

dashboard_pwd = admin

enable_prometheus = true

# frp日志配置

log_file = /var/log/frps.log

log_level = info

log_max_days = 3

防火墙开放端口

# 添加监听端口

sudo firewall-cmd --permanent --add-port=7000/tcp

# 添加管理后台端口

sudo firewall-cmd --permanent --add-port= 7002/tcp

sudo firewall-cmd --reload

四、客服端frpc的frpc.ini进行配置

cd frp

vim  frpc.ini :

[common]

#公网 VPS IP

server_addr = 106.13.218.47 

#外网-服务器端监听的端口(必须与Frps.ini中的配置一致)         

server_port = 7000

# 用于身份验证,请自行修改,要保证服务端与客户端一致                    

token = 123456                         

# AdminUI (客户端配置)

# 使用内网真实地址  即可访问测试

admin_addr = 127.0.0.1                

admin_port = 7400

admin_user = admin

admin_pwd = admin

[web]

type = http

local_ip = 127.0.0.1

local_port = 80

remote_port = 54321

custom_domains = 106.13.218.47       # 建议使用域名进行区分

[mysql]

type = tcp

local_ip = 127.0.0.1

local_port = 3306

remote_port = 9000

[ssh]

#配置类型为tcp协议

type = tcp

#内网机器的IP

local_ip = 127.0.0.1

#内网机器的端口

local_port = 22

remote_port = 9001

[rdp]

type = tcp

local_ip = 127.0.0.1

local_port = 3389

remote_port = 9002

五、公网服务器端frps启动

后台启动frps

nohup ./frps -c ./frps.ini

后台启动frps并输出日志到frps.log

nohup ./frps -c frps.ini 2>&1> frps.log &

启动的监听日志:

2019/03/23 17:27:41 [I] [service.go:136] frps tcp listen on 0.0.0.0:7000

2019/03/23 17:27:41 [I] [root.go:204] Start frps success

则说明服务器端已经启动Frp服务,监听的端口是7000

六、内网主机启动客户端frpc

 #启动linux客户端

./frpc -c ./frpc.ini  

#后台启动linux客户端

nohup ./frpc -c frpc.ini
nohup ./frpc -c frpc.ini > frpc.log &

 #启动windows客户端     

 frpc.exe    -c ./frpc.ini 

四、Linux 系统下使用 systemd 控制 frps 及配置开机自启

1.在 /etc/systemd/system 目录下创建一个 frps.service 文件(centos系统下自带systemd服务)

vim /etc/systemd/system/frps.service

frps.service:

[Unit]

# 服务名称,可自定义

Description = frp server

After = network.target syslog.target

Wants = network.target

[Service]

Type = simple

# 启动frps的命令,需修改为您的frps的安装路径

ExecStart = /opt/frp/frps  -c  /opt/frp/frps.ini

[Install]

WantedBy = multi-user.target

4.使用 systemd 命令,管理 frps

# 启动frp

systemctl start frps

# 停止frp

systemctl stop frps

# 重启frp

systemctl restart frps

# 查看frp状态

systemctl status frps

5.配置 frps 开机自启

systemctl enable frps

六、代理类型

frp 支持多种代理类型来适配不同的使用场景。

类型    描述

tcp    单纯的 TCP 端口映射,服务端会根据不同的端口路由到不同的内网服务。

udp    单纯的 UDP 端口映射,服务端会根据不同的端口路由到不同的内网服务。

http    针对 HTTP 应用定制了一些额外的功能,例如修改 Host Header,增加鉴权。

https    针对 HTTPS 应用定制了一些额外的功能。

stcp    安全的 TCP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。

sudp    安全的 UDP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。

xtcp    点对点内网穿透代理,功能同 stcp,但是流量不需要经过服务器中转。

tcpmux    支持服务端 TCP 端口的多路复用,通过同一个端口访问不同的内网服务

七、使用场景

1.通过 SSH 访问内网机器

  这个示例通过简单配置 TCP 类型的代理让用户访问到内网的服务器。

  1. 在具有公网 IP 的机器上部署 frps,修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口:

    [common] bind_port = 7000
  2. 在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署 frpc,修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 106.13.218.47

    [common] server_addr= 106.13.218.47server_port = 7000  [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000

    local_ip 和 local_port 配置为本地需要暴露到公网的服务地址和端口。remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。

  3. 分别启动 frps 和 frpc

    ./frps -c ./frps.ini

     ./frpc -c ./frpc.ini  

  4.通过 SSH 访问内网机器,假设用户名为 test:

   ssh -oPort=6000 [email protected]

  5.frp 会将请求 x.x.x.x:6000 的流量转发到内网机器的 22 端口。

2.通过自定义域名访问内网的 Web 服务

 这个示例通过简单配置 HTTP 类型的代理让用户访问到内网的 Web 服务。

HTTP 类型的代理相比于 TCP 类型,不仅在服务端只需要监听一个额外的端口 vhost_http_port 用于接收 HTTP 请求,还额外提供了基于 HTTP 协议的诸多功能。

1.修改 frps.ini 文件,设置监听 HTTP 请求端口为 8080:

[common]bind_port = 7000vhost_http_port = 8080

2.修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为106.13.218.47,local_port 为本地机器上 Web 服务监听的端口, 绑定自定义域名为 custom_domains。

[common]server_addr = 106.13.218.47server_port = 7000
[web]type = httplocal_port = 80custom_domains = www.yourdomain.com[web2]type = httplocal_port = 8080custom_domains = www.yourdomain2.com

3.分别启动 frps 和 frpc。

4.将 www.yourdomain.com 和 www.yourdomain2.com 的域名 A 记录解析到 IP 106.13.218.47,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。或者可以通过修改 HTTP 请求的 Host 字段来实现同样的效果。

 5.通过浏览器访问 http://www.yourdomain.com:8080 即可访问到处于内网机器上 80 端口的服务,访       问 http://www.yourdomain2.com:8080 则访问到内网机器上 8080 端口的服务。

3.转发 DNS 查询请求

这个示例通过简单配置 UDP 类型的代理转发 DNS 查询请求。

DNS 查询请求通常使用 UDP 协议,frp 支持对内网 UDP 服务的穿透,配置方式和 TCP 基本一致。

  1. frps.ini 内容如下:

    [common]bind_port = 7000
  2. frpc.ini 内容如下:

    [common]server_addr = x.x.x.xserver_port = 7000[dns]type = udplocal_ip = 8.8.8.8local_port = 53remote_port = 6000

    这里反代了 Google 的 DNS 查询服务器的地址,仅仅用于测试 UDP 代理,并无实际意义。

  3. 分别启动 frps 和 frpc。

 4.通过 dig 测试 UDP 包转发是否成功,预期会返回 www.baidu.com 域名的解析结果。

dig @x.x.x.x -p 6000 www.baidu.com

4.转发 Unix 域套接字

这个示例通过配置 Unix域套接字客户端插件来通过 TCP 端口访问内网的 Unix域套接字服务,例如 Docker Daemon。

  1. frps.ini 内容如下:
    [common]
    bind_port=7000

  • frpc.ini 内容如下:

    [common]
    server_addr=x.x.x.x
    server_port=7000

    [unix_domain_socket]
    type=tcp
    remote_port=6000
    plugin=unix_domain_socket
    plugin_unix_path=/var/run/docker.sock
  • 分别启动 frps 和 frpc。
  • 4.通过 curl 命令查看 docker 版本信息

     curl http://x.x.x.x:6000/version

    5.对外提供简单的文件访问服务

    这个示例通过配置 static_file 客户端插件来将本地文件暴露在公网上供其他人访问。

    通过 static_file 插件可以对外提供一个简单的基于 HTTP 的文件访问服务。

    1. frps.ini 内容如下:

      [common]bind_port = 7000
    2. frpc.ini 内容如下:

      [common]server_addr = x.x.x.xserver_port = 7000[test_static_file]type = tcpremote_port = 6000plugin = static_file# 要对外暴露的文件目录plugin_local_path = /tmp/file# 用户访问 URL 中会被去除的前缀,保留的内容即为要访问的文件路径plugin_strip_prefix = staticplugin_http_user = abcplugin_http_passwd = abc
    3. 分别启动 frps 和 frpc。

      4.通过浏览器访问 http://x.x.x.x:6000/static/ 来查看位于 /tmp/file 目录下的文件,会要求输入已设置好的用户名和密码。

    4.为本地 HTTP 服务启用 HTTPS

    通过 https2http 插件可以让本地 HTTP 服务转换成 HTTPS 服务对外提供。

    1. frps.ini 内容如下:

      [common]bind_port = 7000
    2. frpc.ini 内容如下:

      [common]server_addr = x.x.x.xserver_port = 7000[test_htts2http]type = httpscustom_domains = test.yourdomain.complugin = https2httpplugin_local_addr = 127.0.0.1:80# HTTPS 证书相关的配置plugin_crt_path = ./server.crtplugin_key_path = ./server.keyplugin_host_header_rewrite = 127.0.0.1plugin_header_X-From-Where = frp
    3. 分别启动 frps 和 frpc。

      4.通过浏览器访问 https://test.yourdomain.com。

    5.安全地暴露内网服务

    这个示例将会创建一个只有自己能访问到的 SSH 服务代理。

    对于某些服务来说如果直接暴露于公网上将会存在安全隐患。

    使用 stcp(secret tcp) 类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc 客户端。

    1. frps.ini 内容如下:

      [common]bind_port = 7000
    2. 在需要暴露到外网的机器上部署 frpc,且配置如下:

      [common]server_addr = x.x.x.xserver_port = 7000[secret_ssh]type = stcp# 只有 sk 一致的用户才能访问到此服务sk = abcdefglocal_ip = 127.0.0.1local_port = 22
    3. 在想要访问内网服务的机器上也部署 frpc,且配置如下:

      [common]server_addr = x.x.x.xserver_port = 7000[secret_ssh_visitor]type = stcp# stcp 的访问者role = visitor# 要访问的 stcp 代理的名字server_name = secret_sshsk = abcdefg# 绑定本地端口用于访问 SSH 服务bind_addr = 127.0.0.1bind_port = 6000

    4.通过 SSH 访问内网机器,假设用户名为 test:

    ssh -oPort=6000 [email protected]

    6.点对点内网穿透

    这个示例将会演示一种不通过服务器中转流量的方式来访问内网服务。

    frp 提供了一种新的代理类型 xtcp 用于应对在希望传输大量数据且流量不经过服务器的场景。

    使用方式同 stcp 类似,需要在两边都部署上 frpc 用于建立直接的连接。

    目前处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 stcp 的方式。

    1. frps.ini 内容如下,需要额外配置监听一个 UDP 端口用于支持该类型的客户端:

      [common] bind_port = 7000 bind_udp_port = 7000
    2. 在需要暴露到外网的机器上部署 frpc,且配置如下:

      [common] server_addr = x.x.x.x server_port = 7000  [p2p_ssh] type = xtcp # 只有 sk 一致的用户才能访问到此服务 sk = abcdefg local_ip = 127.0.0.1 local_port = 22
    3. 在想要访问内网服务的机器上也部署 frpc,且配置如下:

      [common] server_addr = x.x.x.x server_port = 7000  [p2p_ssh_visitor] type = xtcp # xtcp 的访问者 role = visitor # 要访问的 xtcp 代理的名字 server_name = p2p_ssh sk = abcdefg # 绑定本地端口用于访问 ssh 服务 bind_addr = 127.0.0.1 bind_port = 6000

    4.通过 SSH 访问内网机器,假设用户名为 test:

    ssh -oPort=6000 [email protected]

    常用功能

    统计面板(Dashboard)

    通过浏览器查看 frp 的状态以及代理统计信息展示。

    注:Dashboard 尚未针对大量的 proxy 数据展示做优化,如果出现 Dashboard 访问较慢的情况,请不要启用此功能。

    需要在 frps.ini 中指定 dashboard 服务使用的端口,即可开启此功能:

    [common]
    dashboard_port = 7500
    # dashboard 用户名密码,默认都为 admin
    dashboard_user = admin
    dashboard_pwd = admin

    打开浏览器通过 http://[server_addr]:7500

     访问 dashboard 界面,用户名密码默认为 admin

    加密与压缩

    这两个功能默认是不开启的,需要在 frpc.ini 中通过配置来为指定的代理启用加密与压缩的功能,压缩算法使用 snappy:

    # frpc.ini[ssh]type = tcplocal_port = 22remote_port = 6000use_encryption = trueuse_compression = true

    如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 SSH 协议等,通过设置 use_encryption = true,将 frpc 与 frps 之间的通信内容加密传输,将会有效防止流量被拦截。

    如果传输的报文长度较长,通过设置 use_compression = true 对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 CPU 资源。

    TLS

    从 v0.25.0 版本开始 frpc 和 frps 之间支持通过 TLS 协议加密传输。通过在 frpc.ini 的 common 中配置 tls_enable = true 来启用此功能,安全性更高。

    为了端口复用,frp 建立 TLS 连接的第一个字节为 0x17。

    注意: 启用此功能后除 xtcp 外,不需要再设置 use_encryption。

    代理限速

    目前支持在客户端的代理配置中设置代理级别的限速,限制单个 proxy 可以占用的带宽。

    # frpc.ini[ssh]type = tcplocal_port = 22remote_port = 6000bandwidth_limit = 1MB

    在代理配置中增加 bandwidth_limit 字段启用此功能,目前仅支持 MB 和 KB 单位。

    范围端口映射

    在 frpc 的配置文件中可以指定映射多个端口,目前只支持 tcp 和 udp 的类型。

    这一功能通过 range: 段落标记来实现,客户端会解析这个标记中的配置,将其拆分成多个 proxy,每一个 proxy 以数字为后缀命名。

    例如要映射本地 6000-6005, 6007 这 6 个端口,主要配置如下:

    # frpc.ini[range:test_tcp]type = tcplocal_ip = 127.0.0.1local_port = 6000-6006,6007remote_port = 6000-6006,6007

    实际连接成功后会创建 8 个 proxy,命名为 test_tcp_0, test_tcp_1 ... test_tcp_7

原文始发于微信公众号(渗透测试研究中心):frp内网转发代理神器详解

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月19日09:51:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   frp内网转发代理神器详解https://cn-sec.com/archives/4078860.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息