frp下反向代理實現https協議


前言:由於需要很多地方用到內網穿透環境,所以選擇了frp,近階段需要Https,所以有了此文,
本文分為frp自身功能和frp+Nginx進行反向代理實現https
環境介紹:我這里的環境是服務端和客戶端的配置均是可以在Linux/Windows下運行的,唯一需要注意的是linux上證書和windows獲取方式不同,windows較麻煩,這里就不演示了,我這里用的是域名綁定的Linux服務端生成證書存放在Windows客戶端下的

系統 版本
Linux CentOS7
Windows Windows Server2012

一、frp

frp的Github地址:https://github.com/fatedier/frp/releases

注意服務端和客戶端的版本是需要一致的

如只有一端不知道版本可以進入目錄通過./frps -v或者./frpc -v查看版本號

詳細操作這里就不介紹了,可以參考其他文章

二、證書生成

我這里用的是Let’s Encrypt,畢竟免費,哈哈,安裝方式用的是Certbot

這里的Certbot安裝方式已經過時,請跳轉到https://www.cnblogs.com/shook/p/14486938.html進行查看(2021.03更新)

下面是wiki上的簡介:

  • Let’s Encrypt 是一個將於2015年末推出的數字證書認證機構,將通過旨在消除當前手動創建和安裝證書的復雜過程的自動化流程,為安全網站提供免費的SSL/TLS證書。 Let’s Encrypt 是由互聯網安全研究小組(ISRG,一個公益組織)提供的服務。主要贊助商包括電子前哨基金會,Mozilla基金會,Akamai以及思科。2015年4月9日,ISRG與Linux基金會宣布合作。用以實現這一新的數字證書認證機構的協議被稱為自動證書管理環境(ACME)。 GitHub上有這一規范的草案,且提案的一個版本已作為一個Internet草案發布。Let’s Encrypt 宣稱這一過程將十分簡單、自動化並且免費。 2015年8月7日,該服務更新其推出計划,預計將在2015年9月7日當周某時發布首個證書,隨后向列入白名單的域名發行少量證書並逐漸擴大發行。若一切按計划進行,該服務預計將在2015年11月16日當周某時全面開始提供.

注意:在裝證書之前先把Nginx或者80.443相關服務先停止,不然會發生端口沖突發生如下錯誤

Cleaning up challenges
Problem binding to port 80: Could not bind to IPv4 or IPv6.

Linux下安裝:

Github代碼下載:git clone https://github.com/letsencrypt/letsencrypt.git

目錄結構:

先執行:

yum install snapd
systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap

再進入目錄:

執行:
./letsencrypt-auto certonly --standalone --email 123@123.com -d 二級域名.域名.com

如果使用的是xx雲默認的python環境出現

subprocess.CalledProcessError: Command '['virtualenv', '--no-site-packages', '--python', '/usr/bin/python2.7                                                    ', '/opt/eff.org/certbot/venv']' returned non-zero exit status 1

這種錯誤

使用:pip install --upgrade virtualenv==16.7.9升級即可

沒有報錯的話會出現如下提示:

可以看到證書存放地址以及域名過期時間

進入目錄查看一下

這里只展示單域名,現在通配符泛域名解析letsencrypt也是支持的了,但是需要DNS解析,我這里以后有需要會寫出方法

  • certbot自動定時續期證書方法

certbot renew #手動測試,查看證書過期時間

certbot renew --force-renewal #忽略證書過期時間,直接重置證書時間

crontab -e #定時任務

0 0 1 * * /usr/bin/certbot renew --force-renewal #編輯文件

三、frp自身進行反向代理實現https

  • 為了體現內網穿透,這里我們准備了一台服務端和一台客戶端,系統分別是CentOS和WindowsServer,具體情況具體分析吧

需要注意的是這里的證書是放在客戶端下的

服務端配置(Linux上frps.ini)

[common]
bind_port=7000                       #服務端端口
#privilege_token=*******             #客戶端連接憑證
max_pool_count=5                     #最大連接數
vhost_http_port = 80                 #客戶端http映射的端口
vhost_https_port = 443               #客戶端https映射的端口
dashboard_port=7505                  #服務端看板的訪問端口
dashboard_user=root                  #服務端看板賬戶
dashboard_pwd=***                    #服務端看板賬戶密碼

配置完之后運行服務端

Linux : ./frps -c ./frps.ini

Windows : 進入目錄frps.exe

服務端配置完成

客戶端配置(Windows上frpc.ini)

server_addr = 192.168.100.100                    #服務端的IP地址,好像也可以寫域名,沒試過
server_port = 7000                               #服務端端口

[test_http]                                      #Http服務,映射的是服務端http80端口
type = http                                      #服務方式
local_ip = 127.0.0.1                             #服務端ip,可寫本地,局域網等做反向代理的ip
local_port = 8000                                #服務端端口
custom_domains = test.test.com                   #需要反向代理的域名,就是服務端要代理的域名

