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)
s.bind(ADDR)
s.listen(4)
while 1:
print("等待连接...")
client, addr = s.accept()
print ('连接的地址',addr)
data = client.recv(BUFSIZ*1024).decode()
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();
}
}
}
|