介紹
假設現有外網筆記本、云服務器、內網工作站三臺設備,希望使用外網筆記本通過云服務器轉發,訪問內網工作站;這里使用frp
進行內網穿透。
云服務器端配置
- 登錄騰訊輕量型云服務器控制臺,開放
轉發端口
、bind_port
以及deshboad
端口,其中deshboad
端口用來測試,可以不寫。
-
測試與公網服務器ssh鏈接
假設公網云服務器ip地址為
xx.xxx.xxx.xxx
,那么在外網筆記本的終端中,執行ssh ubuntu@xx.xxx.xxx.xxx
-
公網服務器端安裝frp程序包
ssh進入云服務器中之后,執行
wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.37.1_linux_amd64.tar.gz tar -zxvf frp_0.37.1_linux_amd64.tar.gz cp -r frp_0.37.1_linux_amd64 frp
-
查看文件
cd frp tree
在
frp
文件夾中,他們的文件結構是. ├── frpc ├── frpc_full.ini ├── frpc.ini ├── frps #云服務器中使用 ├── frps_full.ini ├── frps.ini #云服務器中使用 ├── LICENSE ├── nohup.out └── systemd ├── frpc.service ├── frpc@.service ├── frps.service └── frps@.service 1 directory, 12 files
-
修改
frps.ini
文件vim frps.ini
修改為如下內容,注意,其中的端口
6871
,6289
都是提前已經在防火墻中自定義好了的[common] # 云服務器儀表盤端口的用戶 dashboard_user = xxx # 云服務器儀表盤端口的密碼 dashboard_pwd = xxxxx dashboard_port = 6289 # 云服務器和內網工作站之間的連接建立端口 bind_port = 6000 # 通訊口令,寫復雜一些 token = xxxxxx
-
移動到系統文件夾下
cd .. sudo mv frp /usr/local/
-
設置開機啟動云服務器frps服務
sudo vim /etc/init.d/frps_start.sh
寫入
#!/bin/bash ### BEGIN INIT INFO # Provides: tuzixini # Required-Start: $local_fs $network # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: self define auto start # Description: self define auto start ### END INIT INFO sudo nohup /usr/local/frp/frps -c /usr/local/frp/frps.ini &
賦予權限
sudo chmod 755 /etc/init.d/frps_start.sh
設置自啟動
cd /etc/init.d sudo update-rc.d frps_start.sh defaults 90
-
啟動服務: 重啟云服務器,或者執行以下指令
**需要注意的是,**如果重啟之后,云服務器的frp服務沒有打開,就會導致個人工作站的frp服務啟動失敗,因此保證在啟動內網工作站的時候,云服務器的frp一定要是打開的。
cd /usr/local/frp sudo nohup ./frps -c frps.ini &
-
查看服務,或者停止服務(optional)
# 查看服務 systemctl status frp # 或者以下,可以查看到剛才的任務的進程id,假設為32567 ps -aux | grep frps # 殺掉進程 kill -9 32567
-
測試
在筆記本電腦中,打開瀏覽器輸入
你的公網ip:6289
輸入賬戶密碼,如果看到儀表盤就說明服務啟動成功了
內網工作站配置
直接打開命令終端,或者你自己ssh進去,
-
同樣下載安裝frp
wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.37.1_linux_amd64.tar.gz tar -zxvf frp_0.37.1_linux_amd64.tar.gz cp -r frp_0.37.1_linux_amd64 frp
-
修改
frpc.ini
文件[common] # 你的云服務器公網ip server_addr = xx.xxx.xxx.xxx # 云服務器端與工作站建立連接的端口,與bind_port一致 server_port = 6000 # 通信口令,與frps.ini文件中定義的一致 token = xxxxxx[ssh] type = tcp # 內網工作站在局域網中的ip,填寫127.0.0.1就行,不用管具體的值 local_ip = 127.0.0.1 # 設置內網工作站 要監聽ssh的端口 local_port = 22 # 云服務器監聽外部訪問的端口,即轉發端口 remote_port = 7000
-
移動到系統文件夾下
cd .. sudo mv frp /usr/local/
-
設置開機啟動內網工作站frpc
sudo vim /etc/init.d/frpc_start.sh
寫入
#!/bin/bash ### BEGIN INIT INFO # Provides: tuzixini # Required-Start: $local_fs $network # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: self define auto start # Description: self define auto start ### END INIT INFO sudo nohup /usr/local/frp/frpc -c /usr/local/frp/frpc.ini &
賦予權限
sudo chmod 755 /etc/init.d/frpc_start.sh
設置自啟動
cd /etc/init.d sudo update-rc.d frpc_start.sh defaults 90
-
重啟內網工作站,或者執行以下指令啟動服務
**需要注意的是,**如果重啟之后,云服務器的frp沒有打開,就會導致個人工作站的frp服務啟動失敗,因此保證在啟動內網工作站的時候,云服務器的frp一定要是打開的。
cd /usr/local/frp sudo nohup ./frpc -c frpc.ini &
-
查看服務,或者停止服務(optional)
# 查看服務 systemctl status frp # 或者以下,可以查看到剛才的任務的進程id,假設為32567 ps -aux | grep frpc # 殺掉進程 kill -9 32567
第二個內網工作站
云服務器端
和第一個工作站配置相似,只是它的frps.ini
中的bind_port
和第一個工作站不相同,需要在云服務器上面手動開放對應的端口號
-
重新創建一個新的
frps.ini
文件,假設為frps1.ini
,里面寫上新的口,再使用frps
運行它# 隨便設置一個不同的端口 bind_port = 1212 # 通信口令,可以跟第一個內網工作站不同,但是要和自己的相同 token = XXXXXXX
內網工作站端
和第一個工作站配置相似,只是它的frpc.ini
中的server_port
和remote_port
都和第一個工作站不相同,需要在云服務器上面手動開放對應的端口號
-
重新創建一個新的
frpc.ini
文件,假設為frpc1.ini
,里面寫上新的口,再使用frpc
運行它# 隨便設置一個不同的端口(需要提前在云服務器上手動開放) server_port = 1212 # 通信口令,可以跟第一個內網工作站不同,但是要和自己的相同 token = XXXXXXX[ssh] type = tcp # 內網工作站在局域網中的ip,填寫127.0.0.1就行,不用管具體的值 local_ip = 127.0.0.1 # 設置內網工作站frp要監聽的端口 local_port = 22 # 不同的轉發端口,同樣需要提前在云服務器上手動開放 remote_port = 5101
-
自動啟動方式,和第一個內網工作站相同。
使用
-
在外網筆記本的終端中,輸入
ssh -p [轉發端口][用戶名]@[ip]
其中,
用戶名
是想要訪問的內網工作站的對應賬戶名稱,ip
是云服務器公網ip;輸入的密碼也是內網工作站的密碼,轉發端口是上面提到的remote_port
內部基本流程和解釋
基本概念
外網筆記本、云服務器、內網工作站,在frp穿透方法中,需要在云服務器和內網工作站上進行部署;在frp穿透方法中,將會在云服務器上部署frps(frp服務端),內網工作站上部署frpc(frp客戶端);其中涉及到幾個概念:
- bind_port:定義在frps的配置文件中,用于指定云服務器上的一個端口,該端口用于監聽內網工作站與該端口的連接請求,內網工作站會通過云服務器公網ip地址,向云服務器該端口發送連接請求,通過該端口發送token后建立與云服務器的連接。 (但是云服務端并不通過這個口向內網工作站轉發外部數據)
- server_port: 定義在frpc的配置文件中,用處是,告訴內網工作站:“應該向云服務器的哪個端口發送建立連接請求?” 本質上和
bind_port
相同,都指的是云服務器上的一個端口,只是定義位置不同。 - remote_port: 定義在frpc的配置文件中,用于指定云服務器上的一個端口(即轉發端口),假設remote_port=7000,它的作用是,在內網工作站和云服務器建立和保持連接之后,內網工作站根據自己配置文件中指定的
remote_port=7000
告訴云服務器:“我要聽傳輸到你7000端口的數據,請把你7000端口接收到的數據轉發給我”,為什么定義到frpc配置中? - local_port:定義在frpc的配置文件中,假設
local_port=22
,它用于告訴云服務器:“你把7000端口接收的數據轉發給我的22端口,我在那里聽著”。
基本流程
在云服務器上預先開放兩個端口,一個7000端口作為bind_port,以及另一個6000端口作為接受外網訪問的轉發端口。
- 內網工作站通過frpc配置中的server_port和云服務器ip,通過一個隨機端口發送token和連接請求;
- 建立連接后,內網工作站根據frpc配置中的remote_port=6000指向云服務器中已經開放的6000端口,告訴云服務器請求將該6000端口數據轉發給自己的local_port端口;
- 云服務器隨即監聽請求中的6000端口接收到的數據,并通過自己的隨機端口,將接收到的外部訪問數據轉發給內網工作站frpc配置中定義的local_port端口。
- 內網工作站根據轉發的數據,判斷是否通過ssh密碼驗證,是否建立ssh通訊。
注意點
- 建立連接后,云服務器,一律將訪問
remote_port
的ssh類型數據轉發到內網工作站local_port
端口上;內網工作站local_port
不管,也不知道是云服務器上到底哪個port跟自己通訊的,甚至不知道是從云服務器上過來的數據,還是同一個內網的訪問數據,local_port
只是接收請求,但是能不能進一步建立ssh連接還需要進行密碼驗證。 - bind_port 端口和remote_port端口的設定不用擔心安全問題;bind_port 端口的通訊建立需要通過frpc以及frps配置文件中的token相互匹配驗證。云服務器remote_port端口本身就是要暴露在外部接收外部訪問的,它只是轉發remote_port端口的接受數據,與內網工作站的ssh建立需要通過內網工作站自身的賬戶密碼驗證。
- 通過內網穿透的方式,實現了將自己內網工作站的賬戶暴露在公網中,此時知道公網ip、轉發端口的人,都可以使用常見的“用戶名+密碼”組合嘗試登錄你的內網工作站,因此自己內網工作站的密碼需要非常復雜,否則可能會被外部暴力嘗試攻破。