前言
通过 SSH 本地端口转发,可以将远程服务映射到本地的端口或者 Unix Socket,实现对远程服务的安全访问。本文介绍如何将 SSH 端口转发配置为 systemd 服务,实现 SSH 连接保活和开机自启。
路由器 HTTP 端口转发为本地 Unix Socket
下面的 systemd 单元文件示例,将路由器(OpenWRT)上的 80 端口通过 SSH 安全地转发到本地 Unix Socket,便于本地服务(如 Caddy)直接访问。这样可以安全地将 OpenWRT 的 HTTP 服务反向代理为 HTTPS,无需在路由器上配置证书。
|
|
配置说明:
- 启动前自动清理旧的 Unix Socket 文件,避免冲突。
- 通过 SSH 隧道将远程 80 端口映射到本地 Unix Socket。
- 服务异常断开时自动重启,保证隧道持续可用。
StartLimitIntervalSec=0
设置让 systemd 服务不受失败后重启次数限制。 - 配置为多用户模式下自动启动,实现开机自启。
ssh 命令详解:
|
|
-n
:重定向标准输入到 /dev/null,防止命令阻塞,适合自动化场景。-N
:不执行远程命令,仅建立端口转发。-T
:不分配伪终端,提升安全性。-L /home/debian/podman-volumes/caddy/router-ssh.sock:127.0.0.1:80
:本地监听 Unix Socket,将所有连接通过 SSH 隧道转发到远程主机的 127.0.0.1:80 端口。op@openwrt
:以 op 用户身份连接到 openwrt 主机。
远程 Docker Socket 转发为本地 Socket
以下 systemd 单元文件将远程主机(remote)上的 Docker Socket 通过 SSH 转发到本地,便于本地程序访问远程 Docker 服务。这样可以方便地在本地使用 Portainer 等工具管理远程 Docker,无需额外安装软件。
|
|
使用方法
-
将上述内容分别保存为
/etc/systemd/system/router-ssh-tunnel.service
和/etc/systemd/system/remote-docker-socket.service
。 -
重新加载 systemd 配置:
1
sudo systemctl daemon-reload
-
启动并设置开机自启:
1 2
sudo systemctl enable --now router-ssh-tunnel sudo systemctl enable --now remote-docker-socket
安全提示
SSH 端口转发需要远程 SSH 登陆所需要的证书或者密码,所以仅建议在可以确认本地环境安全的情况下使用。