frp端口复用内网穿透和ssh与scp的使用

有多台设备部署在车上,出问题时很难到现场定位,为了以防万一,在设备上安装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文件。毕竟定位问题也只是偶尔用一下,希望最好都用不上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值