借助FRP反向代理實現內網穿透



一、frp 是什么?

frp 是一個專注於內網穿透的高性能的反向代理應用,支持 TCP、UDP、HTTP、HTTPS 等多種協議。可以將內網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。

frp原理
frp原理

二、frp的文檔

三、frp的代碼

https://github.com/fatedier/frp/

四、frp的下載

https://github.com/fatedier/frp/releases/tag/v0.33.0

一般選擇:

  • frp_0.33.0_linux_amd64.tar.gz
    解壓之后frps開頭是服務端、frpc開頭的是客戶端,並包括各自的配置樣例文件。另外,systemd是啟動關閉服務用的。

  • frp_0.33.0_windows_amd64.zip

五、服務端配置要點

cp frps.ini /etc/frp/frps.ini
vim /etc/frp/frps.ini
========================================================================
[common]
bind_port = 7000
vhost_http_port = 8080
# 配置dashboard可以使用web界面管理frp
# 通過 http://[server_addr]:7500 訪問 Dashboard 界面,用戶名密碼默認都為 admin。
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin

cp frps /usr/bin

cd systemd
cp frps.service /usr/lib/systemd/system

systemctl start frps.service
systemctl status frps.service
systemctl enable frps.service

六、客戶端配置要點

cp frpc.ini /etc/frp/frpc.ini

vim frpc.ini
==================================================================
[common]
server_addr=x.x.x.x # frps的地址
server_port=7000

[web]
type=http
local_ip=127.0.0.1
local_port=8080
custom_domains=a.domain.com

# 測試
./frpc -c frpc.ini 

# 加入系統服務
cp frpc /usr/bin

cd systemd
cp frpc.service /usr/lib/systemd/system

systemctl start frpc.service
systemctl status frpc.service
systemctl enable frpc.service

七、Windows下如何注冊服務

下載winsw開源軟件注冊windows系統服務。
winsw的下載地址:https://github.com/winsw/winsw

下載好后把winsw.exe放在frpc的同級目錄並且編寫一個xml配置文件(myapp.xml)

<service>
    <id>frp</id>
    <name>frp這里是服務的名稱</name>
    <description>這里是服務的介紹,隨便寫</description>
    <executable>frpc</executable>這里是運行的軟件名    
    <arguments>-c frpc.ini</arguments>這里是運行的軟件配置文件    
    <onfailure action=”restart” delay=”60 sec”/>
    <onfailure action=”restart” delay=”120 sec”/>
    <logmode>reset</logmode>
</service>

然后以管理員啟動cmd命令窗口,cd到frp目錄,執行兩條命令winsw install和winsw start就行了。
如果要卸載先執行winsw stop再執行winsw uninstall。

八、為本地 HTTP 服務啟用 HTTPS

通過 https2http 插件可以讓本地 HTTP 服務轉換成 HTTPS 服務對外提供。
frps.ini 內容如下:

[common]
bind_port = 7000

frpc.ini 內容如下:

[common]
server_addr = x.x.x.x
server_port = 7000

[test_htts2http]
type = https
custom_domains = test.yourdomain.com

plugin = https2http
plugin_local_addr = 127.0.0.1:80

# HTTPS 證書相關的配置
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp

分別啟動 frps 和 frpc。
通過瀏覽器訪問 https://test.yourdomain.com

九、安全地暴露內網服務

對於某些服務來說如果直接暴露於公網上將會存在安全隱患。

使用 stcp(secret tcp) 類型的代理可以避免讓任何人都能訪問到要穿透的服務,但是訪問者也需要運行另外一個 frpc 客戶端。

frps.ini 內容如下:

[common]
bind_port = 7000

在需要暴露到內網的機器上部署 frpc,且配置如下:

[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh]
type = stcp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22

在想要訪問內網服務的機器上也部署 frpc,且配置如下:

[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh_visitor]
type = stcp
# stcp 的訪問者
role = visitor
# 要訪問的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 綁定本地端口用於訪問 SSH 服務
bind_addr = 127.0.0.1
bind_port = 6000

通過 SSH 訪問內網機器,假設用戶名為 test:

ssh -oPort=6000 test@127.0.0.1

十、轉發 DNS 查詢請求

DNS 查詢請求通常使用 UDP 協議,frp 支持對內網 UDP 服務的穿透,配置方式和 TCP 基本一致。

frps.ini 內容如下:

[common]
bind_port = 7000

frpc.ini 內容如下:

[common]
server_addr = x.x.x.x
server_port = 7000

[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000

這里反代了 Google 的 DNS 查詢服務器的地址,僅僅用於測試 UDP 代理,並無實際意義。
分別啟動 frps 和 frpc。

通過 dig 測試 UDP 包轉發是否成功,預期會返回 www.baidu.com 域名的解析結果。

dig @x.x.x.x -p 6000 www.baidu.com

十一、通過自定義域名訪問內網的 Web 服務

HTTP 類型的代理相比於 TCP 類型,不僅在服務端只需要監聽一個額外的端口 vhost_http_port 用於接收 HTTP 請求,還額外提供了基於 HTTP 協議的諸多功能。

修改 frps.ini 文件,設置監聽 HTTP 請求端口為 8080:

[common]
bind_port = 7000
vhost_http_port = 8080

修改 frpc.ini 文件,假設 frps 所在的服務器的 IP 為 x.x.x.x,local_port 為本地機器上 Web 服務監聽的端口, 綁定自定義域名為 custom_domains。

[common]
server_addr = x.x.x.x
server_port = 7000

[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com

[web2]
type = http
local_port = 8080
custom_domains = www.yourdomain2.com

分別啟動 frps 和 frpc。

將 www.yourdomain.com 和 www.yourdomain2.com 的域名 A 記錄解析到 IP x.x.x.x,如果服務器已經有對應的域名,也可以將 CNAME 記錄解析到服務器原先的域名。或者可以通過修改 HTTP 請求的 Host 字段來實現同樣的效果。

通過瀏覽器訪問 http://www.yourdomain.com:8080 即可訪問到處於內網機器上 80 端口的服務,訪問 http://www.yourdomain2.com:8080 則訪問到內網機器上 8080 端口的服務。

十二、安全的SSH內網穿透案例

  • frps的配置(代理服務器)
vim /etc/frp/frps.ini
===========================================================
[common]
bind_port = 7000
privilege_token = serverAuthKey
  • frpc的配置(被代理的內網客戶端)
vim /etc/frp/frpc.ini
===========================================================
[common]
server_addr = 192.168.74.205
server_port = 7000
privilege_token = serverAuthKey

[secret_ssh]
type = stcp
sk = match2publicUserKey
local_ip = 127.0.0.1
local_port = 22
use_encryption = true
use_compression = true
  • 公網用戶的frpc配置
vim /etc/frp/frpc.ini
===========================================================
[common]
server_addr = 192.168.74.205
server_port = 7000

[secret_ssh_visitor]
type = stcp
role = visitor
server_name = secret_ssh
sk = match2publicUserKey
bind_addr = 127.0.0.1
bind_port = 4567

啟動測試

./frpc -c ./frpc.ini
ssh -p 4567 bee@127.0.0.1

十三、Win10遠程桌面的代理

被代理的內網服務器 frpc.ini 內容如下:

[common]
server_addr = x.x.x.x
server_port = 7000

[RDP]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7002

遠端公網用戶mstsc,輸入x.x.x.x:7002即可內網穿透連接遠程桌面。


免責聲明!

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



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