frp实现内网穿透访问内网多台Linux服务器
本文主要记录笔者在使用frp实现内网穿透访问内网多台Linux服务器的全过程,包括公网服务器的配置、frp服务端、客户端的下载与配置,以及配置systmctl来实现系统级启停frp,并记录我遇到的一些问题。希望对大家有所帮助。
一、准备一台公网服务器
笔者申请的是一台腾讯云服务器。
1、打开安全组相关端口
-
路径:控制台->安全组->修改规则->添加规则
-
来源:0.0.0.0/0
-
协议端口:
TCP:7000
TCP:6000
TCP:6001
TCP:6002
- 策略:允许
注意:入站和出站均需添加。
2、打开防火墙
# 启用
sudo ufw enable
# 开放端口
sudo ufw allow 7000
sudo ufw allow 6000
sudo ufw allow 6001
sudo ufw allow 6002
# 查看状态
sudo ufw status
二、下载frp
分别下载frp到公网服务器和内网服务器:
wget https://github.com/fatedier/frp/releases/download/v0.35.1/frp_0.35.1_linux_amd64.tar.gz
然后解压到/usr/local
路径下
mkdir /usr/local/frp_0.35.1
tar -zxvf frp_0.35.1_linux_amd64.tar.gz -C /usr/local/frp_0.35.1 --strip-components 1
解压后路径/usr/local/frp_0.35.1
内容如下
frpc frpc_full.ini frpc.ini frps frps_full.ini frps.ini LICENSE systemd
ps:--strip-components 1
表示跳过第一层目录进行解压
三、配置公网服务器(frps:frp服务端)
修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口:
vim /usr/local/frp_0.35.1/frps.ini
[common]
bind_port = 7000 # 这个是公网服务器的端口,我购买的是tecent云的服务器,其安全策略里面得设置开放此端口
四、配置内网服务器(frpc:frp客户端)
在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署 frpc,修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x
且由于有三台内网机器同时以同一台公网机器作为跳板机,所以这三台内网机器的client名称需要不同,即frpc.ini
中的[ssh]
需要分别设置为[ssh1]
、[ssh2]
、[ssh3]
,以示区分。
且这里三台服务器的remote_port
分别配置为6000
、6001
、6002
。否则会出现端口被占用,导致无法正常连接到内网机器的情况。
内网机器1:
vim /usr/local/frp_0.35.1/frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000 # 在公网开放的端口
[ssh1] # 这里是client的一个别名,命名为ssh1以和其他client区分
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000 # 这个是公网服务器的端口,安全策略里面也得设置开放此端口
内网机器2:
vim /usr/local/frp_0.35.1/frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000 # 在公网开放的端口
[ssh2] # 这里是client的一个别名,命名为ssh1以和其他client区分
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6001 # 该端口需与其他内网机器所配置的端口不同
内网机器3:
vim /usr/local/frp_0.35.1/frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000 # 在公网开放的端口
[ssh3] # 这里是client的一个别名,命名为ssh1以和其他client区分
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6002 # 该端口需与其他内网机器所配置的端口不同
local_ip
和local_port
配置为本地需要暴露到公网的服务地址和端口。remote_port
表示在 frp 服务端
监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。
五、分别启动内网公网服务器FRP
1、在公网服务器上启动frps服务端
为了方便调试,我们先启动终端版:
cd /usr/local/frp_0.35.1/
./frps -c ./frps.ini
nohup ./frps -c ./frps.ini &
# 链接成功会出现如下内容
# 2021/02/04 00:09:17 [I] [root.go:108] frps uses config file: ./frps.ini
# 2021/02/04 00:09:17 [I] [service.go:190] frps tcp listen on 0.0.0.0:7000
# 2021/02/04 00:09:17 [I] [root.go:217] frps started successfully
生产使用中可使用如下命令在后台运行:
nohup ./frps -c ./frps.ini > /dev/null 2>&1 &
2、在内网服务器中启动frpc客户端:
公网服务器启动成功后,在内网服务器中启动frpc,为了方便调试,我们一样启动终端版:
cd /usr/local/frp_0.35.1/
./frpc -c ./frpc.ini
nohup ./frpc -c ./frpc.ini &
# 链接成功会出现如下内容
# 2021/02/04 00:11:47 [I] [service.go:290] [64276cca09e4f64c] login to server success, get run id [64276cca09e4f64c], server udp port [0]
# 2021/02/04 00:11:47 [I] [proxy_manager.go:144] [64276cca09e4f64c] proxy added: [ssh]
# 2021/02/04 00:11:48 [I] [control.go:180] [64276cca09e4f64c] [ssh] start proxy success
生产使用中可使用如下命令在后台运行:
nohup ./frpc -c ./frpc.ini > /dev/null 2>&1 &
六、ssh登录服务器
如果配置成功,在进入本地服务器就相对容易了:
# 标准的ssh命令如下
ssh -p 600x root@xx.xx.xx.xx(公网IP)
# XShell支持的ssh命令不标准,应该通过如下命令连接,这个命令才会弹出让你保存密钥的浮窗:
ssh root@xx.xx.xx.xx(公网IP) 6000
也可以配置XShell的连接如下
七、关闭frp进程
这里以frp客户端为例,frp服务端同理。
1、找到frp进程
ps -aux|grep frp| grep -v grep
root 3600 0.1 0.1 110188 9484 pts/0 Sl 15:04 0:00 ./frpc -c ./frpc.ini
进程号是3600
2、kill该进程
# 命令格式:kill -9 <pid>
kill -9 3600
八、配置systemctl来控制frps
1、创建frps.service
sudo vim /lib/systemd/system/frps.service
2、在frps.service里添加以下内容
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/usr/local/frp_0.35.1/frps -c /usr/local/frp_0.35.1/frps.ini
[Install]
WantedBy=multi-user.target
注意"ExecStart="之后的路径要填写你的frps安装路径(本文以安装到/usr/local/为例)
3、使用systemctl命令来控制frps
启动frps
sudo systemctl start frps
服务器开机自动启动frps
sudo systemctl enable frps
重启frps
sudo systemctl restart frps
停止frps
sudo systemctl stop frps
查看日志
sudo systemctl status frps
如下图所示,已可以通过systemctl来启动并查看frps的状态
frpc的systemctl配置同理,具体如下小节所示。
九、配置systemctl来控制frpc
1、创建frpc.service
sudo vim /lib/systemd/system/frpc.service
2、在frpc.service里添加以下内容
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/usr/local/frp_0.35.1/frpc -c /usr/local/frp_0.35.1/frpc.ini
[Install]
WantedBy=multi-user.target
注意"ExecStart="之后的路径要填写你的frpc安装路径(本文以安装到/usr/local/为例)
3、使用systemctl命令来控制frpc
启动frpc
sudo systemctl start frpc
服务器开机自动启动frps
sudo systemctl enable frpc
重启frps
sudo systemctl restart frpc
停止frps
sudo systemctl stop frpc
查看日志
sudo systemctl status frpc
十、常见问题
如果连接不上,建议在命令行启动frp服务端、客户端后观察终端的输出,对报错、警告进行逐一分析。
1、token不匹配
[root@localhost frp_0.33.0_linux_amd64]# ./frpc -c ./frpc.ini
2020/06/24 15:35:02 [E] [service.go:273] token in login doesn't match token from configuration
2020/06/24 15:35:02 [W] [service.go:101] login to server failed: token in login doesn't match token from configuration
token in login doesn't match token from configuration
解决办法:
(1) 删除或注释掉frp客户端的frpc.ini文件中的token = 12345678
(2) 重启frp客户端
2、[ssh]名被占用
proxy name [ssh] is already in use
解决办法:
frp客户端的frpc.ini
文件中的[ssh]
修改为[ssh1]
或其他你想要的命名,这只是一个别名而已,所以怎么命名都ok。
参考
[1]frp官方文档[https://gofrp.org/docs]
[2]Linux服务器所以Frp实现内网穿透(阿里云Ubuntu)[https://www.cnblogs.com/xlchan/p/13643231.html]:主要参考其整体方案
[3]frp后台运行和停止[https://blog.csdn.net/weixin_34244102/article/details/88677915]:主要参考xshell如何ssh命令行连接
[4]0001_20190327_使用frp搭建内网穿透[https://www.cnblogs.com/wxylog/p/10611632.html]:主要参考其token不匹配的解决方案
[5]frp -- proxy name [ssh] is already in use[https://blog.csdn.net/weixin_33840661/article/details/85948513]:主要参考其[ssh]被占用的解决方案
[6]阿里云服务器实现 FRP 内网穿透[https://www.freesion.com/article/776471384/]:主要参考其多客户端配置
[7]Linux安装配置Frp内网穿透教程[https://www.tok9.com/archives/488/]:主要参考其systemctl配置