内网穿透之FRP

内网穿透简介

互联网上两个不同的主机进行通信首先需要知道对方 IP。根据 IP 协议,只有分配了公网IP的设备才能在互联网上通信和传输数据。而中国人口/设备众多,分配到的IPv4资源又少,因此绝大部分情况是通过路由器/交换机转换公网IP后才上网。

位于路由器/交换机后的设备一般是内网设备,分配的IP地址以 192.168/172.16/10.0 开头,属于内网 IP。要让内网设备对外提供服务,就需要进行内网穿透。

常见穿透工具包括:FRP, ZeroTier 等,本文仅介绍 FRP 的使用。


FRP 简介

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

基本原理:

  • 在带有公网 ip 的云服务器上部署 frp 的服务端 frps
  • 在需要穿透的内网服务器上部署 frp 的客户端 frpc
  • 每个客户端都会有一个配置文件用于和服务器连接
  • 公网服务器充当代理服务器,用户访问 公网ip + 端口时,公网服务器的 frps 服务会根据端口号,自动转发到对应的内网服务器上,从而访问到内网服务

FRP 配置及使用

下载 FRP

服务端和客户端使用的都是同一份文件,只是配置文件和启动文件不同。因此只需要下载一份文件,并按类型分成两份。

下载地址:https://github.com/fatedier/frp/releases

服务器是 x86_64 架构,因此下载 linux_amd64 版本

通过命令行下载并解压:

wget -c https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_amd64.tar.gz
tar -xvf frp_0.53.2_linux_amd64.tar.gz
mv frp_0.53.2_linux_amd64 frp

查看目录:

.
├── frpc
├── frpc_full.ini
├── frpc.ini
├── frps
├── frps_full.ini
├── frps.ini
└── LICENSE

这些文件分成两部分。

  1. 客户端,也即内网的服务器,需要 frpc 和 frpc.ini
  2. 服务端,也即公网的服务器,需要 frps 和 frps.ini
  3. 剩下的两个文件用于查看支持的所有配置项,可以不用管

将两类文件分别打包

mkdir client server
mv frpc* client
mv frps* server

服务端配置

server 目录上传到公网服务器任意路径。如果需要自动启动,看下一节。如下编辑 frps.ini,参数见注释。

[common]
# frp监听的端口,默认是7000,可修改
bind_port = 7000

# frp面板端口、用户名和密码,请改成更复杂的。
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin123456

# 授权码,请改成更复杂的,这个token之后在客户端会用到
token = e10adc3949ba59abbe56e057f20f883e

# 设置HTTP及https协议下代理端口(非重要)
# vhost_http_port = 7080
# vhost_https_port = 7081

# 去除TCP速度限制
tcp_mux = false

# enable_prometheus = true

# frp日志配置
log_file = /home/frp/frp/frps.log
log_level = info
log_max_days = 3

其中授权码可以用 pwgen 命令来生成,这个授权码之后在客户端还会用到。

sudo apt install pwgen -y
pwgen -s 32 1

运行服务:

./frps -c frps.ini

记得防火墙打开云服务器的7500端口和其他所有提到的端口,这些端口可以用’,'分割,在一个规则中同时打开。然后网页输入公网IP:7500,输入设置的账户和密码,登录后即可看到 frp 的状态。

服务端自启动(可选)

把 frps 添加为系统服务,这一来当系统重启时,Frps 服务会自动启动,并且不需要手动再次启动。

frps, frps.ini 文件放到系统目录下,比如

sudo mv frps /usr/bin/ # frps 可执行文件
sudo mkdir /etc/frp
sudo mv frps.ini /etc/frp/ # 配置文件

然后新建文件:frps.service,内容如下:

[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy=multi-user.target

这里 ExecStart 的路径要和 frps 的路径一致。

将文件复制到自启服务项:

sudo cp frps.service /usr/lib/systemd/system/

设置自启动,并启动服务

systemctl enable frps  # 允许自启动
# 执行成功会提示“Created symlink /etc/systemd/system/multi-user.target.wants/frps.service → /usr/lib/systemd/system/frps.service.”
systemctl start frps  # 启动客户端服务

客户端配置

服务端配置后,就可以配置客户端了。

client 目录上传到内网服务器,如下编辑 frpc.ini,参数见注释。

[common]
# 服务端公网ip、监听端口bind_port
server_addr = x.x.x.x
server_port = 7000
# 服务端的授权码
token = e10adc3949ba59abbe56e057f20f883e  
# 去掉速度限制
tcp_mux = false

[ssh]
type = tcp  # 这里几乎都是tcp,默认不用动
local_ip = 127.0.0.1
local_port = 22
remote_port = 2288

# [ssh] 为服务名称,下方解释:访问frp服务端的2288端口时,等同于通过中转服务器访问127.0.0.1的22端口。
# type 为连接的类型,此处为tcp
# local_ip 为中转客户端实际访问的IP
# local_port 为目标端口
# remote_port 为远程端口,记得服务端的防火墙打开这个端口

第一处 common 是公共配置,第二处 ssh 是需要映射的服务。同样地,本地执行 ./frpc -c frpc.ini 即可启动客户端。

建议使用 tmux 在后台启动服务,也可以通过docker启动服务

# docker镜像:snowdreamtech/frps
# 重启:always
# 网络模式:host
# 文件映射:/etc/frp/frps.ini:/etc/frp/frps.ini

docker run --restart=always --network host -d -v /etc/frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps

回到服务器的dashboard界面,找到tcp端口,可以看到2288端口已经是online状态,即绑定成功。以上所有相当于公网IP:2288对应127.0.0.1:22

访问内网其他服务器

在上面的client端继续配置

[common]
# 服务端公网ip、监听端口bind_port
server_addr = x.x.x.x
server_port = 7000
# 服务端的授权码
token = e10adc3949ba59abbe56e057f20f883e  
# 去掉速度限制
tcp_mux = false

[ssh]
type = tcp  # 这里几乎都是tcp,默认不用动
local_ip = 127.0.0.1
local_port = 22
remote_port = 2288

[4090 server]  # 服务名字,可以有空格,不能与已有服务命名重复
type = tcp
local_ip = 192.168.3.25  # 改成内网服务的ip
local_port = 6580  # 改成内网服务的port
remote_port = 8001  # 修改公网服务端的端口,记得防火墙增加该端口,可以将8000-9000端口在一个规则中全部打开作为服务使用。

小结

随笔整理

相关推荐

  1. 穿透FRP

    2023-12-24 18:24:05       38 阅读
  2. 使用docker+frp进行穿透

    2023-12-24 18:24:05       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-24 18:24:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-24 18:24:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-24 18:24:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-24 18:24:05       18 阅读

热门阅读

  1. uniapp点击tabbar之前做判断

    2023-12-24 18:24:05       49 阅读
  2. Program专栏启动计划

    2023-12-24 18:24:05       40 阅读
  3. 贪心算法高频问题-区间问题

    2023-12-24 18:24:05       34 阅读
  4. vue 项目 index.html 中使用环境变量

    2023-12-24 18:24:05       41 阅读
  5. 语音信号加密算法MATLAB仿真

    2023-12-24 18:24:05       43 阅读
  6. npm使用详解(好吧好吧是粗解)

    2023-12-24 18:24:05       40 阅读
  7. 机器学习之实验过程02

    2023-12-24 18:24:05       30 阅读
  8. Starknet 命令行工具之Starkli | 使用Starkli部署合约

    2023-12-24 18:24:05       33 阅读