FRP 使用手记

邻近回家,面对着怎么都调不通的代码,一点心情都没有。然而又想着 “回家之后怎么杀回校内网” 的事儿。正好晚上搞一下。

在 V2Ray 群里吐槽好久说希望加上内网穿透,小姐姐一直说 “再等等……”,然后有人看不下去了:“自己去试 frp 啊!”

Background

学校对网络管的比较严,虽然 10.0.0.0/8 段内网里面几乎任意主机都可以互通,但是对外就不一样了:目测是有一台堡垒机当作统一出口,然后对内网已报备的几台服务器做常用端口映射。虽然校园网有 IPv6,但是禁止了 22 口的入站(换成其他口就好了)。IPv6 对于运营商网络来说仍是稀有物品,而且速度不怎么好,寝室连学校,最高 500K 的样子。想使用 V2Ray 的特殊手段连进来,都失败了。SSH 端口转发一直断线,而且晚上 3 点会强制下线。目前最好的办法就是 TeamViewer,非商用的话一小会儿就断掉了。总之不是长久之计。

其他方案的话…… 花生壳?太阳花?nat123?国内非开源不太信任。

被安利 frp 之后就去搜了一下。文档蛮全的,感觉还挺简单的。而且一次成功。


首先去下载最新 Release,解压缩,之后为 Server 端和 Client 端分别进行配置。

Server 端

按照 “惯例”,把 frps 放在 /usr/bin 里面。然后新建 /etc/frps/,在里面新建一份配置文件 frps.ini

自己的需求比较简单,只是希望能在外网访问自己电脑而已,所以 中文文档 里面的很多高大上的东西都用不上,只用上了最最前面的端口转发。配置如下

[common]
bind_port = 7000
log_level = warn

没了……Server 端就是这么简洁……

再搞个服务,每次开机自动启动:

sudo vi /lib/systemd/system/frps.service

[Unit]
Description=FRP Server service
Require=network.target
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
User=root
Group=root

GuessMainPID=yes
ExecStart=/usr/bin/frps -c /etc/frps/frps.ini
ExecReload=/bin/kill -s QUIT $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
sudo systemctl enable frps
sudo service frps start

Client 端

复制 frpc/usr/bin/,新建配置文件 /etc/frpc/frpc.ini

同样是只用基础功能,所以配置依旧很少:

[common]
server_addr = YOUR_SERVER_IP_HERE
server_port = 7000
log_level = warn
login_fail_exit = false

user = YOUR_COMPUTER_NAME_HERE    # 这里给自己电脑起个名字

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = WHICH_PORT_DO_YOU_WANT_TO_USE

注意替换一下信息。之后依然是建个服务自动启动:

sudo vi /lib/systemd/system/frpc.service

[Unit]
Description=FRP Client service
Require=network.target
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
User=root
Group=root

GuessMainPID=yes
ExecStart=/usr/bin/frpc -c /etc/frpc/frpc.ini
ExecReload=/bin/kill -s QUIT $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
sudo systemctl enable frpc
sudo service frpc start

就这样就完了!

在外网上试一下 ssh username@YOUR_SERVER_IP -p YOUR_PORT,然后输入个 ip a 看看是不是内网的 IP 地址?

如果使用 5900 口的话就可以 VNC 了哦~

一些小坑

  • login_fail_exit = false 可以保证 Client 一直尝试连接 Server,而不是 “连接失败就报错退出”。
  • 注意到 client 的 user,建议还是设置一下吧。
  • client 里面所有的小标签 [xxxx] 不能重名。(ini 的特性,同时好像根据小标签名来区分不同链接)
  • 目前暂时不支持 “每个连接分别使用一个服务器” 这样的 “双保险”
  • 中转服务器最好放在国内。为啥?为速度啊!

留下评论