單位的公網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/
完畢!這樣離開了局域網依然可以訪問。