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 使用背景
- 做微信公众号、小程序开发→域名代理模式
- 想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射→tcp代理模式
- 在非内网环境下使用内网dns,或者需要通过udp访问内网机器→udp代理模式
- 在外网使用HTTP代理访问内网站点→http代理模式
- 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内外网资源或者设备→socks5代理模式
2.2 服务端安装
下载服务器到对应版本的NPS,上传服务器,解压、安装
./nps install