frp内网穿透

frp内网穿透
一、背景说明 
  老板在11月底的时候,曾经问过我,外网访问公司内网的服务,用的是什么技术,然后问我frp用过没有,接着发了这篇文章给我【https://sspai.com/post/52523】。我说ngrok、autossh都有用到,问了下小强有没有用过,他说不够autossh稳定,然后我反馈给老板,但老板强大的求知欲,貌似不太死心,所以后来差不多一周时间,我都在捣鼓这玩意。
  相比ngrok、autossh,我觉得最大的好处是,frp能结合路由器配置,web界面简单明了,但客户端配置起来就麻烦多了(大家可以拉到最后面的frp windows客户端配置)。
  ngrok、autossh基本只需要配置好服务端,客户端直接用即可。

   (其中7000端口是frp服务端口,记得防火墙要开起来!)

 

 
二、研究历程
  总结下来,一波三折~~ 所以叫历程,不假,由于时间隔得有点长,加上记忆力不太好,可能以下内容会有误导读者的成分,请多多见谅。所以,写博客一定要趁热打铁!
 
1、天翼服务器不通github
  首先,老板发的这篇文章,安装麻烦,且对我部署的环境来说,是有点问题的,我部署在天翼云的服务器上,但天翼云服务器是不通github的,那我只能下载安装包到本地再上传。然后启动也是各种报错,好不容易装好了,但访问有问题:那台天翼服务器80、443端口并没有在天翼云上备案,所以nginx配置完后,开了443、80端口,还是用不了。
  后来老板找了篇傻瓜式部署的文档【https://github.com/MvsCode/frps-onekey】,叫我开台按量付费的阿里云大陆服务器部署测试(后面大家会知道为什么我会强调大陆和香港,大陆管的可严了,需要备案)
  部署完如下图所示:

  部署从来不是难点,难得是配置满足需求。

 

2、ssl证书申请、域名备案及https协议支持

  上面部署完之后,就能代理http和tcp的服务了。其中http服务测试我们选择了公司内网虚拟机的网站服务,监听80端口,tcp则是代理windows远程桌面端口及mysql数据库3306端口,都没有问题。

  然而https协议的服务要怎么配置支持?

  一开始我想到利用nginx去做,像ngrok一样,去Freessl 网站(https://freessl.cn/)申请https证书,然后代理到frp服务,前提要修改frp的监听端口,因为默认frp也是使用80、443端口,会跟nginx冲突。

  首先遇到一个ssl证书申请不下来的问题,DNS解析一直不过(注意,此时环境是阿里云大陆服务器,国外网站购买的域名)。最后老板只能买个阿里国际版的域名,DNS解析验证就没有问题了,ssl证书也能申请下来。

 ssl证书是申请下来了,部署之后,出现网站访问不了的问题。阿里云大陆的服务器,没有备案过,即使能解析到阿里国际版购买的域名。

    最后只能选择购买阿里云香港服务器部署,解析到阿里国际版的域名,此时,ssl证书和域名备案问题都解决了。

  配置到nginx,代理到frp后,之前配置tcp协议及http协议的服务,访问速度很慢,因为查不到具体原因,老板建议重置云盘,话说重置完,重装后,速度竟然恢复正常。先贴下https配置的代码(虽然最后没有用这个方案,至少是本人的辛勤劳动)

 1 server {
 2     listen       80;
 3     server_name  *.frp.xxx.cn;
 4     return 301 https://$host$request_uri;
 5 }
 6 
 7 server {
 8     listen 443 ssl;
 9     server_name *.frp.xxx.cn;   
10 
11     ssl_certificate /etc/nginx/cert/cert.pem;
12     ssl_certificate_key /etc/nginx/cert/key.pem;
13     ssl_session_timeout 5m;
14     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
15     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
16     ssl_prefer_server_ciphers on;
17 
18     location / {
19         #转发到frp的http服务端口
20         proxy_pass http://127.0.0.1:10080;
21        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
22             proxy_set_header Host $http_host;
23             proxy_set_header X-NginX-Proxy true;
24             proxy_http_version 1.1;
25             proxy_set_header Upgrade $http_upgrade;
26             proxy_set_header Connection "upgrade";
27             proxy_max_temp_file_size 0;
28             proxy_redirect off;
29             proxy_read_timeout 240s;
30 
31     }
32 
33     # redirect server error pages to the static page /50x.html
34     #
35     error_page   500 502 503 504  /50x.html;
36     location = /50x.html {
37         root   /usr/share/nginx/html;
38     }
View Code

  反反复复找不到原因后,决定尝试直接使用frp客户端,而不依赖nginx的方式,去配置https协议的服务。只需要编辑一个frpc.ini 的客户端文件。这个配置能取代在路由器上配置frp内网穿透(文章最开始那个图)

 1 [common]
 2 server_addr = 【frp服务器ip】
 3 server_port = 【frp服务器的服务端口】
 4 token = xxx
 5 
 6 #log_file = ./frpc.log
 7 #log_level = info
 8 #log_max_days = 3
 9 
10 ## 代理tcp远程服务
11 [xxx-local]
12 type = tcp
13 local_ip = 【测试win虚拟机的ip】
14 local_port = 【测试win虚拟机的远程桌面端口】
15 remote_port = 【frp服务器未使用的一个端口】
16 custom_domains = xxx名字.域名xxx.top
17 
18
19 ##显示名字,代理我办公电脑的tomcat服务,https访问
20 [ljy-tomcat]    
21 type = https
22 local_ip = 【我办公电脑的ip】
23 local_port = 8080
24 remote_port = 【frp服务器未使用的一个端口】
25 custom_domains = ljy.域名xxx.top
26 
27 # HTTPS 证书相关的配置
28 plugin = https2http
29 plugin_local_addr = 【我办公电脑的ip】:8080
30 
31 plugin_crt_path = ./ce/cert.pem
32 plugin_key_path = ./ce/key.pem
33 plugin_host_header_rewrite = 【我办公电脑的ip】
34 plugin_header_X-From-Where = frp

下面是代理http服务配置:

[xxx名字]
type = http
local_ip = 192.168.0.xx
local_port = 80
remote_port = 【frp未使用的一个端口】
custom_domains = xxx名字.域名xxx.top

  其中,证书放到同级目录下即可

 

   前台启动是这样的: frpc.exe -c frpc.ini

    最后说下,这种frp客户端方式容易出现假死情况,留意上面红框,会定着不动,需要按回车。至于放到后台运行有没有这种情况,暂时没测过。

  因为已经不使用nginx代理的方式,所以结合路由器配置(文章最前面那个图),http穿透服务端口和https穿透服务端口保持frp默认的80、443即可。

 

      另外注意,路由器配置https服务,其实协议类型选择http即可,不需要改成https协议也没问题,客户端指定https协议就行。 

 

posted @ 2023-01-23 15:47  windysai  阅读(451)  评论(0编辑  收藏  举报