frp设置

本文以 ssh 为例,简单介绍基于 frp 的内网穿透的方法。

frp

为了使我们能在其他地方访问在家/公司的内网中的设备,我们需要使用内网穿透工具。最有名的就是 frp。

项目地址:https://github.com/fatedier/frp

服务端/有公网

1
2
# frps.toml
bindPort = 7000

这个 7000 端口是用来给 frp 通信的,并不是端口映射

然后启动服务端
./frps -c ./frps.toml

客户端/无公网

1
2
3
4
5
6
7
8
9
10
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

启动客户端
./frpc -c ./frpc.toml

测试 frp 连接

在不关闭服务端和客户端的 bash 界面的情况下,运行以下命令

ssh -oPort=6000 test@xx.xx.xx.xx

如果返回 timeout 或者 connection refused 的话,可能是某个 bash 关闭了或者防火墙的问题

可以使用sudo ufw status来查看端口开放状态。可以运行下面的命令开放特定端口

1
2
3
4
5
6
# 开放tcp端口
sudo ufw allow 22/tcp
# 开放udp端口
sudo ufw allow 53/udp
# 不要忘记重新加载
sudo ufw reload

进阶设置/开机自启

在服务端和客户端的 frp 的文件夹中,分别编写脚本frps.shfrpc.sh,里面编写启动命令

/etc/systemd/system中,分别创建文件frps.servicefrpc.service

这里以frps.service为例

1
2
3
4
5
6
7
8
9
10
11
12
13
# frps.service
[Unit]
Description=FrpServer
After=network.target
[Service]
Type=simple
ExecStart=/root/frp_0.53.2_linux_amd64/frps.sh
# 服务启动时执行的命令
WorkingDirectory=/root/frp_0.53.2_linux_amd64/
# 指定脚本运行的目录
[Install]
WantedBy=multi-user.target
# 自定义服务会在多用户模式下启动

如果脚本里就是用绝对路径写的,WorkingDirectory 可以不写

1
2
3
4
5
6
# 重新加载 Systemd 配置
sudo systemctl daemon-reload
# 启用自启动,这一步会创建软连接
sudo systemctl enable frps.service
# 启动服务,其实这里的.service不用写
sudo systemctl start frps.service

frps.service的开机自启也是类似,但经过测试发现,如果一开机就启动可能会因为网络未完全连接而失败。
使用systemctl status my-service.service命令查看状态,可以看到类似 time out/connection failed 的报错。
经测试,设置开机后 10 秒再启动,服务即可正常运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# frpc.service
[Unit]
Description=FrpClient
After=network.target
[Service]
Type=simple
# 延迟10s启动
ExecStartPre=/bin/sleep 10
ExecStart=/home/orangepi/frp_0.53.2_linux_arm64/frpc.sh
# 服务启动时执行的命令
WorkingDirectory=/home/orangepi/frp_0.53.2_linux_arm64/
# 指定脚本运行的目录
[Install]
WantedBy=multi-user.target

现在,在 windows 中,可以通过 powershell 命令来连接到主机

1
ssh -oPort=6000 orangepi@xx.xx.xx.xx

frp设置
https://0kitasan.github.io/2024/01/30/2024-01-30-frp设置/
作者
0kitasan
发布于
2024年1月30日
许可协议