😊你好,我是小航,一个正在变秃、变强的文艺倾年。
🔔本文讲解动手自己搭建内网穿透,期待与你一同探索、学习、进步,一起卷起来叭!
目录
- 一、前言
- 内网穿透是什么?
- frp介绍:
- 工作原理:
- 代理:
- 代理类型:
- 二、部署
- 服务端:
- 客户端:
一、前言
内网穿透是什么?
💭内网穿透是我们在进行网络连接时的一种术语,也叫做NAT穿透
,即在计算机是局域网内的时候,外网与内网的计算机的节点进行连接时所需要的连接通信,有时候就会出现内网穿透不支的情况。内网穿透的功能就是,当我们在端口映射时设置时,内网穿透起到了地址转换的功能,也就是把公网的地址进行翻译,转成为一种私有的地址,然后再采用路由的方式ADSL的宽带路由器,具有一个动态或者是固定的公网IP,最后ADSL直接在 交换机上,这样所有的电脑都可以共享上网
。内网穿透除了可以实现内网之间机器的网络通信功通之外,还可以解决UDP中出现的数据传输不稳定问题。
简单说,就是A客户端要访问B客户端,通过一台服务器进行桥接,桥接有两种方式,一种是相互转发,另一个是告诉对方的地址,自己就当一个介绍人的角色。
小明的电脑和张三家里的电脑分别处在两个不同的局域网内,如果小明想访问张三家电脑的资源,这时就需要运用到内网穿透。借助frp端口映射技术进行内网穿透
张三在家办公想用家里的电脑,访问公司的电脑资源,这时也可以借助frp工具进行内网穿透进行实现
总结:在一个可以访问互联网的设备上,访问一个内网中的资源。
frp介绍:
frp 是一个用Go语言
开发的,可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 、 http 和 https。可将一个部署在本机的web服务映射到外网。
🚩 官方文档:https://github.com/fatedier/frp/
工作原理:
frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)
。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。
由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。
具体工作流程如下:
- 服务端运行,监听一个主端口,等待客户端的连接;
- 客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;
- 服务端fork新的进程监听客户端指定的端口;
- 外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;
- 客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。
代理:
在 frp 中,一个代理对应一个需要公开访问的内网服务。一个客户端可以同时配置多个代理,以满足不同的需求。
代理类型:
frp 支持多种代理类型,以适应不同的使用场景。以下是一些常见的代理类型:
- TCP:提供纯粹的 TCP 端口映射,使服务端能够根据不同的端口将请求路由到不同的内网服务。
- UDP:提供纯粹的 UDP 端口映射,与 TCP 代理类似,但用于 UDP 流量。
- HTTP:专为 HTTP 应用设计,支持修改 Host Header 和增加鉴权等额外功能。
- HTTPS:类似于 HTTP 代理,但专门用于处理 HTTPS 流量。
- STCP:提供安全的 TCP 内网代理,要求在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
- SUDP:提供安全的 UDP 内网代理,与 STCP 类似,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
- XTCP:点对点内网穿透代理,与 STCP 类似,但流量不需要经过服务器中转。
- TCPMUX:支持服务端 TCP 端口的多路复用,允许通过同一端口访问不同的内网服务。
每种代理类型适用于不同的使用情境,可以根据需求选择合适的代理类型来配置 frp。
二、部署
💭 准备条件:
- 云服务器或具有公网IP的服务器,用于安装frp服务端(frps),推荐开启端口:
7000-7015、7500
- 需要内网穿透的服务器,如树莓派,将安装frp客户端(frpc),推荐开启端口:
7000,7400,额外的端口号
- 上述1和2的服务器均安装好
Docker
服务端:
mkdir -p /data/frp
vim /data/frp/frps.ini
[common]
# 服务器开放给客户端的frp端口
bind_port = 7000
# http端口
vhost_http_port = 7010
# https端口
vhost_https_port = 7011
# 控制面板端口,用户名,密码
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin123456
# 自己用于frp服务的域名或者ip地址
subdomain_host = xxxxxxxx
# frps服务token,拥有此token的客户端才允许连接
token = ipbd
docker pull snowdreamtech/frps
docker run --restart=always --network host -d -v /data/frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps
访问服务器IP:7500,输入账号密码,就可以看到dashboard页面了
客户端:
Linux端:
mkdir -p /data/frp
vim /data/frp/frpc.ini
[common]
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin123456
# 打开浏览器通过 http://127.0.0.1:7400 访问 Admin UI
# frps服务器地址,可用域名,即服务端的域名或者ip
server_addr = XXX.XXX.XXX.XXX
server_port = 7000
token = ipbd
[admin_ui]
type = tcp
local_port = 7400
remote_port = 7400
# 推荐协议使用TCP
[tcp]
type = tcp
local_ip = 127.0.0.1
# 本地端口号
local_port = 8000
# 远程端口号
remote_port = 7001
# [web]
# type = http
# local_port = 8000
# custom_domains = XXXX
docker pull snowdreamtech/frpc
docker run --restart=always --network host -itd -v /data/frp/frpc.ini:/etc/frp/frpc.ini --name frpc snowdreamtech/frpc
连接成功:
本地服务测试:
docker run --name testNginx -d -p 8000:80 nginx
远程服务测试:
测试成功!
📌 [ 笔者 ] 文艺倾年
📃 [ 更新 ] 2024.5.12
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,
本人也很想知道这些错误,恳望读者批评指正!