Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >利用frp工具实现内网穿透、随时随地访问内网服务

利用frp工具实现内网穿透、随时随地访问内网服务

作者头像
大刚测试开发实战
发布于 2023-01-18 07:03:23
发布于 2023-01-18 07:03:23
2.9K01
代码可运行
举报
运行总次数:1
代码可运行

前言

之前分享过一次《ZeroTier实现内网穿透、异地组网》,其基本工作原理是组建一个虚拟局域网,各个设备(NAS、LinuxWindows、Mac、iOSAndroid)安装了客户端、加入到这个虚拟局域网后,就会自动分配一个IP,从而实现局域网内各个设备及服务的相互访问。

而今天要介绍的内网穿透工具是frp,与ZeroTier不同的是,frp无需在各个终端设备上安装客户端,只需要在具有公网 IP 的节点上部署 frp 服务端,即可轻松地将内网服务穿透到公网,从而实现随时随地访问内网服务。

一、frp简介

1.frp是什么

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCPUDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

项目地址:https://github.com/fatedier/frp/releases 中文文档:https://gofrp.org/docs/overview/

2.为什么使用 frp ?

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
  • 代理组间的负载均衡
  • 端口复用,多个服务通过同一个服务端端口暴露。
  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
  • 服务端和客户端 UI 页面。

3.基本原理

基本工作原理如上图所示:

  • 在带有公网ip的云服务器上部署frp的服务端frps;
  • 在需要穿透的内网服务器上部署frp的客户端frpc;
  • 每个客户端都会有一个配置文件用于和服务器连接,不同的内网服务配置不同的端口号,例如内网服务器A上安装了jira服务,其端口是8080,内网服务器B上安装了Gitlab服务,其端口号是8081;
  • 用户通过访问公网ip+端口号,公网服务器此时就相当于代理服务器,上面部署的frps服务端会根据端口号,自动转发到对应的内网服务器上,从而访问到内网服务;

二、前置环境准备

服务端和客户端使用的都是同一份文件,只是配置文件和启动文件不同。因此只需要下载一份文件,将其上传到各个服务器即可。

1.下载解压

下载地址:

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

解压:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tar -xvf frp_0.44.0_linux_amd64.tar.gz  # 解压缩
mv frp_0.44.0_linux_amd64 frp  # 重命名文件夹为frp

2.目录解读

  • frpc:客户端可执行程序
  • frpc_full.ini:客户端所有配置项(可以在此文件查看frp的所有的配置项)
  • frpc.ini:客户端配置项
  • frps:服务端可执行程序
  • frps_full.ini:服务端所有配置项(可以在此文件查看frp的所有的配置项)
  • frps.ini:服务端配置项
  • LICENSE:许可证

三、服务端配置

服务端需部署在带有公网ip的服务器上,最好是云服务器。frp对于云服务器的配置要求不高,类似2C2G的入门级云服务器即可。而且目前各大厂商都在搞活动,入门级云服务器一年才50元左右。

1.配置服务端

为避免误操作,可以删除客户端相关的文件及配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rm -fr frpc*  # 删除所有客户端相关的文件及配置
cp frpc.ini frpc.ini.bak  # 备份原始配置文件

编辑配置文件:frps.ini

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
# 授权码,请改成更复杂的,这个token之后在客户端会用到
token = e10adc3949ba59abbe56e057f20f883e
# 开启HTTP
#vhost_http_port = 8088
# 去除TCP速度限制
tcp_mux = false

# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = admin
dashboard_pwd = admin123456
enable_prometheus = true

# frp日志配置
log_file = /home/frp/frp/frps.log
log_level = info
log_max_days = 3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./frps -c frps.ini  # 启动服务端

2.开通安全组

若公网服务器是在阿里云、百度云等云服务器上的,则需要在安全组中为frp开通指定的端口号,如:7000是frp服务默认端口号、7500是在frps.ini配置文件中指定的dashboard_port、其他的则是需要映射到内网服务器的端口

3.访问dashboard

访问地址:http://180.xxx.xxx.xxx:7500

