windows下内网穿透之frp使用

·  阅读 2812
windows下内网穿透之frp使用

前言

  • 最近在做【音乐博客】,想实现上传音乐文件到七牛云上管理文件
  • 结果今早5/7号提示我流量超出,需充值!

  • what?当时使用七牛云以为是免费的,赠送我10G空间,以为可以为所欲为,于是我就把歌曲都上传到七牛云上,天天list to music~

  • 顺便一提:关于七牛云文件命名上传
    因为七牛云是没有文件夹区分的,所以我们文件上传的时候,最好给文件命名文件夹的形式。如:singer/路飞.jpg,singer我们就认为是一个文件夹

  • 结果今天就提示流量超出,我是以为流量可以无限用,只是限制了空间只能放10G的东西,果然,天下没有免费的午餐

  • 我想吐槽的是:七牛云在你扣费的情况下,还不能停止空间服务,结果老老实实充钱,立马就停止服务,改掉秘钥、空间设为私有空间、停用cdn加速域名,不敢用了,要钱的玩意,不过个人上传一点图片还是可以的

  • 那么文件上传到哪里好呢?服务器上?开玩笑,服务器的空间还有4G的剩余的,我的音乐文件差不多有7 8 G(无损flac),后来同事建议上传到我台式的电脑(空间大),所以就需要用到内外穿透frp



七个方面

1. 认识并下载frp

  • frp 是一个用Go语言开发的,可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 、 http 和 https。可将一个部署在本机的web服务映射到外网。
  • 首先去frp下载网站下载对应的版本,我这里下载的是frp_0.33.0_windows_amd64.zip
  • frp的安装就比较简单了,将下载好的安装包直接解压到相应目录就可以了。

2. 使用frp

2.1 服务器配置

  • 首先在服务器上解压到相应目录并配置frps.ini文件如下:
[common]
bind_addr = 0.0.0.0
#与客户端 绑定端口
bind_port = 7088
#dashboard 用户名
dashboard_user = admin
#dashboard 密码
dashboard_pwd = admin
#dashboard 端口,启动成功后可通过浏览器访问如http://ip:7500
dashboard_port = 7500
#设置客户端token,对应客户端有页需要配置
token = 8d262f2b-6dba-4a8d-857e-8a53d1d439e2 
  • 按下windows+R输入cmd进入命令窗口,进入到安装目录下运行
  • frps.exe -c frps.ini
    复制代码

  • 服务端运行
  • 浏览器打开:http://localhost:7500/即可进入(账户密码是上面填写的)

  • 注意:阿里云服务器上要开放7088和33890端口

2.2 客户端配置

  • 将安装程序在客户端机上解压一份并配置frpc.ini配置文件如下:

[common]
# 配置服务端对外的ip地址
server_addr = 47.xxx.xxx.xx 
#配置服务端监听的端口
server_port = 7088
 #如果服务端配置token,将服务端配置的token复制到此处
token = 8d262f2b-6dba-4a8d-857e-8a53d1d439e2
pool_count = 5
#我这里是配置端口范围转发
[range:services]
#类型为tcp
type = tcp
#本地ip地址通常为127.0.0.1
local_ip = 127.0.0.1
#本地要映射的端口范围
local_port = 3389
#映射到服务端的端口范围
remote_port = 33890
  • 按下windows+R输入cmd进入命令窗口,进入到frp解压目录下运行frpc.exe
  • 客户端运行
  • 给大家讲一下笑话:客户端一开始配错了,配在frps.ini文件下,然后疯狂报错,找了半天原来是写错文件了,写在这里是想给大家一个提示~


3. 防火墙

  • 如果服务端有防火墙一定要增加入栈规则,类型选择应用程序。否则肯能客户端无法连接到服务器。
  • frp入栈规则


4. 远程桌面连接

  • 还要做一件事:在内网的电脑上配置[ 本地组策略编辑器 ]

  • 补充:我是用微软的账户登录我的电脑的,因为远程桌面需要所以我改为本地账户方便连接


  • 输入ip:33890,这个端口是我们上面客户端配置的,记得要在阿里云开放端口哦!


  • 连接成功!!!

  • 到这里就可以使用远程桌面连接内网的电脑了,如果不想开放端口出去,下面就可以不用配置了


友情提示:frps.ini和frpc.ini不要搞混了,不然会有意外的错误,请仔细看教程的文件名


5. 暴露内网端口供外部使用

  • 可能我们不单单是远程连接我们内网的电脑,还想在内网电脑上提供一些服务,比如使用java写的一些服务、node提供一些接口,我们希望可以在外部通过内网穿透调用到内网的这些服务
  • 比如我因为解决服务器内存不足,想使用的内网穿透,通过将内网提供文件服务器minio服务管理音乐文件,外部可调用minio获取音乐文件
  • 进入正题:通过frp + nginx 配置多人共用的http 内网穿透服务
  • 一开始就在想,如果我想调用8527的端口的服务,应该怎么调用,难道我写47.xxx.xx.xx:33890:8527吗?(服务器ip:33890是我连接内网电脑的端口),后来就想到要每一个端口对应一个子域名,将8527这个端口配给子域名

