有多台设备部署在车上,出问题时很难到现场定位,为了以防万一,在设备上安装frp内网穿透功能。主要用到ssh功能,考虑到服务器不能开放太多端口,使用端口复用的tcpmux模式。
1. 下载软件
地址:https://github.com/fatedier/frp
选择release中对应的版本下载,注意0.61.1版本号要一致。
服务器用的是 frp_0.61.1_linux_amd64.tar.gz
设备端用的是 frp_0.61.1_linux_riscv64.tar.gz
2. 服务器部署
将 frp_0.61.1_linux_amd64.tar.gz 上传到服务器上,比如 /home/frp/目录下,
使用tar xf frp_0.61.1_linux_amd64.tar.gz 解压,cd frp_0.61.1_linux_amd64 进入目录下,可以看到有frps 和frps.toml ,服务器主要用到这两个文件。
修改frps.toml
bindPort = 7500
auth.token = "01234567abc#"
tcpmuxHTTPConnectPort = 5500
webServer.addr = "0.0.0.0"
webServer.port = 4500
# dashboard 用户名密码,可选,默认为空
webServer.user = "admin"
webServer.password = "123456"
bindPort 为设备上运行的frp客户端连接的端口
auth.token 相当于密钥,需要跟客户端填写一致
tcpmuxHTTPConnectPort 是ssh到设备上时连接的端口,端口复用这个选项一定要写
webServer 是服务器端管理页面的ip和端口,用户名和密码等。
创建一个frps.service文件:
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /home/frp/frp_0.61.1_linux_amd64/frps -c /home/frp/frp_0.61.1_linux_amd64/frps.toml
Restart=always
[Install]
WantedBy = multi-user.target
将文件拷贝到 /etc/systemd/system/文件夹下,更改执行权限,并运行。服务器端就部署好了。
chmod +x /etc/systemd/system/frps.service
sudo systemctl daemon-reload
sudo systemctl enable frps
sudo systemctl start frps
3. 客户端部署
将frp_0.61.1_linux_riscv64.tar.gz 解压开,拷贝 frpc和frpc.toml到设备上,比如/home/frp/文件夹下
修改frpc.toml文件:
serverAddr = "xx.xx.xx.xx"
serverPort = 7500
auth.token = "01234567abc#"
#[[proxies]]
#name = "ssh"
#type = "tcp"
#localIP = "127.0.0.1"
#localPort = 22
#remotePort = 4001
[[proxies]]
name = "machine-a"
type = "tcpmux"
multiplexer = "httpconnect"
customDomains = ["machine-a.example.com"]
localIP = "127.0.0.1"
localPort = 22
serverAddr 和 serverPort 为服务器对应的ip和端口
auth.token 与服务器上填写的一致
#[[proxies]] 屏蔽掉的这部分是一个端口对应一台设备的设置方法,简单但是比较浪费端口
name = "machine-a" 每个设备的名称设置成不一样,这样在服务器管理页面可以看出来是哪个设备
type = "tcpmux" 这个是tcpmux方式,端口复用
multiplexer = "httpconnect" 端口复用使用的是http协议
customDomains = ["machine-a.example.com"] 这里的域名可以随便填写。子域名最好是能区分出是哪个设备,因为使用ssh连接时需要带入这个域名进行区分是连接哪个设备
localIP和localPort是本机ssh服务端口
新建一个frpc.service 文件:
[Unit]
# 服务名称,可自定义
Description = frp client
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frpc的命令,需修改为您的frpc的安装路径
ExecStart = /home/frp/frpc -c /home/frp/frpc.toml
#为了能可靠重新连接,需要添加以下参数设置
Restart=always
RestartSec=60
StartLimitIntervalSec=0
StartLimitBurst=0
[Install]
WantedBy = multi-user.target
将 frpc.service文件拷贝到 /etc/systemd/system/ 目录下,修改执行权限并启动服务,客户端就部署好了:
chmod +x /etc/systemd/system/frpc.service
sudo systemctl daemon-reload
sudo systemctl enable frpc
sudo systemctl start frpc
4 ssh连接方法
因为使用了代理服务器中转,就不能通过端口直接ssh到设备了,下面提供两种方式,一种使用socat,一种使用nc, 有时候系统没有socat需要重新安装。
//使用socat连接
ssh -o 'proxycommand socat - PROXY:xx.xx.xx.xx:%h:%p,proxyport=5500'name@machine-a.example.com
//使用nc连接
ssh -o "ProxyCommand=nc -X connect -x xx.xx.xx.xx:5500 %h %p" name@machine-b.example.com
其中xx.xx.xx.xx为服务器ip,
name为设备端登入用户名
machine-a.example.com 为域名,以设备上填写的一致
这两种方式都能连接上,使用端口复用唯一麻烦的就是ssh连接时需要输入一大串,可以使用一个脚本ssh.sh简化输入:
#!/bin/bash
# 本脚本方便通过frp代理使用ssh连接到设备
# 使用例子:./ssh.sh machine-a
# 其中 machine-a为设备号,可以从frp服务端管理页面查询到
# 检查是否提供了参数
if [ -z "$1" ]; then
echo "Usage: $0 <device-name>"
exit 1
fi
# 获取设备名称参数
device_name="$1"
# 设置代理服务器的 IP 地址和端口
proxy_ip="xx.xx.xx.xxx"
proxy_port="5500"
domains="example.com"
# 设置用户名
username="name"
ssh_command="ssh -o 'proxycommand=nc -X connect -x ${proxy_ip}:${proxy_port} %h %p' ${username}@${device_name}.${domains}"
# 执行 SSH 命令
eval "$ssh_command"
这样只要输入ssh.sh machine-a 就可以连接到machine-a设备了。
5 scp使用
远程连接到设备,上传下载文件是正常操作,同样,因为使用代理服务器,不能直接scp,也需要借助socat或者nc:
//使用nc 上传文件filename
scp -o "ProxyCommand=nc -X connect -x xx.xx.xx.xx:5500 %h %p" filename name@machine-a.example.com:/home/frp/
//也可以使用socat
scp -o "ProxyCommand=socat - PROXY:xx.xx.xx.xx:%h:%p,proxyport=5500" filename name@machine-a.example.com:/home/frp/
//下载就是把后面两个参数对调一下
scp -o "ProxyCommand=nc -X connect -x xx.xx.xx.xx:5500 %h %p" name@machine-a.example.com:/home/frp/filename ./filename
当然,也可以使用一个脚本scp.sh 简化输入:
#!/bin/bash
# 本脚本方便通过frp代理使用scp与设备进行文件交互
# 使用例子:
# 传输文件到设备:./scp.sh filename.txt machine-a:/home/frp/filename.txt
# 从设备取文件:./scp.sh machine-a:/home/frp/filename.txt ./filename.txt
# 其中 machine-a为设备号,可以从frp服务端管理页面查询到
# 定义代理服务器信息
PROXY_HOST="xx.xx.xx.xx"
PROXY_PORT="5500"
REMOTE_USER="name"
REMOTE_DOMAIN=".example.com"
# 检查参数数量
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <source> <destination>"
echo "Example: $0 machine-a:/home/frp/frps.service ./frps.service"
echo "Example: $0 ./frps.service machine-a:/home/frp/frps.service"
exit 1
fi
# 获取源和目标路径
SOURCE=$1
DESTINATION=$2
# 判断是上传还是下载
if [[ $SOURCE == *":"* ]]; then
# 下载文件
REMOTE_PATH=${SOURCE%:*}
LOCAL_PATH=${SOURCE#*:}
scp -o "ProxyCommand=nc -X connect -x ${PROXY_HOST}:${PROXY_PORT} %h %p" "${REMOTE_USER}@${REMOTE_PATH}${REMOTE_DOMAIN}:${LOCAL_PATH}" "${DESTINATION}"
else
# 上传文件
LOCAL_PATH=${SOURCE%:*}
REMOTE_PATH=${DESTINATION%:*}
scp -o "ProxyCommand=nc -X connect -x ${PROXY_HOST}:${PROXY_PORT} %h %p" "${LOCAL_PATH}" "${REMOTE_USER}@${REMOTE_PATH}${REMOTE_DOMAIN}:${DESTINATION#*:}"
fi
这样输入:./scp.sh filename.txt machine-a:/home/frp/filename.txt
或者:./scp.sh machine-a:/home/frp/filename.txt ./filename.txt
就能愉快的传输文件了。将两个脚本拷贝到/usr/local/bin目录下,在任何位置都能直接运行了。
虽然看着有点繁琐,但是总算能ssh到设备,能scp文件。毕竟定位问题也只是偶尔用一下,希望最好都用不上。

4627

被折叠的 条评论
为什么被折叠?



