使用frp实现内网穿透
# 介绍
内网穿透是一种反向代理技术,允许你从任何位置访问一台处于复杂网络环境中的机器。它的应用场景有很多,例如,你在家中使用树莓派作为 Home Assistant 家庭中枢,但家庭网络的网关没有公网 IP,那么在离开家时就无法控制家中的智能设备。而在配置内网穿透后,就可以随时随地通过代理服务器的公网 IP 连接到树莓派,从而访问 Home Assistant 的服务。
内网穿透的原理是,利用一个具有固定公网 IP 的主机做跳板,让两个客户端建立 P2P 连接;如果不成功,就通过跳板主机中转,将所有流量代理到内网中的主机上。为不同需求所设计的内网穿透解决方案有很多,例如 frp (opens new window) 和 Cloudflare Tunnel。frp 允许你将内网中主机的端口映射到公网的主机上,因此使用起来非常直接。而 frp 的缺点是主机和端口都需要单独配置,如果要用多台设备组网,会有些繁琐;此外,这些端口都会直接暴露在公网上,安全性较差。另一个方案 Cloudflare Tunnel,可以直接用 Cloudflare 的节点进行中转,是非常不错的选择,但缺点和 frp 类似,在多台设备需要互相访问时很麻烦。如果需要将不同网络环境中的多台设备都配置内网穿透,并能够互相访问,那么使用 ZeroTier 搭建虚拟局域网是一个不错的选择
# 部署server端
在有公网ip的服务器部署,下载部署安装包
下载地址:https://github.com/fatedier/frp
在部署部署目录解压
tar -xf frp_0.61.1_linux_amd64.tar.gz
cd frp_0.61.1_linux_amd64
mkdir /etc/frp
cp frps.toml /etc/frp/
cp frps /usr/bin/
2
3
4
5
修改server端配置
vim /etc/frp/frps.toml
log.to = "/data/frp/frps.log"
log.level = "debug" # 可进一步定位连接被拒绝的原因
log.maxDays = 3
bindPort = 7000 # 通信端口必须使用下划线命名
vhostHTTPPort = 7001 #配置http代理需要开启
auth.token = "xxxx"
#token = "43884" # 建议改为更复杂的token
webServer.addr = "0.0.0.0"
webServer.port = 7500
# dashboard 用户名密码,可选,默认为空
webServer.user = "admin"
webServer.password = "xxxx"
# 启用TCP多路复用
transport.tcpMux = true
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#配置systemd启动服务
root@hcss-ecs-fd14:/data/frp# cat /etc/systemd/system/frps.service
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为frps的安装路径
ExecStart = /usr/bin/frps -c /etc/frp/frps.toml
[Install]
WantedBy = multi-user.target
#启动服务
systemctl start frps
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 部署client服务
在有nei网ip的服务器部署,下载部署安装包
下载地址:https://github.com/fatedier/frp
在部署部署目录解压
tar -xf frp_0.61.1_linux_amd64.tar.gz
cd frp_0.61.1_linux_amd64
mkdir /etc/frp
cp frpc.toml /etc/frp/
cp frpc /usr/bin/
2
3
4
5
修改客户端配置
vim /etc/frp/frpc.toml
serverAddr = "121.37.210.217"
serverPort = 7000
auth.token = "43884"
webServer.addr = "192.168.51.49"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin@123"
log.to = "/data/frp/frpc.log"
log.level = "debug" # 可进一步定位连接被拒绝的原因
log.maxDays = 3
# 配置ssh服务
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "192.168.51.49"
localPort = 22
remotePort = 22000
[[proxies]]
name = "web01"
type = "tcp"
localPort = 10480
remotePort = 10480
[[proxies]]
name = "web02"
type = "tcp"
localIP = "192.168.51.47"
localPort = 32078
remotePort = 10482
#配置http的操作
[[proxies]]
name = "web"
type = "http"
localIP = "192.168.51.100"
localPort = 80
customDomains = ["xirang.quantchatai.top"]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
启动服务
配置systemd启动服务
[root@localhost ~]# cat /etc/systemd/system/frpc.service
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为frps的安装路径
ExecStart = /usr/bin/frpc -c /etc/frp/frpc.toml
[Install]
WantedBy = multi-user.target
#启动服务
systemctl start frpc
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
参考链接
通过自定义域名访问内网的 Web 服务 | frp (opens new window)
https://www.wxy97.com/archives/284c90ae-c88e-4928-b024-85380e995e06

