1. 什么是frp
FRP (Fast Reverse Proxy) 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP , UDP , HTTP , HTTPS 协议。
下载:https://github.com/fatedier/frp/releases
配置文档:https://github.com/fatedier/frp#example-usage
一般来说frps指代frp server,即服务端,frpc指代frp client,即客户端,但是在搜索的时候感觉一般都直接使用frps代指frp的整个软件了。
2. frp的使用
2.1 准备
如果要使用frps的tcp,需要一台具备公网ip的服务器;
如果要使用frps的http和https,需要一台具备域名的服务器。
2.2 电脑远程连接
本来远程连接都是用的是向日葵和teamviewer,但是前者的免费版画面质量没有那么好,后者一不小心就被判定商用或者是试用到期,之前的那些刷新id的办法也没得用,加上课题组租了一个20M带宽的服务器,索性就使用frp做代理。
众所周知,windows远程连接的端口是3389,所以只需要用服务器转发信息到本地机器的3389端口即可,需要做的配置很简单,用记事本打开服务端的frps.ini,简单配置如下:
[common]
bind_port = 7000
token = ABCabc123!
接下来要在云服务器的安全组中打开一个端口,我打开的是23333端口,之后打开本地端的frpc.ini,简单配置如下:
[common]
server_addr = 8.8.8.8 # 服务端机器的公网ip,这里需要自己配置
server_port = 7000 # 服务端机器监听frp的端口,默认是7000
token = ABCabc123! # 服务器端与本地端机器的验证信息,要保持一致
[libcomputer]
type = tcp # 转发方式为tcp
local_ip = 127.0.0.1 # 本地端机器的ip,这里可以直接使用127.0.0.1
local_port = 3389 # 本地端机器需要被代理的端口,也就是远程连接的端口
remote_port = 23333 # 服务端机器的转发端口,也就是在服务器安全组中开放的端口23333
之后打开服务端的start.bat,再打开本地端的start.bat,这样代理就做好了,需要用其他机器远程访问本地机器的话,只需要在远程连接端口中输入:8.8.8.8:23333,那么访问的端口实际上就被转发为本地端的3389了。
2.3 ssh代理
ssh代理也就是映射到linux机器的22端口,这里首先需要下载适配linux的软件,版本需要和服务端的一致,比如我这里使用的都是0.30版本的。
服务端的frps.ini配置不需要做什么改动,还是如下:
[common]
bind_port = 7000
token = ABCabc123!
同样的,客户端的改动基本和windows的差不多,展示windows的是3389的远程连接,linux的是22的ssh连接:
[common]
server_addr = 8.8.8.8
server_port = 7000
token = ABCabc123!
[ssh]
type = tcp # 配置协议还是tcp
local_ip = 127.0.0.1 # 本地端机器的ip,直接使用127.0.0.1即可
local_port = 22 # ssh连接端口
remote_port = 6000 # 服务端机器的转发端口,需要在安全组中开启该端口
之后服务端打开start.bat,本地端就在frp软件的根目录,使用命令:
nohup ./frpc -c ./frpc.ini >/dev/null 2>&1 &
在后台打开frp服务即可。如果想要杀死进程的话只要找到进程端口kill掉就好了,如下:
ps -aux|grep frp| grep -v grep # 找到frp的端口号
kill -9 [端口号] # 杀死进程
这里参考了:
https://blog.youkuaiyun.com/weixin_34244102/article/details/88677915
但是在这里出现了一个问题,就是整个连接有时候会断开连接,之前使用windows对windows的远程连接的时候就没有这个问题,根据我的观察应该是远程的机器的frp窗口休眠导致的,所以我们需要把frp做成一个后台的服务,让他常驻在服务端windows的进程之中。这里参考了这篇文章:
http://vulsee.com/archives/vulsee_2019/0424_7453.html
也就是使用nssm软件,将frp做成服务。
需要使用命令行配置nssm,一直cd到安装目录,使用命令:
nssm.exe install frp
我这里直接借了图来了:
我的start.bat是这样写的:
@echo off
set retime=60
:start
frps.exe -c frps.ini
echo Error
echo --------------------------------------------
echo 连节点或登入失败-即将在%retime%秒后重新连
echo --------------------------------------------
timeout /t %retime%
goto start
其实核心就是这一行:
frps.exe -c frps.ini
同时为了防止万一,我还把在linux本地端的frpc服务加入到了系统进程中,参考了这篇文章:
https://www.icode9.com/content-4-858536.html
具体做法是使用命令:
vim /lib/systemd/system/frpc.service
配置如下:
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
#启动服务的命令(此处写你的frp的实际安装目录)
ExecStart=/usr/share/frp/frpc -c /usr/share/frp/frpc.ini
[Install]
WantedBy=multi-user.target
启动命令为:
systemctl daemon-reload # 重新load一遍service
systemctl start frpc # 启动frpc服务
这样就不会有休眠导致的连接不稳定了。如果修改了配置文件需要重启的话,只需要使用命令:
systemctl restart frpc # 重新启动frpc服务
2.4 http代理
由于网页服务器放在了一台centos的机器上,所以这里的http代理的本地端就是使用linux命令操作了,服务端仍然是windows机器。
首先还是服务端配置,打开frps.ini,配置如下:
[common]
bind_port = 7000
vhost_http_port = 6001 # 需要配置的代理端口,也就是之后要在其他机器访问的端口
token = ABCabc123!
[web01]
type=http # 代理方式为http
custom_domains = example.com # 已经映射到该机器上的公网域名
我看有些教程没有把[web01]下面的配置加载服务端里面,结果我这样做了之后却打不开了,所以推荐还是加上吧。
之后是本地端linux机器的配置,这里先要下载适配linux的frp客户端,保证和服务端的版本一致,打开frpc.ini,配置如下:
[common]
server_addr = 8.8.8.8
server_port = 7000
token = ABCabc123!
[ssh] # 这是之前的ssh配置,可以与http并列存在,如果不需要可以删除
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
[git]
type= http # 使用http协议
local_ip = 127.0.0.1 # 本地端的ip
local_port = 800 # 本地端需要代理的端口
custom_domains = frp.example.com # 之后要访问的域名,需要是服务端配置域名的子域名
配置完成只有开启服务端和本地端的软件即可。如果之前配置了ssh的连接,那么这里就可以直接使用systemctl start frpc即可。
2.5 nginx做https代理
之前搜了一些frp做https的配置,看了这三篇:
https://cloud.tencent.com/developer/article/1581948
https://www.cnblogs.com/shook/p/12790532.html
https://segmentfault.com/q/1010000020421674
本来配置也不麻烦,但是我照着做搞了一下午,最后不知道哪里出错,总是搞不成功,所以索性直接使用nginx了,毕竟是打交道的老熟人了。
首先需要给域名申请ssl证书,我这里是阿里云的域名,所以也在阿里云上申请了免费的证书,审核的下发都很快,基本上是申请,申请完成,配置域名,创建证书,之后就直接签发了,这里感谢digicert。在下载证书的时候会给出对应服务器类型的证书,有Tomcat、Apache、Nginx以及IIS等,我这里直接下载了nginx的证书,下载之后会有两个文件,分别是:
xxxxxx_frp.example.com.key
xxxxxx_frp.example.com.pem
将他们放在nginx的conf文件夹中,打开nginx.conf,配置如下:
server {
listen 443 ssl;
server_name frp.example.com; #填写绑定证书的域名
#ssl on;
ssl_certificate xxxxx_frp.example.com.pem; #证书在conf文件同级;
ssl_certificate_key xxxxx_frp.example.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:6001;
}
}
这里参考了:
https://blog.youkuaiyun.com/qq247300948/article/details/82113958
之后打开nginx即可,在nginx的根目录,命令如下:
start nginx # 启动
nginx.exe -s stop # 中断
nginx.exe -s quit # 有序停止,推荐使用
nginx.exe -s reload # 重新加载配置,比如当你更改了nginx.conf文件之后
nginx -v # 查看版本
3. 总结
我这里是做完之后才写的,保证了每一项都是可以正常运行的。
但是毕竟不是边做边写的,可能会出现一些纰漏,当做一种记录,供大家参考了。