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配置
frp实现内网穿透访问内网多台Linux服务器的更多相关文章
- frp 内网穿透访问内网Web服务
ps:最近想要通过域名(公网)访问或者测试在本地搭建的 web 服务(不想在公网IP服务器上再部署个服务,也不想通过teamview等工具远程卡到爆!), 由于本地机器没有公网 IP,无法将域名解析到 ...
- nat123外网SSH访问内网LINUX的N种方法
一,动态公网IP环境 1,环境描述: 路由器分配的是动态公网IP,且有路由管理权限,LINUX主机部署在路由内网.如何实现外网SSH访问内网LINUX主机? 2,解决方案: 使用nat123动态域名解 ...
- 使用Holer外网SSH访问内网(局域网)Linux系统
1. Holer工具简介 Holer exposes local servers behind NATs and firewalls to the public internet over secur ...
- 外网SSH访问内网LINUX的N种方法
外网SSH访问内网LINUX的N种方法 http://www.nat123.com/Pages_8_260.jsp 一,动态公网IP环境 1,环境描述: 路由器分配的是动态公网IP,且有路由管理权限, ...
- 内网gitlab访问外网
外网要访问内网,内网出口必须有公网ip,且外网访问内部网络可以用花生壳,可以用主机端口映射 写ansible调api,打通内网到阿里云的master节点 如何将公司内网与云服务器内网打通 参照 ...
- 内网穿透访问Vue项目的时候出现Invalid Host header解决办法
适用场景: 在本地的Vue-cli3项目, 需要其他人浏览. 如果没有外网的服务器, 可以把自己的电脑当做服务器. 这时候需要外网的人能访问到自己的电脑. Mac内网穿透工具:natapp Inval ...
- 通过外网IP访问内网
外网服务器:外网IP1,内网IP192.168.2.156 内网服务器:内网IP192.168.2.206 通过访问外网服务器8083端口,转发到内网服务器的8083端口. 在外网服务器设置映射规则: ...
- VMware NAT端口映射 外网可以访问内网虚拟机
我想尝试的是利用本机的ip+port来访问虚拟机上的web服务器,因为这样的话,我就能够将我的web服务器部署成为一个能让外网访问的服务器了,首先说下我的环境: 主机:系统win7,ip地址172.1 ...
- iptables 实现centos内网机器访问外网
环境:一台带外网和内网的机器,另一台只有内网,默认不能上网.两台机器都是centos系统带外网机器的外网ip为 123.221.20.11, 内网ip为 192.168.15.100内网机器的内网ip ...
- linux内网机器访问外网代理设置squid
公司一般出于安全考虑, 在同一局域网中只有一台机器可以访问外网,运维进行了整体的限制, 但是在后面的工作中,需要在机器上安装一些软件,及命令,所以其他的机器需要访问外网来简化工作, 但又不能打乱原有运 ...
随机推荐
- winform 实现太阳,地球,月球 运作规律https://www.cnblogs.com/axing/p/18762710
无图眼吊(动图) 缘由 最近我太太在考公学习,给我出了两道高中地理知识的题目,把我问的一头雾水,题目是这样的 第一题 第二题 看到这两道题,当时大脑飞速运转,差点整个身体都在自转了,所以产生了个 ...
- 【BUG】axios 长数字精度丢失问题
问题原因 出现改问题是于javascript 整数范围问题 java 中 Long 类型 -2的63次方 - 2的63次方减去1 但是javascript整数范围确没有那么大,导致Long数字过大前端 ...
- CDH6.3.2下安装部署Qualitis数据质量分析的计算服务Linkis1.3.2
快速搭建Qualitis手册 一.基础软件安装 Gradle (4.6) MySQL (5.5+) JDK (1.8.0_141) Linkis(1.0.0+), 必装Spark引擎.如何安装Link ...
- 性能优化之使用HTTP2.0
HTTP2.0 的优势 配置 测试 怎么查看当前网站http版本 chrome HTTP协议版本检测 Chrome 控制台 window.chrome.loadTimes() { commitLoad ...
- Linux性能分析-CPU上下文切换
前言 在Linux性能分析-平均负载中,提到过一种导致平均负载升高的情况,就是有大量进程或线程等待cpu调度. 为什么大量进程或者线程等待CPU调度会导致负载升高呢? 当大量进程或者线程等待调度时,c ...
- DevExpress汉化
//ini 汉化文件的使用方法: var cxLocalizer1: TcxLocalizer; begin cxLocalizer1.FileName := '你的路径\DevChs.ini'; c ...
- [T.2] 团队项目:选题和需求分析
项目 内容 这个作业属于哪个课程 2025年春季软件工程(罗杰.任健) 这个作业的要求在哪里 T.2团队项目:选题和需求分析 团队在这个课程的目标是 学习软件工程相关知识,培养编程和团队协作能力,做出 ...
- AI时代:本地运行大模型ollama
https://ollama.com/ 使用 Llama 2.Mistral.Gemma 和其他大型语言模型启动和运行. 支持windows,Linux,Mac. 支持的开源模型列表: Ollama ...
- DevSecOps的实现与相关开源工具
DevSecOps的实现与相关开源工具 DevSecOps是一种以自动化方式在DevOps流程中集成安全工具的方法.DevSecOps不仅仅是引入新的安全工具,还包括关于使用这些工具的必要知识.这需要 ...
- 卸载重装vscode
最近工作需要长期用到python,但我的老电脑又实在拉不起pycharm那配置,干脆就用vscode了,但本来我的vscode是用来写c/c++的,安装配置一通乱搞,现在也不知道怎么配置回来了. 干脆 ...