账号密码:admin、admin123456(对应配置文件中的dashboard_user与dashboard_pwd)

4.将frps添加为本地服务(可选)

也可以将frps添加为本地服务,具体步骤如下:

① 服务端新建文件:frps.service

内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/home/frp/frp/frps -c /home/frp/frp/frps.ini

[Install]
WantedBy=multi-user.target
② 创建配置文件目录并复制文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p /etc/frp
cp frps.ini /etc/frp/
cp frps /usr/bin/
cp frps.service /usr/lib/systemd/system/
③ 配置自并启动客户端服务
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
systemctl enable frps  # 允许自启动
# 执行成功会提示“Created symlink /etc/systemd/system/multi-user.target.wants/frps.service → /usr/lib/systemd/system/frps.service.”
systemctl start frps  # 启动客户端服务

若更改了frps.service,则需使用“systemctl daemon-reload”命令重新加载配置。

三、客户端配置

1.编辑客户端配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[common]
server_addr = 180.xxx.xxx.xxx  # 服务端所在的公网ip地址
server_port = 7000  # 服务端默认端口号,与服务端配置文件保持一致
token = e10adc3949ba59abbe56e057f20f883e
# 去掉速度限制
tcp_mux = false

[jira]
type = tcp # 注意:这个地方一律填写tcp
local_ip = 192.168.1.211  # jira所在内网服务器的ip地址
local_port = 8088 # 本地访问端口号
remote_port = 8088 # 映射到云服务器的端口号

[gitlab]
type = tcp # 注意:这个地方一律填写tcp
local_ip = 192.168.1.211  # gitlab所在内网服务器的ip地址
local_port = 8081 # 本地访问端口号
remote_port = 8081 # 映射到云服务器的端口号

2.启动客户端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./frpc -c frpc.ini # 启动客户端

3.云服务器安全组添加端口号

安全组中添加remote_port端口号

4.访问HTTP服务

此时则可以通过公网IP+内网端口访问指定服务,如下图所示,访问的是内网服务器的jira服务。

5.查看dashboard连接记录

客户端启动成功,通过代理访问后,可以看到dashboard的Proxies-TCP中记录了连接信息:

6.将frpc服务加为本地服务(可选)

① 客户端新建文件:frpc.service

内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/home/frp/frpc -c /home/frp/frpc.ini

[Install]
WantedBy=multi-user.target
② 创建配置文件目录并复制文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p /etc/frp
cp frpc.ini /etc/frp/
cp frpc /usr/bin/
cp frpc.service /usr/lib/systemd/system/
③ 配置自并启动客户端服务
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
systemctl enable frpc  # 允许自启动
# 执行成功会提示“Created symlink from /etc/systemd/system/multi-user.target.wants/frpc.service to /usr/lib/systemd/system/frpc.service.”
systemctl start frpc  # 启动客户端服务

若更改了frps.service,则需使用“systemctl daemon-reload”命令重新加载配置。

四、常见问题及解决

1.客户端配置http转发启动服务报错

若在客户端配置文件中配置了http转发,启动客户端服务时发生如下报错:

【原因】:服务端配置文件frps.ini中未配置vhost_http_port

【解决办法】:

① 服务端配置文件frps.ini的[common]中添加vhost_http_port

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
# 授权码,请改成更复杂的,这个token之后在客户端会用到
token = e10adc3949ba59abbe56e057f20f883e
# 开启HTTP
vhost_http_port = 8088

② 客户端配置文件frpc.ini中添加custom_domains

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[web]
type = http
local_ip = 192.168.1.211  # 内网本机ip
local_port = 8088  # 本地服务端口号
remote_port = 8088  # 映射到的公网服务器端口号
custom_domains = 服务端所在的公网ip

③ 配置后重新启动客户端服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./frpc -c frpc.ini

注意事项:

1、若要直接在客户端配置文件中配置http代理,则服务端配置文件frps.ini中必须配置vhost_http_port;

2、若在客户端配置文件中配置http代理:type = http,则必须在底部带上custom_domains=xxx.xxx.xx.xx;

2.配置代理多HTTP

