Frp 内网穿透服务搭建

引言

本文写于 2023-04-24，服务端使用 阿里云飞天白嫖服务器 系统为 Ubuntu18
客户端使用 Microsoft Windows 10 企业版 N
frp 版本为 frp_0.48.0
使用 frp 内网穿透 校园网 进行 Windows 远程桌面、stable-diffusion 页面、Alist 等等

服务端

下载

| Github 主页 | Releases 页 |

frp 版本与系统和架构对应
不知道下载什么版本？使用 hostnamectl 查看 Linux 系统信息:

Copy
# hostnamectl
Static hostname: gaoqiqiang
Icon name: computer-vm
Chassis: vm
Machine ID: ec8469a4caecdssfc4eb
Boot ID: 78dded31dc7e9f2a6c62
Virtualization: kvm
Operating System: Ubuntu 18.88.8 LTS
Kernel: Linux 5.55.0-202-generic
Architecture: x86-64 # x86-64 也是 amd64

解压并移动 (安装) 到指定目录

Copy
# 解压
tar -zxvf 压缩文件名.tar.gz
# 移动
mv ./frp /opt/

配置 frps.ini

由于项目会更新，下文的配置仅供特定的版本 [frp_0.48.0] 作参考，具体配置方法最有效的是查看下载的文件中 frps_full.ini 文件 或者查看仓库的页面 (可以使用网页翻译) 仓库

Copy
vim /opt/frp/frps.ini

注意: 注释只能独占一行！错误配置:bind_port = 7000 # 错误注释

Copy
[common]
bind_addr = 0.0.0.0
bind_port = 7000
dashboard_port = 7500

# 指定 frps 服务绑定的 UDP 端口，其作用是帮助 frpc 客户端穿透 NAT。
bind_udp_port = 7001

# 用于 kcp 协议的 udp 端口，它可以与 bind_port 相同。
# 如果未设置，则在 frp 中禁用 kcp。
kcp_bind_port = 7000
# 客户端链接的密码
token = 12345678

# 设置 log_file 将不会在控制台输出日志
log_file = ./frps.log
# trace, debug, info, warn, error
log_level = info

# 仅允许 frpc 绑定您列出的端口，如果您什么也不设置，则不会有任何限制
#allow_ports = 2000-3000,3001,3003,4000-50000

# 用于基本身份验证保护的仪表板用户和密码
dashboard_user = adminName
dashboard_pwd = password

手动运行测试

推荐将 log_file = ./frps.log 注释掉，可以在控制台看见信息

Copy
/opt/frp/frps -c /opt/frp/frps.ini

查看输出

Copy
[I] [root.go:206] frps uses config file: /opt/frp/frps.ini
[I] [service.go:200] frps tcp listen on 0.0.0.0:7000
[I] [service.go:210] frps kcp listen on udp 0.0.0.0:7000
[I] [service.go:302] nat hole udp service listen on 0.0.0.0:7001
[I] [service.go:317] Dashboard listen on 0.0.0.0:7500
[I] [root.go:215] frps started successfully
# 运行成功

如果运行失败了，可以参考输出的信息，同时检查 frps.ini 配置，Google (GPT) 寻求帮助

配置 frps 服务项

使用 systemd 管理服务，确保你的 Linux 使用的是 systemd (没有可以安装)
或者使用可用的管理软件，请自行学。

Copy
vim /lib/systemd/system/frps.service

内容如下:

Copy
[Unit]
Description = frps daemon # 服务项说明
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
#此处把 /opt/frp 替换成 你的frp的实际安装目录
ExecStart = /opt/frp/frps -c /opt/frp/frps.ini

[Install]
WantedBy = multi-user.target

如果不是第一次编辑这个文件可能需要重新加载
使用 systemctl daemon-reload 命令来重新加载配置并应用更改

服务项命令

Copy
# 启动 frps
sudo systemctl start frps
# 打开自启动
sudo systemctl enable frps
# 重启应用
sudo systemctl restart frps
# 停止应用
sudo systemctl stop frps
# 查看状态和日志
sudo systemctl status frps

客户端

下载对应版本 frp

查看 Windows 架构:
使用 msinfo32 或者 systeminfo 命令
如果 系统类型:x64-based PC 选择 amd64 的 Windows 版本

配置 frpc.ini

测试 demo

这里需要有可以供测试的服务才能测试服务实际运行情况，比如 Alist、远程桌面等等。

如果你什么都没有，可以使用开源软件 简单服务器 搭建一的简单的网站服务测试，本软件由本人提供汉化支持，连官方文档也汉化了哟！| Github 页 | Releases 页 | 官方网页 | 官方文档 |

开始配置

注意: 注释只能独占一行！错误配置:bind_port = 7000 # 错误注释

Copy
[common]
# 服务器地址
server_addr = 822.222.222.229
# 服务器 bind_port 端口
server_port = 7000
token = 12345678

