上次用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]