[test_https]                                     #Https服務,映射的是服務端https443端口
type = https                                     #服務方式
local_ip = 127.0.0.1                             #服務端ip,可寫本地,局域網等做反向代理的ip
local_port = 8000                                #服務端端口
custom_domains = test.test.com                   #需要反向代理的域名,就是服務端要代理的域名

# 以下為https新加的內容
plugin = https2http                             #將 https請求轉換成http請求后再發送給本地服務
plugin_local_addr = 127.0.0.1:8000              #轉換http后的端口  

#證書相關配置
plugin_crt_path = C:\Users\Administrator\Desktop\test.test.com\fullchain1.crt  #linux下生成的證書為fullchain.pem格式,復制到Windows上改成.crt后綴即可
plugin_key_path = C:\Users\Administrator\Desktop\test.test.com\privkey1.key    #linux下生成的證書為privkey.pem格式,復制到Windows上改成.key后綴即可
plugin_host_header_rewrite = 127.0.0.1            
plugin_header_X-From-Where = frp

配置完之后運行服務端

Linux : ./frpc -c ./frpc.ini

Windows : 進入目錄frpc.exe

服務端配置完成

關於frp命令的后台啟動方法

使用systemctl來控制啟動
```sudo vim /lib/systemd/system/frps.service````

寫入以下內容

[Unit]
Description=fraps service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
#啟動服務的命令(此處寫你的frps的實際安裝目錄)
ExecStart=/yourpath/frps -c /yourpath/frps.ini
[Install]
WantedBy=multi-user.target

然后就啟動frps
sudo systemctl start frps
再打開自啟動
sudo systemctl enable frps

如果要重啟應用,可以這樣,sudo systemctl restart frps

如果要停止應用,可以輸入,sudo systemctl stop frps

如果要查看應用的日志,可以輸入,sudo systemctl status frps

就可以運行了

frp官方文檔:https://github.com/fatedier/frp/blob/master/README_zh.md 建議多讀官方的文檔

frps完整版配置文件:https://github.com/fatedier/frp/blob/master/conf/frps_full.ini

frpc完整版配置文件:https://github.com/fatedier/frp/blob/master/conf/frpc_full.ini

四、 Nginx+frp的配置

這里的環境也是一台服務端和一台客戶端,系統分別是CentOS和WindowsServer

需要注意的是這里的證書是放在服務端下的

Nginx這里不介紹安裝了

直接上配置文件 .conf

server 
	{
        listen 80;                                                               # http對應端口
	listen 443 ssl;                                                          # https對應端口,
  	ssl_certificate /etc/letsencrypt/live/test.test.com/fullchain.pem;       # 證書存放位置
  	ssl_certificate_key /etc/letsencrypt/live/test.test.com/privkey.pem;     # 證書存放位置
        server_name *.test.test.com;                                             # ip,域名,我這里以泛域名舉例,畢竟是做反向代理,http就不用配置了
                                                                                 # https還可以做其他安全配置,需要的去看其他文章
    location / {
        proxy_pass  http://127.0.0.1:12369;                                      # 映射的frp服務端frps.ini的 vhost_http_port端口
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_max_temp_file_size 0;
        proxy_redirect off;
        proxy_read_timeout 240s;
    }
                                                                                 # 我這里沒做http強制轉換為https,有需要的可以做一下
        error_page   500 502 503 504  /50x.html; 
  	location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

改完了記得重載配置

服務端配置(Linux上frps.ini)

[common]
bind_port=7000                       #服務端端口
#privilege_token=*******             #客戶端連接憑證
max_pool_count=5                     #最大連接數
vhost_http_port = 12369              #客戶端http映射的端口,就是上面Nginx的proxy_pass對應端口
vhost_https_port = 12399             #客戶端https映射的端口
dashboard_port=7505                  #服務端看板的訪問端口
dashboard_user=root                  #服務端看板賬戶
dashboard_pwd=***                    #服務端看板賬戶密碼

配置完之后還是運行服務端測試一下

Linux : ./frps -c ./frps.ini

Windows : 進入目錄frps.exe

客戶端配置(Windows上frpc.ini)

server_addr = 192.168.100.100                    #服務端的IP地址,好像也可以寫域名,沒試過
server_port = 7000                               #服務端端口

[test_http]                                      #Http服務,映射的是服務端http80端口
type = http                                      #服務方式
local_ip = 127.0.0.1                             #服務端ip,可寫本地,局域網等做反向代理的ip
local_port = 8000                                #服務端端口
custom_domains = test.test.com                   #需要反向代理的域名,就是服務端要代理的域名

配置完之后還是運行客戶端測試一下

Linux : ./frpc -c ./frpc.ini

Windows : 進入目錄frpc.exe

到此的話應該就沒有其他問題了

參考文章:https://cloud.tencent.com/developer/article/1581948


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM