1. 程式人生 > 實用技巧 >內網穿透:使用frp配置公網與內網伺服器

內網穿透:使用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/

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