搭建FRP内网穿透以及提升SSH安全

最近把闲置的一个小主机安装了esxi,创建了几个虚拟机做平时的开发环境用来学习使用,由于没有公网ip,在外面不好登录和访问,看了一些方案,最后选择了买一台云服务器来搭建FRP。

下载FRP包

FRP服务端需要是一台可以公网访问的机器,我这里是买的云服务器;客户端是自己内网需要访问的机器,针对服务端和客户端机器硬件和操作系统下载对应版本的FRP包。

github.com/fatedier/fr... 下载对应版本的frp包:

下载好后,上传到服务器上(服务端与客户端需要上传)

或者在服务器上运行命令下载:

bash 复制代码
wget https://github.com/fatedier/frp/releases/tag/v0.55.1/frp_0.55.1_linux_amd64.tar.gz

运行解压命令:

bash 复制代码
tar -zxvf frp_0.55.1_linux_amd64.tar.gz

FRP服务端配置文件

FRP服务端的机器上,进入解压后的文件夹,编辑frps.toml文件,我这里的配置如下:

toml 复制代码
# 服务端监听端口,默认是7000,按自己需要修改
bindPort = 17423
# 日志输出的路径,默认级别是info
log.to = "/root/frp/logs/log.info"
# 认证方式和认证token
auth.method = "token"
auth.token = "xxxxxxxxxxxxxxx"
# web界面配置,地址,端口,用户名,密码;不需要web界面可以不配置
webServer.addr = "0.0.0.0" # 公网访问需要改为0.0.0.0
webServer.port = 27423
webServer.user = "xxx"
webServer.password = "xxxxx"

配置中的token的值是与客户端连接时校验,需保持一致,建议用一个复杂的,我用的是UUID

详细配置可以参考FRP服务端配置文档gofrp.org/zh-cn/docs/...

启动FRP服务端

1.安装systemd

如果服务器上尚未安装systemd,可以使用包管理器如 yum(适用于CentOS/RHEL)或 apt(适用于Debian/Ubuntu)来安装它:

bash 复制代码
# 使用 yum 安装 systemd(CentOS/RHEL)
yum install systemd

# 使用 apt 安装 systemd(Debian/Ubuntu)
apt install systemd

2.创建 frps.service 文件

使用文本编辑器 (如vim) 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。

bash 复制代码
sudo vim /etc/systemd/system/frps.service

写入内容:

bash 复制代码
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,frps和fprs.toml的路径需要改成上面下载解压后所在的路径
ExecStart = /root/frp/frps -c /root/frp/frps.toml

[Install]
WantedBy = multi-user.target

3.使用 systemd 命令管理 frps 服务

bash 复制代码
# 启动frps
sudo systemctl start frps
# 停止frps
sudo systemctl stop frps
# 重启frps
sudo systemctl restart frps
# 查看frps状态
sudo systemctl status frps

4.设置 frps 开机自启动

bash 复制代码
sudo systemctl enable frps

FRP客户端配置文件

客户端与服务端同理,只不过运行的是frpc,配置文件是frpc.toml,进入解压后的文件夹,编辑frpc.toml文件,我这里的配置了一个ssh的代理如下:

toml 复制代码
# 连接服务端的地址,即上面部署frp服务端的云服务器的地址
serverAddr = "x.x.x.x"
# 连接服务端的端口,即上面服务端配置中的bindPort
serverPort = 17423
# 认证方式,需要与上面服务端保持一致
auth.method = "token"
auth.token = "xxxxxxxxxxxxxxx"
# 日志输出的路径,默认级别是info
log.to = "/root/frp/logs/log.info"

# 代理配置
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
# 需要访问的本地端口
localPort = 22
# 服务端绑定的端口,用户访问服务端此端口的流量会被转发到对应的本地服务,我这里指定为17022
remotePort = 17022

详细配置可以参考FRP客户端配置文档gofrp.org/zh-cn/docs/...

启动FRP客户端

客户端安装与启动和服务端基本一致,主要对应修改的是启动frpc和指定frpc.toml配置文件。

1.安装systemd

与服务端一致。

2.创建 frps.service 文件

使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frpc.service 文件,用于配置 frpc 服务。

bash 复制代码
sudo vim /etc/systemd/system/frpc.service

写入内容:

bash 复制代码
[Unit]
# 服务名称,可自定义
Description = frp client
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frpc的命令,frpc和fprc.toml的路径需要改成上面下载解压后所在的路径
ExecStart = /root/frp/frpc -c /root/frp/frpc.toml

