frp做远程连接+ssh+http+https

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.csdn.net/weixin_34244102/article/details/88677915

但是在这里出现了一个问题,就是整个连接有时候会断开连接,之前使用windows对windows的远程连接的时候就没有这个问题,根据我的观察应该是远程的机器的frp窗口休眠导致的,所以我们需要把frp做成一个后台的服务,让他常驻在服务端windows的进程之中。这里参考了这篇文章:

http://vulsee.com/archives/vulsee_2019/0424_7453.html

也就是使用nssm软件,将frp做成服务。

下载地址:http://nssm.cc/download

需要使用命令行配置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.csdn.net/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. 总结

我这里是做完之后才写的,保证了每一项都是可以正常运行的。

但是毕竟不是边做边写的,可能会出现一些纰漏,当做一种记录,供大家参考了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值