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();
}
}
}