5.1. 大致思路

第一步: 配置无误的情况下,frp服务端frp客户端先后启动,建立通信隧道,其中:

  • frp服务端监听http 7071端口(此端口可自定义),接收此端口下所有外网用户请求
  • frp客户端代理本地想要暴露给外网的web服务端口,本文以8527,9000端口为例

第二步: 通过配置nginx反向代理,将指向本台公网服务器的dev.zhengzemin.cn 下的子域名,映射到服务器的7071端口,也就是frp监听的那个端口。 外网用户访问dev.zhengzemin.cn下的子域名,例如 :

  • a.dev.zhengzemin.cn
  • b.dev.zhengzemin.cn

等同于访问zhengzemin.cn:7071,会 触发 frp服务端和客户端的互动,从而http请求由frp服务端传递到frp客户端

第三步: frp客户端收到http请求后,基于自定义配置,则做如下处理:

  • 监听到http请求中的域名为 a.dev.zhengzemin.cn,则将请求转发到我本地的8527web服务端口
  • 监听到http请求中的域名为 b.dev.zhengzemin.cn,则将请求转发到我本地的9000web服务端口

第四步: 本地的web服务收到http请求后,对请求做处理,并完成响应

第五步: frp客户端将响应结果回传给frp的服务端。服务端最终将响应回传给外网用户

第六步: 最终的实测效果为:

  • 访问 a.dev.zhengzemin.cn,等同于访问我本地的localhost:8527
  • 访问 b.dev.zhengzemin.cn,等同于访问我本地的localhost:9000

5.2. 准备工作

  • 打开阿里云在域名解析后台配置子域名  
  • 登录域名的解析后台,在zhengzemin.cn下增加两条A记录: dev , *.dev,记录值为部署frp服务端的公网服务器的ip。

    代表dev.zhengzemin.cn下的所有的子域名,会全部指向此台公网服务器。


5.3. 动手配置

  • 还记得我们服务器上的配置文件吗,我们来再加点配置

[common]
bind_addr = 0.0.0.0
#与客户端 绑定端口
bind_port = 7088   
#dashboard 用户名
dashboard_user = admin
#dashboard 密码
dashboard_pwd = admin

 #dashboard 端口,启动成功后可通过浏览器访问如http://ip:7500
dashboard_port = 7500  
 #设置客户端token,对应客户端有页需要配置
token = 8d262f2b-6dba-4a8d-857e-8a53d1d439e2 


# 以下是这次加上的配置



# 服务端通过此端口接监听和接收公网用户的http请求
vhost_http_port = 7071# 服务端的subdomain_host需要和客户端配置文件中的subdomain、local_port配合使用,
# 可通过{subdomain}.{subdomain_host} 的域名格式来访问自己本地的 web 服务。
# 假如服务端的subdomain_host为dev.msh.com,客户端某个配置组中的
# subdomain为a,local_port为8585,
# 则:
# 访问 a.dev.msh.com ,等同于访问本地的localhost:8585
 
subdomain_host = dev.zhengzemin.cn复制代码

  • 配置成功,重新启动以下frp服务端
  • frp服务器配置好了之后,还需要在服务端配置下nginx反向代理
  • 提供nginx百度云下载:
    链接:pan.baidu.com/s/1ol7j1pu8… 提取码:7ujv 复制这段内容后打开百度网盘手机App,操作更方便哦
  • 修改nginx.conf文件