# ServerUDPPort 指定了服务器用于穿透 NAT 隧道的端口。默认情况下，此值为 0。
# 该参数仅在执行命令行中的 "nathole discover" 时使用。
# server_udp_port = 0

#如果你想通过http代理或者socks5代理或者ntlm代理来连接frps，你可以在这里或者在全局环境变量中设置http_proxy
#仅在协议为 tcp 时有效
# http_proxy = http://user:passwd@192.168.1.128:8080
# http_proxy = socks5://user:passwd@192.168.1.128:1080
# http_proxy = ntlm://user:passwd@192.168.1.128:2080

# 服务的名称，随便就好
[web]
# 转发流量的类型
# tcp | udp | http | https | stcp | xtcp, 默认是 tcp
type = tcp
# 本地地址
local_ip = 127.0.0.1
# 本地端口
local_port = 9999
# 远程端口
remote_port = 8083

[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 8082

手动运行测试

注意：服务器端需要正常运行，建议两边都手动运行方便实时查看日志

Windows 在 cmd 中运行

Copy
cd /d frp目录
frpc.exe -c frpc.ini
[I] [service.go:299] login to server success, get run id [xx], server udp port [7001]
[I] [proxy_manager.go:142] proxy added: [sd rdp]
[I] [control.go:172] [sd] start proxy success
[I] [control.go:172] [rdp] start proxy success
# 穿透成功，成功映射对应服务

服务端日志

Copy
[I] [service.go:500] client login info: ip [xxx] version [0.48.0] hostname [] os [windows] arch [amd64]
[I] [tcp.go:66] [] [sd] tcp proxy listen port [8888]
[I] [control.go:464] new proxy [sd] type [tcp] success
[I] [tcp.go:66] [] [rdp] tcp proxy listen port [9999]
[I] [control.go:464] [] new proxy [rdp] type [tcp] success

服务已经成功了，访问对应的端口即可看见结果

配置 frpc 服务项

在 Windows 上将普通程序设置为服务项的方法有很多，我使用的是 nssm 开源软件，虽然软件多年没有更新了，GUI 界面在 Win10 上显示也不太方便使用，但是又不是不能用。

nssm 软件使用本文不涉。

可用的软件有:

nssm (开源，免费) | 官方网址 | 下载地址 | Git 页面 |

AlwaysUp (闭源，收费) | 官方网址 | 参考链接 |

Frp 控制台

访问: http://IP地址:7500 如果在 frps.ini 中配置了鉴权还需要输入用户和密码

其他

关于配置文件

[common] 是公共配置的意思，以这种节点的方式进行配置是 ini 文件的常见写法。顾名思义，如果有多个 frps 服务器，也可以单独设置每个应用的 frps 服务，本文不展开，参考官方文档是最好的学习方式 frpc.ini。

nathole discover 是 frp 工具中的一个命令行工具，用于探测当前网络环境下是否存在 NAT 隧道，并尝试通过穿透 NAT 隧道来建立连接。

在使用 frp 进行内网穿透时，如果客户端和服务器之间存在 NAT 隧道，就会导致无法建立连接。通过执行 nathole discover 命令，frp 可以探测当前网络环境下是否存在 NAT 隧道，并尝试通过穿透 NAT 隧道来建立连接，从而解决连接问题。

在执行 nathole discover 命令时，frp 将会向服务器发送 UDP 数据包，并从服务器的响应中获取 NAT 类型和公网 IP 地址等信息。根据获取到的信息，frp 尝试使用不同的方式来穿透 NAT 隧道，以建立连接。

需要注意的是，nathole discover 命令仅适用于 UDP 类型代理，因为它需要使用 UDP 数据包来进行探测。如果您使用的是 TCP 类型代理，则无法使用 nathole discover 命令来穿透 NAT 隧道。

代理类型

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

类型 | 描述
tcp | 单纯的 TCP 端口映射，服务端会根据不同的端口路由到不同的内网服务。
udp | 单纯的 UDP 端口映射，服务端会根据不同的端口路由到不同的内网服务。
http | 针对 HTTP 应用定制了一些额外的功能，例如修改 Host Header，增加鉴权。
https | 针对 HTTPS 应用定制了一些额外的功能。
stcp | 安全的 TCP 内网代理，需要在被访问者和访问者的机器上都部署 frpc，不需要在服务端暴露端口。
sudp | 安全的 UDP 内网代理，需要在被访问者和访问者的机器上都部署 frpc，不需要在服务端暴露端口。
xtcp | 点对点内网穿透代理，功能同 stcp，但是流量不需要经过服务器中转。
tcpmux | 支持服务端 TCP 端口的多路复用，通过同一个端口访问不同的内网服务。

参考链接:
| 功能特性 | 代理类型 |

资源汇总

Frp
| Github 主页 | Frp 官方文档 |

阿里云飞天计划
| 主页 | 学生页面 |

Simple Web Server
| Github 页 | Releases 页 | 官方网页 | 官方文档 |

nssm
| 官方网址 | 下载地址 | Git 页面 |

AlwaysUp
| 官方网址 | 参考链接 |