寒假回家,需要访问校园网内的服务器怎么办呢?
目前可行的方法是通过学校提供的easyconnect软件进行流量转发,使用的应该是ssh隧道,但是每次使用都要登陆以及随机验证码验证,十分不方便,而且休眠后连接就会终端。
个人设备:
- 内网服务器一台,无公网ip,配置了ssh服务
- 内网主机一台,无公网ip,配置了todesk远程桌面
- 外网笔记本一台,无公网ip
- 云服务器一台,有公网ip
经过调研,可行的方案:
- 通过内网穿透(如frp),反向代理到云服务器,外网笔记本访问云服务器去访问内网服务器
- 通过ssh反向代理
方案一
内网穿透
这里采用开源的内网穿透工具frp:https://github.com/fatedier/frp
参考示例:https://gofrp.org/zh-cn/docs/examples/ssh/
frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。
info
这里也可以使用ssh反向代理进行内网穿透,但是其连接有不稳定的风险,需要定时重启,麻烦。暂时不考虑
frp在云服务器配置
info
记得云服务器设置安全组,开启端口哦。开启后可以telnet检查一下是否可以tcp连接开启的端口
在这里下载二进制版本:https://github.com/fatedier/frp/releases
解压下载的压缩包。
将 frpc 复制到内网服务所在的机器上。
将 frps 复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。
开始使用:
- 编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐。
- 使用以下命令启动服务器:./frps -c ./frps.toml。
- 使用以下命令启动客户端:./frpc -c ./frpc.toml。
- 如果需要在后台长期运行,建议结合其他工具,如 systemd 和 supervisor。
配置frps.toml
1
2
3
4
5
6
7
8
9
10
11
| bindPort = 7000 # 必用:frp的默认监听端口
# 默认为 127.0.0.1,如果需要公网访问,需要修改为 0.0.0.0。
webServer.addr = "0.0.0.0"
webServer.port = 7001
# dashboard 用户名密码,可选,默认为空
# webServer.user = "xxx"
# webServer.password = "xxx"
auth.method = "token" #指定认证方式,token 表示客户端和服务端通过 Token 进行身份认证
auth.token = "tutu123" #Token 用于客户端和服务端的身份认证,自由设置
|
可以在配置的端口看dashboard啦,客户端就配置好啦
frp在内网服务器配置
info
这里在服务器和个人电脑上配置都可以,因为是一个子网
配置./frpc.toml
1
2
3
4
5
6
7
8
9
10
11
| serverAddr = "xxxx"
serverPort = 7000
auth.method = "token"
auth.token = "xxx"
[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 12000
remotePort = 12000
|
经过测试这套配置我在家是可以穿透的,但是不知道为什么在校园网无法内网穿透,报错,
1
2
3
4
5
6
| PS C:\Users\37359\Downloads\frp_0.61.1_windows_amd64 .\frpc.exe -c .\frpc.toml
2025-01-09 19:51:21.685 [I] [sub/root.go:142] start frpc service for config file [.\frpc.toml]
2025-01-09 19:51:21.699 [I] [client/service.go:295] try to connect to server...
2025-01-09 19:51:31.735 [W] [client/service.go:298] connect to server error: i/o deadline reached
2025-01-09 19:51:31.735 [I] [sub/root.go:160] frpc service for config file [.\frpc.toml] stopped
login to the server failed: i/o deadline reached. With loginFailExit enabled, no additional retries will be attempted
|
在服务端也是没有log连接请求的,应该是校园网拦截了这个tcp链接,这个问题折腾了我很久。
- 默认是启用了tls的,但是没有效果
- 考虑使用KCP协议
- 考虑使用QUIC协议
发现这两种协议可以成功!
更新后的配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| # frps.toml
bindPort = 7000 # 必用:frp的默认监听端口
# kcp 绑定的是 UDP 端口,可以和 bindPort 一样,kcp quic二选一
# kcpBindPort = 7000
quicBindPort = 7000
# 默认为 127.0.0.1,如果需要公网访问,需要修改为 0.0.0.0。
webServer.addr = "0.0.0.0"
webServer.port = 7001
# dashboard 用户名密码,可选,默认为空
webServer.user = "xxx"
webServer.password = "xxx"
auth.method = "token" #指定认证方式,token 表示客户端和服务端通过 Token 进行身份认证
auth.token = "xx" #Token 用于客户端和服务端的身份认证,自由设置
--------------------------
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.method = "token"
auth.token = "xx"
transport.protocol = "quic"
# 开启客户端ui
webServer.addr = "127.0.0.1"
webServer.port = 7002
webServer.user = "xxx"
webServer.password = "xxx"
[[proxies]] # 转发admin_ui
name = "admin_ui"
type = "tcp"
localPort = 7002
remotePort = 7002
[[proxies]] # forward remote port 10000 to x299 port 22
name = "ssh22"
type = "tcp"
localIP = "172.18.216.209"
localPort = 22
remotePort = 10000
# add as you need
|
note
frps.toml 和 frpc.toml 中
tcpMux默认已开启
通过SSH访问内网机器
1
| ssh -p <remotePort> user@x.x.x.x
|
让我们测试一下吧!
成功!
使用 systemd
此示例演示如何在 Linux 系统下使用 systemd 来管理 frps 服务,包括启动、停止、配置后台运行和设置开机自启动。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| # 安装 systemd
apt install systemd
# 创建 frps.service 文件
sudo vim /etc/systemd/system/frps.service
# 写入内容
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /home/lpt/frps -c /home/lpt/frps.toml
[Install]
WantedBy = multi-user.target
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
--------------------------
# 使用 systemd 命令管理 frps 服务
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
# 设置 frps 开机自启动
sudo systemctl enable frps
|
ui更改配置,直接使用
可以打开
- 43.138.253.221:7001 查看链接情况
- 43.138.253.221:7002 修改客户端配置,保存完成后即可使用