Frp---樹莓派4B內網穿透
Frp---樹莓派4B內網穿透
吐槽一下:花生殼真tm 垃圾。啊~,舒服多了。
前言
開源免費,輕量級,很nice。
1、frp是一個高效能的反向代理應用,可以幫助您輕鬆地進行內網穿透,對外網提供服務, 支援tcp, udp, http, https等協議型別,並且web服務支援根據域名進行路由轉發。
2、frp內網穿透主要用於沒有公網IP的使用者,實現遠端桌面、遠端控制路由器、 搭建的WEB、FTP、SMB伺服器被外網訪問、遠端檢視攝像頭、除錯一些遠端的API(比如微信公眾號,企業號的開發)等。
介紹
使用環境:
客戶端-》 樹莓派
伺服器-》 阿里雲的伺服器,Ubuntu20
GitHub
releases釋出版本
https://github.com/fatedier/frp/releases
客戶端和伺服器版本一致就可以,我用的就是最新的,一次Success。
參考文件地址
伺服器端配置
上傳frps檔案
首先把 檔案frps
和frps.ini
上傳至伺服器
修改frps.ini
輸入
sudo vim frps.ini
frps.ini配置
[common] #繫結的埠, bind_port = 7000 #設定監聽 HTTP 請求埠為 8080 vhost_https_port = 8080 #使用 xx.xx.xx.xx:7500 訪問frp,展示你的資訊 dashboard_port = 7500 #進入 xx.xx.xx.xx:7500 所需要的使用者名稱和密碼 dashboard_user = admin dashboard_pwd = password # 自己設的token privilege_token = 123456 #log_file日誌檔案 log_file = ./frps.log #log_level記錄的日誌級別 log_level = info #log_max_days日誌留存天數 log_max_days = 3 #authentication_timeout超時時間 authentication_timeout = 0 #max_pool_count最大連結池,每個代理預先與後端伺服器建立起指定數量的最大連結數 max_pool_count = 50
啟動
使用命令列:
./frps -c ./frps.ini
接著使用xx.xx.xx.xx:7000
訪問
輸入使用者名稱和密碼
admin
password
會出現:
注如果訪問不成功的話,看看自己的對應的埠是否開啟
設定開機自啟
使用systemd
因為Ubuntu17之後使用的是systemd管理,Ubuntu16使用的是rc.local
沒有使用下面的命令可以下載
apt-get install systemd
apt-get install systemd-sysv
安裝 systemd 之後,在 grub 配置檔案中的 kernel 命令列指定下面的引數:
sudo vim /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT="quiet splash init=/lib/systemd/systemd"
然後重啟
sudo reboot
設定
進入解壓的目錄下:
使用下面命令列
sudo cp frps /usr/local/bin/frps && sudo mkdir /etc/frp && cp frps.ini /etc/frp/frps.ini
複製frps
到/usr/local/bin/
,複製frps.ini
到/etc/frp
編寫service檔案
注: 解壓後有個systemd
資料夾,裡面有官方給的frps.service
sudo vim /usr/lib/systemd/system/frps.service
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.ini
LimitNOFILE=1048576
TimeoutStartSec=30
ExecStop=/bin/kill $MAINPID
[Install]
WantedBy=multi-user.target
啟動 frp 並設定開機啟動
systemctl enable frps
啟動
systemctl start frps
檢視狀態
systemctl status frps
部分伺服器上,可能需要加 .service 字尾來操作,即:
systemctl enable frps.service
systemctl start frps.service
systemctl status frps.service
樹莓派端配置
上傳frpc檔案
配置 frpc.ini
[common]
server_addr = xx.xx.xx.xx
server_port = 7000
privilege_token = 123456
login_fail_exit = false
[myRaph_pi]
type = tcp
local_ip = 192.168.137.144
local_port = 8000
remote_port = 7389
如果其他配置,請參考模板
模板
[common]
server_addr = xx.xx.xx.xx #伺服器公網IP
server_port = 7000 #frp服務埠,需與frps.ini相同
privilege_token = 123456 #特權模式金鑰,需與frps.ini相同
log_file = /bin/frpc.log #日誌檔案儲存路徑
log_level = info #日誌記錄級別
log_max_days = 3 #日誌最大儲存天數
pool_count = 5
tcp_mux = true
[mytest] #服務名稱,可自定義
type = tcp #協議型別(tcp)
#這個是我樹莓派的內網地址,使用127.0.0.1連線錯誤
local_ip = 192.168.137.144
local_port = 8000 #本地服務埠
remote_port = 7389 #穿透後SSH服務訪問埠
#還未使用
[web] #服務名稱,可自定義
type = http #協議型別(http)
local_ip = 127.0.0.1
local_port = 80 #本地web服務埠
use_encryption = false
use_compression = true
subdomain = web #二級域名,建議與此項的服務名稱"web"設定為相同
custom_domains = web.frp.com #自定義域名
啟動
./frpc -c ./frpc.ini
出現 日誌資訊,連線成功之類的。
設定開機自啟
使用systemd
因為Ubuntu17之後使用的是systemd管理,Ubuntu16使用的是rc.local
沒有使用下面的命令可以下載
apt-get install systemd
apt-get install systemd-sysv
安裝 systemd 之後,在 grub 配置檔案中的 kernel 命令列指定下面的引數:
sudo vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash init=/lib/systemd/systemd"
然後重啟
sudo reboot
設定
進入解壓的目錄下:
使用下面命令列
sudo cp frps /usr/local/bin/frpc && sudo mkdir /etc/frp && cp frpc.ini /etc/frp/frpc.ini
複製frpc
到/usr/local/bin/
,複製frpc.ini
到/etc/frp
編寫service檔案
注: 解壓後有個systemd
資料夾,裡面有官方給的frpc.service
sudo vim /usr/lib/systemd/system/frpc.service
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Restart=on-failure
RestartSec=5s
TimeoutStartSec=30
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/local/bin/frpc reload -c /etc/frp/frpc.ini
ExecStop=/bin/kill $MAINPID
[Install]
WantedBy=multi-user.target
啟動 frp 並設定開機啟動
systemctl enable frpc
啟動
systemctl start frpc
檢視狀態
systemctl status frpc
部分伺服器上,可能需要加 .service 字尾來操作,即:
systemctl enable frpc.service
systemctl start frpc.service
systemctl status frpc.service
測試
樹莓派端 ---python
# 伺服器端程式碼
from socket import *
print ('我是服務端!')
HOST = ''
PORT = 8000
BUFSIZ = 1024
ADDR = (HOST, PORT) # 建立埠,規定緩衝區大小
s = socket(AF_INET, SOCK_STREAM) # 建立TCP socket物件
s.bind(ADDR) # 繫結地址
s.listen(4) # 監聽TCP,4代表:作業系統可以掛起(未處理請求時等待狀態)的最大連線數量。該值至少為1
while 1:
print("等待連線...")
client, addr = s.accept() # 開始被動接受TCP客戶端的連線。
print ('連線的地址',addr)
data = client.recv(BUFSIZ*1024).decode() # 接受TCP資料 decode是由於此處接受bytes而不是 str型別
print("接收到資料:",data)
client.close()
s.close()
windows端 ---java
package pojo;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
public static void main(String[] args) throws InterruptedException {
Scanner input = new Scanner(System.in);
try {
// 和伺服器建立連線
Socket socket = new Socket("你的伺服器公網ip",7389);
// 要傳送給伺服器的資訊
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
System.out.println("請輸入:");
String res = input.next();
pw.write(res);
pw.flush();
socket.shutdownOutput();
os.close();
pw.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}