上述问题1的配置方法,似乎只能代理访问一个端口的http,即使客户端配置文件frpc.ini中指定了多个type=http的 [web] 项,但因为服务端配置文件frps.ini中只能指定一个vhost_http_port=xxx,所以此方法最终还是只能代理访问一个http的服务,即vhost_http_port端口号对应的那个http。

【解决方法】:

服务端配置文件frps.ini中不需要配置vhost_http_port,直接在客户端配置文件frpc.ini中配置多个 [web] 项,即要代理的HTTP即可,其中type=tcp,也不用指定custom_domains。配置示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[common]
server_addr = 180.xx.xx.xx
server_port = 7000
token = e10adc3949ba59abbe56e057f20f883e
# 去掉速度限制
tcp_mux = false

[jira]
type = tcp
local_ip = 192.168.1.211
local_port = 8088
remote_port = 8088

[gitlab]
type = tcp
local_ip = 192.168.1.211
local_port = 8081
remote_port = 8081

小结

以上就是利用frp实现内网穿透的全过程,相比于之前介绍过的zerotier,frp无需在各个访问端上安装客户端,只需在公网服务器上安装服务端,在需要被代理转发的内网服务器上安装客户端,并配置好各个服务的端口号,其他所有用户即可在手机、PC、平板上随时随地访问内网服务。

