Debian9系统使用FRP内网穿透

之前说入手了一个斐讯N1盒子,自从安装好系统之后一直放在公司角落吃灰,跑了个Nginx+PHP+MySQL就没管了,平时在公司还好,直接SSH连上去就行,但是有的时候不在公司比如说周末在家的时候想连上去干点啥就有点麻烦了,于是花了点时间,利用一台闲置的公网服务器进行内网穿透了一下,这样无论在哪都能直接连上内网的这台“服务器”了。

其实我的要求很简单,就是想在有公网的环境下能访问到位于公司内网的这台N1盒子,如果能顺带访问内网的别的机器就更好了,找来找去发现就FRP最好了,功能强大,配置简单,还免费开源,折腾了下,发现确实很简单,这里做个记录以备后用。

我是用的是国内的云服务器,如果你也和我一样有这样的需求,又不想在国内购买服务器,那可以考虑下这个CN2 GIA线路的VPS,国内三网直连,FRP访问快速。

前提

位于公网的服务器以及本地的N1盒子安装的都是Debian9系统,区别是公网的服务器系统是Debian 9 AMD64,而内网的N1盒子是Debian 9 arm64,这两个系统对应的FRP版本都能在FRP的github release页面找到,链接如下:

https://github.com/fatedier/frp/releases

FRPS-服务器端配置

下载解压之后得到一个名称为frp_0.23.0_linux_amd64的目录,我们要用到的是里面的frpsfrps.ini文件,这两个文件分别是frps的可执行程序和配置文件,我习惯将自定义的可执行程序放到/usr/bin/,配置文件放置到/etc/对应的程序名文件夹下面,于是:

cd frp_0.23.0_linux_amd64
//赋予frps可执行权限
chmod +x frps
//将frps放到path目录下
cp frps /usr/bin/

//建立配置文件目录
mkdir /etc/frp/
//将配置文件复制到对应的配置文件目录
cp frps.ini /etc/frp/

然后就是配置开机启动了,因为Debian 9使用的是systemd,我们能很简单的就能控制frps的进程了:

vim /etc/systemd/system/frps.service

[Unit]
Description=FRP Server Daemon

[Service]
Type=simple
ExecStartPre=-/usr/sbin/setcap cap_net_bind_service=+ep /usr/bin/frps
ExecStart=/usr/bin/frps -c /etc/frps.ini
Restart=always
RestartSec=20s
User=nobody
PermissionsStartOnly=true

[Install]
WantedBy=multi-user.target

因为我们要借助公网服务器进行穿透,所以,公网服务器和位于内网的FRPC对应的需要放行,因为考虑到除了跟内网通信的端口本身,我们还需要一些别的服务的端口,比如说启用一个SSH服务,这又需要一个另外的端口。我用的是腾讯云,打算分配3001-3100给FRPS使用,于是对应的安全组放行规则截图如下:
cloud-server-port-allow

所以,frps.ini里面的bind_port就要设置成上面分配区间的端口,比如说3001。

FRPC-客户端配置

这部分配置是在位于内网的机器上配置的,我的内网机器就是N1盒子了,和上面配置公网服务器类似,命令如下:

cd frp_0.23.0_linux_arm64
//赋予frps可执行权限
chmod +x frpc
//将frpc放到path目录下
cp frpc /usr/bin/

//建立配置文件目录
mkdir /etc/frp/
//将配置文件复制到对应的配置文件目录
cp frpc.ini /etc/frp/

systemd文件:

vim /etc/systemd/system/frpc.service

[Unit]
Description=FRP Client Daemon
After=network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/bin/frpc -c /etc/frpc.ini
Restart=always
RestartSec=20s
User=nobody

[Install]
WantedBy=multi-user.target

根据实际需求修改就好了。

到这一步就完成了FRPS和FRPC的基本配置,已经可以通过systemd相关命令进行启动停止了:

systemctl start frps #启动
systemctl stop frps #停止
systemctl restart frps #重启
systemctl status frps #查看状态
systemctl enable frps #开机启动frp

systemctl start frpc
systemctl stop frpc
systemctl restart frpc
systemctl status frpc
systemctl enable frpc

FRPS配置

默认的frps.ini只有一个绑定端口配置,出于安全考虑,我们最好还是加个密码,如果需要,也可以开启一下Dashboard,所以,目前我的frps.ini配置如下:

[common]
bind_port = 3001

token = zocodev

dashboard_port = 3100
dashboard_user = zocodev
dashboard_pwd = zocodev

FRPC配置

上面说了,我使用FRP的目的就是想要使用公网的服务器进行内网穿透,所以,我需要配置FRPC将本地的SSH穿透到公网服务器上,完整配置如下:

[common]
server_addr = 111.231.1.1
server_port = 3001
token = zocodev

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

上方的remote_port就是我们“连接”SSH使用的端口。

利用FRP进行内网穿透

配置好之后,重启FRPS和FRPC,然后打开SSH连接工具,比如说我的公网IP为111.231.1.1,则相关命令就是:

ssh username@111.231.1.1 -p 3022

后面的-p参数就是刚在frpc.ini里面指定的remote_port参数,如果没意外的话,应该能正常通过公网服务器连接到内网的N1盒子了,截个图如下:
frp-internal-network-penetration.png

除了SSH之外,还能利用FRP进行很多操作,官方文档在这:https://github.com/fatedier/frp/blob/master/README_zh.md

文中systemd相关内容来自这里:https://gist.github.com/ihipop/4dc607caef7c874209521b10d18e35af

感谢相关开发者的付出和努力。