server {
        # frp的接收http请求的反向代理
	
		listen 80;
		server_name *.dev.zhengzemin.cn  dev.zhengzemin.cn;
		
		location / {
			# 7071端口即为frp监听的http端口
			proxy_pass http://127.0.0.1:7071; 
			proxy_set_header Host $host:80;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection "upgrade";
			
			proxy_connect_timeout 7d;
			proxy_send_timeout 7d;
			proxy_read_timeout 7d;
 
			}
		# 防止爬虫抓取
		if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot")
			{
				return 403;
			}
	

       

    }复制代码

  • 配置成功,重新启动以下nginx服务
  • 到这里服务器便配置成功
  • 接下来我们来看下客户端的配置
  • 编辑frpc.ini文件
  • [common]
    # 配置服务端对外的ip地址
    server_addr = 47.xxx.xxx.xx
    #配置服务端监听的端口
    server_port = 7088
    
    #如果服务端配置token,将服务端配置的token复制到此处
    token = 8d262f2b-6dba-4a8d-857e-8a53d1d439e2
    pool_count = 5
    
    #我这里是配置端口范围转发
    [range:services]
    #类型为tcp
    type = tcp
    #本地ip地址通常为127.0.0.1
    local_ip = 127.0.0.1
    #本地要映射的端口范围
    local_port = 3389
    #映射到服务端的端口范围
    remote_port = 33890
    
    
    
    
    # 以下是这次加上的配置
     
    # 代理服务一 ,[]内的代理服务名称在全局范围内确保唯一,每个人的每个代理服务不能重名,
    # 否则会影响正常使用。
     [http-java-bkapi]
    type = http
    # local_port代表你想要暴露给外网的本地web服务端口
    local_port = 8527
    # subdomain 在全局范围内要确保唯一,每个代理服务的subdomain不能重名,否则会影响正常使用。
    # 客户端的subdomain需和服务端的subdomain_host配合使用
    subdomain = file
     
     
    # 代理服务二  ,各项配置说明请参考配置组一
    [http-minio]
    type = http
    local_port = 9000
    subdomain = minio复制代码

      • 配置成功,重新启动以下frp客户端服务
      • 如果窗口提示 『start proxy success』 ,则代表frp服务端和frp客户端的通信隧道建立成功
      • 测试访问

        在浏览器里面访问 minio.dev.zhengzemin.cn、测试本地的web服务是否已经暴露给外网

      6. 关于使用frp上传大文件遇到的问题

      • 场景:使用frp的nginx分配多个端口,如:上面的8527服务是java的应用是通过frp暴露多个端口的其中一个,将文件上传到8527这个应用下,结果浏览器报了个跨域错误
      • 遇到这种事情不要慌,无非就是前端和后端有没有跨域处理
      • 前端排查确认无误,确实是写上跨域了,后端看一下,嗯,确实也是处理了跨域,正常的跨域就是前后端配置一下跨域就可以,可这次不一样,跨域不关前后端的事情,what?
      • 真的是排查了一整天时间,和前端、后端人员探讨了一个下午,还是没有解决方案,不过后端人员倒是说:前端去请求node,然后node做中间层去请求java的8257应用,后端请求后端就不会有跨域这种事情了,毕竟跨域是浏览器的同源策略;
        这样子也是行得通的,但是和我这个场景不太符合,前端直接去请求java就好,不太想要转弯抹角。
      • 还有一种思路是:因为是跨域问题,我在nginx上做反向代理来解决前端跨域问题(虽然没试过,但感觉或许行得通,方法总是试出来的)
        利用nginx做反向代理解决前端跨域问题 
      • 晚上突然想到,会不会是frp的问题?查了之后还真的是
      • 相关文档:NGINX 服务器反向代理导致上传错误问题
      • 导致上传文件失败原因:
      • client_body_buffer_size 配置请求缓存区大小
      • client_body_temp_path 设置临时文件存放路径。
      • client_max_body_size 设置上传文件的最大值。
      • 我在 nginx.conf 没有配置 client_body_buffer_size 的大小,client_body_buffer_size 系统默认 8K (32位)或者16K(64位),没有创建 client_body_temp_path 临时目录。如果上传超过16K的文件会提示失败。
      • 工作原理:如果上传文件大小超过client_body_buffer_size 默认值就把会文件放到client_body_temp_path 设置的临时目录中。


      • 最后完整的nginx.conf是这样子的

      • worker_processes  1;
        events {
            worker_connections  1024;
        }
        
        http {
            include       mime.types;
            default_type  application/octet-stream;
        	
        	client_max_body_size 200m;
        	client_body_buffer_size 256k;
        	client_body_temp_path /etc/nginx/proxy_temp;
        
            sendfile        on;
          
            server {
                # frp的接收http请求的反向代理
        	
        		listen 80;
        		server_name *.dev.zhengzemin.cn  dev.zhengzemin.cn;
        		
        		location / {
        			# 7071端口即为frp监听的http端口
        			proxy_pass http://127.0.0.1:7071; 
        			proxy_set_header Host $host:80;
        			proxy_set_header X-Real-IP $remote_addr;
        			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        			
        			}
        		# 防止爬虫抓取
        		if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot")
        			{
        				return 403;
        			}
            }
        }复制代码
      • 这样子配置,虽然可以解决frp上传文件过大而报错的情况,但是上传文件速度很慢
      • 分析:不知道是不是他去走服务器了,服务器宽带慢,以前应该直接走本地,本地的网络快,或者nginx可以设置上传限速(待研究),总算解决了frp上传文件过大的问题了。

      7. 问题解答

      • 疑问:微信小程序只支持https协议,而刚搭建的是http内网穿透,不适用怎么办?

        解疑: 可以在微信Web开发者工具里面找到项目设置,把 『不校验合法域名、业务域名、TLS版本以及HTTPS证书』 项勾选即可。这样就可以在生产环境下走https协议,本地开发环境下走http协议

      • 疑问:我搭建的内网穿透服务,怎么限定只有内部成员可用,防止外人随意『搭便车』?
      • 解疑: 可以基于token参数来完成身份验证。服务端和客户端的 common 配置中的 token 参数一致则身份验证通过。

      原文地址

      juejin.cn/post/684490…

      参考

      windows下内网穿透之frp使用:blog.csdn.net/huangdaxian…

      frp + nginx 配置多人共用的http 内网穿透服务 :blog.csdn.net/Aria_Miazzy… 

      NGINX 服务器反向代理导致上传错误问题 :free-e.net/402

      利用nginx做反向代理解决前端跨域问题:www.cnblogs.com/lxlin/p/897…

      Nginx上传和超时时间限制:www.cnblogs.com/kevingrace/…


      分类:
      开发工具
      标签:
      收藏成功!
      已添加到「」, 点击更改