frp实现SSH连接
跟上次用frp差不多,不过这次是在Linux上,不用桌面只是ssh。
在发布界面下载frp,由于服务器已经配置好了只用配置客户端。
编辑frpc.toml
serverAddr = "0.0.0.0" # 替换为服务器IP
serverPort = 7000 #与frps.toml保持一致
log.to = "./frpc.log"
log.level = "info"
log.maxDays = 3
auth.method = "token"
auth.token = "111" #与frps.toml保持一致
transport.tls.enable = true # 传输使用tls加密确实是有用的,不写也可以因为默认开启
[[proxies]] # 这里应该不能改为别的名字,改了会报错,我也没仔细看实例
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22 # ssh默认端口
remotePort = 6000
然后要开启防火墙,只需要开启7000端口的出站就可以,还可以指定ip,使用ufw,sudo ufw allow out to 123.123.123.123 port 7000 proto tcp
然后数据从7000端口向服务器的7000端口发出连接申请,通过后在7000端口返回(这里不用配置入站因为防火墙默认允许返回数据),建立连接。之后就将frpc的22端口映射到了frps的6000端口(配置文件写的),这样有ssh连接到了frps的6000端口,就会由通过由frpc向frps申请到新的tcp连接传递到22端口,通信开始。
sequenceDiagram
participant User as SSH客户端
participant FRPS
participant FRPC
participant SSHD as 本地SSH服务
FRPC->>FRPS: 1. 建立控制连接 (frps:7000)
Note right of FRPC: 申请请求6000端口的数据
loop
FRPC<<->>FRPS: 心跳包保持控制连接
end
User->>FRPS: 2. SSH连接请求 (frps:6000)
FRPS->>FRPC: 3. 通过控制连接发送指令<br>分配X端口用于连接
FRPC->>FRPS: 4. 使用本地随机端口Y<br>建立数据连接 (frps:X端口)
Note over FRPS: 5. 核心操作:桥接
FRPS->>FRPS: 将 [User↔6000] 连接与<br>[FRPC↔X端口] 数据通道对接
User->>FRPS: 6. SSH数据包 (frps:6000)
FRPS->>FRPC: 7. 通过数据通道转发
FRPC->>SSHD: 8. 发送给本地22端口
SSHD->>FRPC: 9. SSH响应
FRPC->>FRPS: 10. 通过数据通道返回
FRPS->>User: 11. 返回给用户
然后可以手动运行./frpc -c frpc.toml,应该是没有输出,但是frps的日志会显示连接成功。(注意不要开启代理,全局代理也会转发端口引发不必要的混乱)
同样可以创建systemd服务,在/etc/systemd/system/frpc.service
[Unit]
Description=FRP Clinet Service
[Service]
Type=simple
# WorkingDirectory=/usr/local/frp # 这里设置工作目录不知道有没有用,注释掉了,还是要用绝对路径
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.toml
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
之后就可以用systemd管理。
sudo systemctl daemon-reload
sudo systemctl start frpc.service
sudo systemctl enable frpc.service
sudo systemctl status frpc.service
关于ssh登录
在ssh客户端机器使用ssh-keygen -t ed25519生成密钥对,保存在自定位置,然后可以直接使用ssh-copy-id -i /path/to/ssh.pub -p 6000 user@ip,直接将公钥添加到要连接的ssh机器上的~/.ssh/authorized_keys中。
然后记得禁用密码登录,在/etc/ssh/sshd_config
PasswordAuthentication no # 将 yes 改为 no
PubkeyAuthentication yes # 确保这是 yes
可以配置~/.ssh/config让登录更方便。
Host frpc
HostName 123.123.123.123
Port 6000
IdentityFile path/to/ssh/key
User username
这样就可以使用ssh frpc代替ssh -p 6000 -i path/to/ssh/key [email protected]