另外,网络安全同样需要关注。由于内网穿透服务带有一定风险,因此无论是公网服务器还是内网服务器,最好都开启防火墙,用到哪个端口再放开哪个端口,服务器的密码最好也设置得复杂一些。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试开发实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
快速上手docker-java,示例全网最全,带你踩坑,带你飞
刚入项目组,就开始用dokcer-java去干活了,由于之前没接触过,所以就开始全网找资料,于是乎,找了一堆博客,好像都差不多,虽然都能跑起来,但是我的需求并没有得以实现:
AI码师
2022/09/19
4.2K1
快速上手docker-java,示例全网最全,带你踩坑,带你飞
Linux开启Docker远程访问并设置安全访问(证书密钥),附一份小白一键设置脚本哦!
找到 Service节点,修改ExecStart属性,增加 -H tcp://0.0.0.0:2375
JanYork_简昀
2023/02/02
4.4K0
Linux开启Docker远程访问并设置安全访问(证书密钥),附一份小白一键设置脚本哦!
Docker 远程连接 -- dockerd 命令详解
配置 TLS 实现安全的 Docker 远程连接。 GitHub:https://github.com/khs1994-docker/dockerd-tls 本机:macOS 远程机:使用 VirtualBox 虚拟 CoreOS (IP 192.168.57.110) 目标:能在 macOS 远程操作 CoreOS。(注意不是 SSH 远程登录)。dockerd 命令仅能在 Linux 下使用。 官方文档:https://docs.docker.com/edge/engine/reference/comm
康怀帅
2018/02/28
24.5K2
docker remote api 加密
1. 设置主机名 编辑/etc/hostname,服务器主机名 zouyujie.top
用户9347382
2022/01/10
5880
centos7/6.9 docker-ce-17/1.7.1使用证书登陆(openssl tls)
出现 Error response from daemon: client is newer than server (client API version: 1.24, server API version: 1.19)
全栈程序员站长
2021/05/19
2760
Docker启用TLS进行安全配置
之前开启了docker的2375 Remote API,接到公司安全部门的要求,需要启用授权,翻了下官方文档
JadePeng
2019/08/14
8770
TLS加密远程连接Docker
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
程序员欣宸
2019/09/18
2.2K0
TLS加密远程连接Docker
04. Idea集成Docker
上一节中,我们介绍了Dockerfile的方式构建自己的镜像。但是在实际开发过程中,一般都会和开发工具直接集成,如Idea。今天就介绍下idea和Docker如何集成。
有一只柴犬
2023/08/24
5000
04. Idea集成Docker
docker开放2375端口,并添加安全传输层协议(TLS)和CA认证
为了更便捷地打包和部署,服务器需要开放2375端口才能连接docker,但如果开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵、挖矿、CPU飙升这些情况都有发生,任何知道你IP的人,都可以管理这台主机上的容器和镜像,非常不安全。
全栈程序员站长
2022/09/07
2.2K0
docker开放2375端口,并添加安全传输层协议(TLS)和CA认证
Docker开启远程安全访问
找到 Service 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375
niceyoo
2020/07/09
9.8K0
这就是你日日夜夜想要的docker!!!---------TLS加密远程连接Docker
作为一款应用 Docker 本身实现上会有代码缺陷。CVE官方记录 Docker 历史版本共有超过20项漏洞。 黑客常用的攻击手段主要有代码执行、权限提升、信息泄露、权限绕过等。目前 Docker版本更迭非常快,Docker 用户最好将 Docker 升级为最新版本。
不吃小白菜
2020/09/28
7790
这就是你日日夜夜想要的docker!!!---------TLS加密远程连接Docker
在Ubuntu16.10上开启docker17.03.0-ce的https认证
$ openssl genrsa -aes256 -out ca-key.pem 4096
cn華少
2018/09/11
3530
Docker开启TLS和CA认证
前言:Docker直接开启2375端口是不安全的,别人只要连上之后就可以任意操作,下面是开启Docker的TLS和CA认证方法,并使用Jenkins和Portainer连接。 一、生成证书 查看服务器主机名 hostname [image-20210826174816658] 安装生成证书软件 yum install -y openssl [image-20210827003357785] 编写一键启动脚本 auto-generate-docker-tls-ca.sh # !/bin/bash # 一键生
小强崽
2022/05/20
1.6K0
docker开启api访问,配置双向证书验证
Docker是一种容器化技术,可通过容器化技术提供的API进行访问和管理。您可以通过配置Docker API来开启对Docker API的访问,并使用双向证书验证确保通信的安全性。以下是配置Docker API以开启访问和双向证书验证的步骤:
堕落飞鸟
2023/03/31
1.7K0
harbor搭建企业docker私有镜像仓库
# curl -fsSL https://get.docker.com/ | sh
聂伟星
2020/07/12
2.6K0
为GRPC证书加入双向证书认证如此简单
上一篇文章我们讲解了怎么给 GRPC 配置添加单向证书认证,这一篇我接着分享,如何让 GRPC 服务加入双向证书认证。
小锟哥哥
2022/05/10
1.8K0
为GRPC证书加入双向证书认证如此简单
Docker服务开放了这个端口,服务器分分钟变肉机!
Docker为了实现集群管理,提供了远程管理的端口。Docker Daemon作为守护进程运行在后台,可以执行发送到管理端口上的Docker命令。
macrozheng
2020/08/13
1.5K0
Golang(十一)TLS 相关知识(二)OpenSSL 生成证书
0. 前言 接前一篇文章,上篇文章我们介绍了数字签名、数字证书等基本概念和原理 本篇我们尝试自己生成证书 参考文献:TLS完全指南(二):OpenSSL操作指南 1. OpenSSL 简介 OpenSSL 是一个开源项目,其组成主要包括三个组件: openssl:多用途的命令行工具 libcrypto:加密算法库 libssl:加密模块应用库,实现了ssl及tls OpenSSL 主要用于秘钥证书管理、对称加密和非对称加密 1.1 指令 常用指令包括:genrsa、req、x509 1.1.1 genrs
西凉风雷
2022/11/23
2.3K0
https原理以及golang基本实现
大致上分为两类,基于key的加密算法与不基于key的加密算法。现在的算法基本都是基于key的,key就以一串随机数数,更换了key之后,算法还可以继续使用。
我的小碗汤
2018/08/22
9310
docker基础:私库系列:再探Harbor:(4) https方式的私库管理
在前面的介绍中,缺省使用了http的方式,而考虑安全的角度,容器的仓库在生产环境中往往被设定为https的方式,而harbor将这些证书的创建和设定都进行了简单的集成,这篇文章来看一下在harbor下如何使用https的方式。
全栈程序员站长
2022/09/09
2930
推荐阅读
相关推荐
快速上手docker-java,示例全网最全,带你踩坑,带你飞
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验