frp代理访问学校服务器

由于新冠疫情,学校开学延迟,因此短期内大家还是要维持远程办公的状态。我这边的需求,一是访问实验室内部的wiki, 二是计算资源,也就是服务器。但是由于学校的vpn的问题,连接经常处于极不稳定的状态,因此十分影响心态和效率。本篇文章简单记录了一下如何使用frp跳过学校vpn,远程连接学校服务器。

frp(快速反向代理)是一个可以用于内网穿透的反向代理应用,很早之前就知道它,但是由于自己一直没有一个公网上的vps,所以没能能拿来做什么事情。一些常见的需求,比如想暴露自己在某个局域网内部(家庭,学校,公司等等)的某些服务(文件,web等等)到公网之外,都可以使用它进行内网穿透(前提是需要有一个公网的主机,进行请求转发)。

ssh连接内网机器的配置README上写的很详细,但是要注意把服务器上对应的端口打开,不然后面ssh的时候会出现”connection refused”的错误。我服务端的系统是centos,可以配合firewall-cmd进行端口管理,写一个脚本run_server.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env bash

# wujian@2020

[ $# -ne 2 ] && echo "script format error: $0: <server-port> <client-port>" && exit 1

server_port=$1
client_port=$2

# check and open service port
for p in $server_port $client_port; do
port_query=$(firewall-cmd --zone=public --query-port=$p/tcp)
if [[ $port_query -eq "no" ]]; then
echo "$0: open port $p ..."
firewall-cmd --zone=public --add-port=$p/tcp && echo "$0: open port $p done"
else
echo "$0: port $p already opened, skip..."
fi
done

export SSH_SERVER_PORT=$server_port
./frps -c ./frps.ini 2>&1 > server.${server_port}.log

脚本里面使用环境变量进行server port的设置,因此frps.ini里面对应的使用go模板的方式。firewall-cmd是linux上一个替代iptables的防火墙管理工具,使用文档可以参考这里firewall-cmd
服务端启动起来之后,在学校的服务器上对应的启动客户端的程序,对应使用run_server.sh里面指定的<server-port><client-port>:

1
2
3
4
5
6
7
8
9
[common]
server_addr = <server-addr>
server_port = <server-port>

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = <client-port>

如果两端的log里面没有error,则说明服务启动正常,接下来就可以进行ssh和scp操作了。在上述配置下,对应的连接命令为:

1
ssh -p <client-port> <user-name>@<server-addr>

<user-name>为学校服务器的用户名,本地到远程的数据传输命令为:

1
scp -P <client-port> -r /local/data/path  <user-name>@<server-addr>:/remote/data/path

反之为:

1
scp -P <client-port> -r <user-name>@<server-addr>:/remote/data/path /local/data/path