[Install]
WantedBy = multi-user.target

3.使用 systemd 命令管理 frps 服务

bash 复制代码
# 启动frpc
sudo systemctl start frpc
# 停止frpc
sudo systemctl stop frpc
# 重启frpc
sudo systemctl restart frpc
# 查看frpc状态
sudo systemctl status frpc

4.设置 frpc 开机自启动

bash 复制代码
sudo systemctl enable frpc

在外网环境ssh登录内网机器

服务端frps和客户端frpc都启动好之后,需要将服务端所在的云服务器的监听端口bindPort,以及客户端所在的内网机器配置的绑定端口remotePort开放安全组和防火墙,之后就可以在外网环境ssh登录内网机器了:

bash 复制代码
ssh root@x.x.x.x -p 17022

root为内网服务器的用户名,x.x.x.x用服务端云服务器的ip17022使用自己在客户端指定的remotePort

修改ssh配置项提升安全性

FRP服务启动后,查看日志发现服务器有攻击请求,一直尝试登录:

对ssh修改

启用密钥登录,禁用账号密码登录,禁止root账号远程登录。

首先在内网的机器上生成密钥:

bash 复制代码
ssh-keygen -t rsa

回车后连续按回车键,我这里采用的都是默认设置;也可以按需要设置路径和密码,按提示输入对应设置后回车。

结束后会生成密钥对文件,进入~/.ssh文件夹,生成authorized_keys文件,并将其权限设置为600

bash 复制代码
cat id_rsa.pub >> authorized_keys
bash 复制代码
chmod 600 authorized_keys

将.ssh文件夹权限改为700

bash 复制代码
chmod 700 ~/.ssh

权限这里必须要设置,是ssh密钥登录对文件的权限要求。

修改sshd配置:

bash 复制代码
vim /etc/ssh/sshd_config

增加或者修改以下配置:

bash 复制代码
# 开启RSA验证
RSAAuthentication yes
# 是否使用公钥验证登录
PubkeyAuthentication yes
# 公钥文件的路径
AuthorizedKeysFile .ssh/authorized_keys 
# 禁止使用密码验证登录
PasswordAuthentication no
# 禁止root用户远程直接登录
PermitRootLogin no

保存退出后,重启sshd服务:

bash 复制代码
systemctl restart sshd

将上面生成的密钥对中的id_rsa私钥保存下来,在需要远程登录的机器上使用ssh命令密钥登录:

bash 复制代码
ssh -i .ssh/id_rsa root@x.x.x.x -p 17022

其中.ssh/id_rsa是私钥的路径,root为内网服务器的用户名,x.x.x.x用服务端云服务器的ip17022使用自己在客户端指定的remotePort

以上是修改了内网机器的ssh登录相关配置,建议云服务器的ssh登录也按同样的方式修改。

屏蔽攻击ip

上面截图的攻击请求中,因为frps日志使用了info级别,会打印出来ip,查看日志文件后,可以将攻击ip进行屏蔽。

在云服务器上运行firewall命令,屏蔽指定的ip

bash 复制代码
# 屏蔽ip
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=x.x.x.x reject"
# 重新加载firewall后才能生效
firewall-cmd --reload

附上常用的firewall命令:

bash 复制代码
# 开放端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent   
# 移除端口
firewall-cmd --zone=public --remove-port=5672/tcp --permanent
# 屏蔽ip
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=172.105.85.70 reject"  
# 解除屏蔽ip
firewall-cmd --permanent --remove-rich-rule="rule family=ipv4 source address=172.105.85.70 reject"
# 查看开放端口列表
firewall-cmd --zone=public --list-ports
# 查看屏蔽ip列表
firewall-cmd --list-rich-rules
相关推荐
千里码aicood34 分钟前
【2025】springboot教学评价管理系统(源码+文档+调试+答疑)
java·spring boot·后端·教学管理系统
程序员-珍1 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
liuxin334455661 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
架构师吕师傅2 小时前
性能优化实战(三):缓存为王-面向缓存的设计
后端·微服务·架构
bug菌2 小时前
Java GUI编程进阶:多线程与并发处理的实战指南
java·后端·java ee
夜月行者4 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
Yvemil74 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
sdg_advance4 小时前
Spring Cloud之OpenFeign的具体实践
后端·spring cloud·openfeign
猿java5 小时前
使用 Kafka面临的挑战
java·后端·kafka
碳苯5 小时前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os