最近把闲置的一个小主机安装了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
用服务端云服务器的ip
,17022
使用自己在客户端指定的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
用服务端云服务器的ip
,17022
使用自己在客户端指定的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