內網穿透:使用frp配置公網與內網服務器


單位的公網IP尚未申請,但項目需要上線進行測試。目前的狀態是在研究院內部可以通過連接WIFI訪問項目網站或接口,這稱之為內網訪問或局域網訪問,開發者一回家就沒辦法訪問了,為此,在開通公網IP之前我們先采用內網穿透允許外網訪問我們的項目。

內網穿透

所謂內網穿透,就是將內網某些接口,服務暴露到外網訪問。

需要內網穿透的場景原因如下:

  • 這個世界的IPv4是有限的,現在已經嚴重不足,在沒有普及v6之前,家用寬帶,大部分企業寬帶都是動態IP,就是電信預留一個IP池,當你寬帶上線時分配一個公網IP,一旦寬帶下線就回收IP。所以各位家用寬帶的IP地址難以確定,是動態的。這個IP可以在百度直接搜索IP查詢到。
  • 由於你家庭,單位擁有多台設備,這些設備都需要上網,所以你把上一條中所述的公網IP在進行內網映射,通過路由器,網關設備將網絡分為多條線(有線,無線)分配到每一台要上網的設備,這些設備屬於同一個內網,歸路由器管理,一般都是192.168.x.x。這樣的IP可以稱為內網IP,最后匯總到上一條中的公網IP(動態)上發送。

問題:

  • 這些攜帶內網IP的設備可以訪問外網,就是可以訪問互聯網。
  • 這些設備可以互相訪問,通過內網IP:192.168.x.x
  • 外網不能訪問這些設備,你不可能讓別人在瀏覽器輸入:192.168.x.x這樣的IP
  • 當你查詢你這些設備的真實IP(例如百度查詢自己IP),你發現所有設備都是同一個IP,所以在公網看來這些請求來自同一IP,這就是給你寬帶分配的公網IP。
  • 上一條,公網IP會變!所以即使你采用路由器映射端口到公網IP上,依然容易出現訪問時效問題。尤其是綁定了域名,一直變,就一直改DNS,DNS有緩存的,這就無解了。

采用內網穿透解決:

  • 你需要一個不變的公網IP,靜態IP
  • 你需要一個可以進行點對點通信的穿透軟件,包含客戶端,服務端
  • 無論客戶端怎么改變網絡環境都能訪問到服務端,所以將靜態IP的一台設備設定為服務端
  • 將請求發送到服務端(公網IP),服務端通過穿透軟件和客戶端通信,把請求分配給客戶端
  • 客戶端就是指我們內網的服務器了
  • 這些內網服務器通過公網的一台服務器就可以被外網訪問了
  • 公網服務器相當於一台反向代理

配置穿透

我們以frp這個穿透軟件為例,實現將我們單位的服務暴露到外網訪問,解決離開單位無法訪問項目服務的問題。

一台雲端服務器

購買一台雲端的服務器,擁有靜態的公網IP,例如阿里雲,騰訊雲的服務器。以下用ubuntu 18.04為例。

去這里下載frp包:

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

wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz
tar -xvf 包名

配置一下服務端,編輯frps.ini

[common]
bind_port = 7000
dashboard_port = 7500
# dashboard's username and password are both optional,if not set, default is admin.
dashboard_user = admin
dashboard_pwd = admin

第一個是frp所使用的端口,用於公網內網通信。

第二個是控制面板端口,可以通過訪問該網址查看frp運行狀態。

測試啟動frp服務:

./frps -c ./frps.ini

注意,這里啟動的是frps,意思是frp服務端,另一個frpc是客戶端,下面會講到

開機啟動frp

修改sysytemd下的frps.service

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Restart=on-failure
RestartSec=5s
ExecStart=/root/frp/frps -c /root/frp/frps.ini

[Install]
WantedBy=multi-user.target

這里,由於我的frp程序目錄名已經改為frp並且放在了root用戶目錄下,這里應該把ExecStart改為你frp所在的地址即可。

保存退出,把編輯好的service文件復制到systemd/system服務下:

cp ./systemd/frps.service /etc/systemd/system/

啟動服務:

#刷新服務列表:
systemctl daemon-reload

#設置開機自啟
systemctl enable frps
#關閉開機自啟
systemctl disable frps

#啟動服務
systemctl start frps
#停止服務
systemctl stop frps

至此公網上的服務端已經配置完畢,並且加入開機啟動。

內網服務器

同理,內網服務器我們需要配置frpc.ini:

frpc中c表示client

[common]
server_addr = 10.220.23.66
server_port = 7000

[ssh http]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8000

# [ssh http2]
# .....

這里,local_ip就是本地ip,localhost一般不需要改動,local_port是局域網內這台服務器暴露的端口,這里舉例80,remote_port是訪問公網服務器的端口,這里舉例8000。意思是,當你訪問10.220.23.66:8000的時候,會映射到內網192.168.x.x:80端口。所以你需要把服務跑在內網服務器的80端口,外網就可以通過穿透訪問到了。

其他端口也是同樣道理,可以配置多個ssh來映射多個服務到外網。

配置開機啟動:

同理,修改systemd下的frpc.service

[Unit]
Description=Frp Client Service
After=network.target
Wants=network.target

[Service]
Restart=on-failure
RestartSec=5s
ExecStart=/home/devil/App/frp/frpc -c /home/devil/App/frp/frpc.ini
ExecReload=/home/devil/App/frp/frpc reload -c /home/devil/App/frp/frpc.ini

[Install]
WantedBy=multi-user.target

復制到系統systemd下:

cp ./systemd/frpc.service /etc/systemd/system/

完畢!這樣離開了局域網依然可以訪問。


免責聲明!

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



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