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
公司一般出于安全考虑, 在同一局域网中只有一台机器可以访问外网,运维进行了整体的限制, 但是在后面的工作中,需要在机器上安装一些软件,及命令,所以其他的机器需要访问外网来简化工作, 但又不能打乱原有运 ...
随机推荐
- 多智能体粒子环境(Multi-Agent Particle Env)食用指南--从入门到入土
0.项目地址: 原地址:openai/multiagent-particle-envs: Code for a multi-agent particle environment used in the ...
- FastAPI复杂查询终极指南:告别if-else的现代化过滤架构
title: FastAPI复杂查询终极指南:告别if-else的现代化过滤架构 date: 2025/3/14 updated: 2025/3/14 author: cmdragon excerpt ...
- 五大股票金融数据API接口推荐:从实时行情到历史数据全覆盖
摘要:本文将介绍五大主流的股票金融数据API接口,涵盖实时行情.历史数据.技术指标等功能,帮助开发者快速构建金融数据应用.(本文由deepseek生成) 一.StockTV API 1. 核心优势 全 ...
- Kubernetes v1.16.3版本开启 Job ttlSecondsAfterFinished 自动清理机制
前言 Kubernetes v1.23 之前,Job 在处于 Completed 后,默认是不会被清理的. 完成的 Job 通常不需要留存在系统中.在系统中一直保留它们会给 API 服务器带来额外的压 ...
- boot3+JDK17+spring-cloud-gateway:4.0.0+spring-cloud:2022.0.0.0+Nacos2.2.1配置动态路由的网关
项目依赖 配置 # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html # Nacos认证信息 spring.cloud.nacos.config ...
- Oracle return exit continue
常在循环体中看到下面3种语句: return exit continue 举例说明 啥都没有 -- none begin for i in 1 .. 10 loop if i < 5 then ...
- 跨网段和局域网的SQL SERVER发布订阅配置图解和常见问题
非常详细,傻瓜式依葫芦画瓢即可. 特别提示:订阅机器上的防火墙以及发布机器远程登录订阅机的问题 通过非命令行方式配置同步订阅 (1)实验环境说明 (2)实验前准备 (3)订阅设置 (4)测试同步订阅 ...
- Jenkins持续集成 docker、gitlab、sonar
Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenkins可以用于一些测试和部署技术.Jenki ...
- AnnotationAwareAspectJAutoProxyCreator后置处理器的BeanDefinition定义信息导入和其对象实例创建过程
步骤1 我们从配置类上的@EnableAspectJAutoProxy 注解入手,进入发现这个注解上又有一个@Import(AspectJAutoProxyRegistrar.class)注解, 了解 ...
- AI浏览器自动化实战
只需一句话,AI 即可自动操作浏览器: 搜索商品: 下单支付: 甚至还能进行深度研究(Deep Research),自动生成完整的攻略报告: Browser use 是一个开源项目,使 AI 大模型能 ...