使用 FRP 将本地 SSH 服务暴露到远程主机
使用 FRP 将本地 SSH 服务暴露到远程主机
FRP(Fast Reverse Proxy)是一个高性能的反向代理应用,可以帮助我们穿透 NAT 和防火墙,将本地的服务暴露到公网上。在本篇博客中,我们将讲解如何使用 FRP 将本地的 SSH 服务暴露到远程主机,实现安全的远程访问。
1. 安装 FRP
首先,你需要从 FRP 的 GitHub 页面 下载适合你系统的版本。假设你已经成功解压 FRP 文件,并准备好 frpc
(客户端)和 frps
(服务器端)的可执行文件。
2. FRP 配置
FRP 配置分为两部分:客户端配置 (frpc.toml
) 和服务器端配置 (frps.toml
)。
FRP 服务器端配置 (frps.toml
)
在远程主机上配置 FRP 服务器。frps.toml
配置文件内容如下:
# frps.toml
bindPort = port1
FRP 服务器将监听 port1 端口,用于 FRP 客户端与 FRP 服务器之间的控制和数据传输。
客户端通过 FRP 服务器的port1端口与服务器建立连接,所有的代理服务请求和管理通信都会通过这个端口来进行。这是 FRP 服务器暴露的端口,客户端需要连接到此端口来请求访问服务。
在 frps.toml
配置中设置了 bindPort = port1
,这意味着 FRP 服务器在 port1 端口监听来自客户端的连接请求。
在 frpc.toml
配置中,客户端设置 serverPort = port1
,表示客户端连接到服务器的 port1 端口进行通信。
FRP 客户端配置 (frpc.toml
)
# frpc.toml
serverAddr = "127.0.0.1" # FRP 服务器地址,服务器和客户端在同一台机器上
serverPort = port1 # FRP 服务器端口,确保与 frps.toml 中的配置一致
[[proxies]]
name = "test-tcp" # 为该代理指定一个名称
type = "tcp" # 使用 TCP 协议进行代理
localIP = "127.0.0.1" # 本地机器的 IP 地址
localPort = 22 # 本地 SSH 服务的端口,默认 SSH 端口为 22
remotePort = port2 # 远程服务器上的端口port2,将会映射到本地的 22 端口
用于暴露本地服务(如 SSH)到远程主机。
客户端的本地服务(如 SSH 服务,默认是 22 端口)通过 FRP 被映射到远程服务器上的某个端口(如 port2 端口)。此端口是客户端的本地服务经过 FRP 隧道转发到远程服务器后的端口。
- 在
frpc.toml
配置文件中,localPort = 22
表示客户端本地服务(如 SSH)运行在 22 端口。 remotePort = port2
表示远程服务器上的端口号,用于通过 FRP 将本地 22 端口的流量转发到远程服务器的 port2 端口。
3. 启动 FRP 服务
在远程服务器上启动 FRP 服务器端:
./frps -c ./frps.toml
在本地机器上启动 FRP 客户端:
./frpc -c ./frpc.toml
4. 验证连接
当 FRP 客户端和服务器都成功启动后,本地机器上的 SSH 服务(通常运行在 22 端口)将被暴露到远程服务器的 port2 端口。你可以通过以下命令进行连接测试:
ssh -p port2 username@remote_host
5. 查看端口状态
你可以在远程服务器或本地机器上通过 netstat 命令查看端口是否成功监听。
在 Linux 上使用以下命令查看 port2 端口的状态:
netstat -na | grep port2
tcp 0 0 0.0.0.0:port2 0.0.0.0:* LISTEN
6. 总结
通过以上步骤,你可以使用 FRP 将本地的 SSH 服务暴露到远程服务器。这样,即使在 NAT 或防火墙后面,你也可以通过 FRP 安全地访问本地服务。FRP 提供了高效、灵活的端口转发机制,适合多种网络环境和使用场景。
为了避免每次ssh登录输入密码,可以配置公私钥。
PS: 如何配置公私钥
- 生成密钥对
ssh-keygen -t rsa -b 2048 -C "your_email@example.com"
-
秘钥添加到远程服务器
生成的公钥 (
~/.ssh/id_rsa.pub
) 添加到目标服务器的~/.ssh/authorized_keys
文件中。
ssh-copy-id user@remote_host # 公钥直接复制到远程服务器
- 使用私钥连接或者直接连接
ssh -i ~/.ssh/id_rsa user@remote_host
ssh user@remote_host