SSH 本地端口转发的应用:HTTP 端口与 Docker Socket

以 systemd 服务方式运行

前言

通过 SSH 本地端口转发,可以将远程服务映射到本地的端口或者 Unix Socket,实现对远程服务的安全访问。本文介绍如何将 SSH 端口转发配置为 systemd 服务,实现 SSH 连接保活和开机自启。


路由器 HTTP 端口转发为本地 Unix Socket

下面的 systemd 单元文件示例,将路由器(OpenWRT)上的 80 端口通过 SSH 安全地转发到本地 Unix Socket,便于本地服务(如 Caddy)直接访问。这样可以安全地将 OpenWRT 的 HTTP 服务反向代理为 HTTPS,无需在路由器上配置证书。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Unit]
Description=router ssh tunnel
After=network.target nss-lookup.target
StartLimitIntervalSec=0

[Service]
User=debian
WorkingDirectory=/home/debian
ExecStartPre=-rm /etc/caddy/router-ssh.sock
ExecStart=ssh -nNT -L /etc/caddy/router-ssh.sock:127.0.0.1:80 op@openwrt
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

配置说明:

  • 启动前自动清理旧的 Unix Socket 文件,避免冲突。
  • 通过 SSH 隧道将远程 80 端口映射到本地 Unix Socket。
  • 服务异常断开时自动重启,保证隧道持续可用。StartLimitIntervalSec=0 设置让 systemd 服务不受失败后重启次数限制。
  • 配置为多用户模式下自动启动,实现开机自启。

ssh 命令详解:

1
ssh -nNT -L /etc/caddy/router-ssh.sock:127.0.0.1:80 op@openwrt
  • -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,无需额外安装软件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Unit]
Description=remote docker socket
After=network.target nss-lookup.target
StartLimitIntervalSec=0

[Service]
ExecStartPre=-mkdir /var/run/docker-socks ; -rm -f /var/run/docker-socks/remote.sock
ExecStart=ssh -nNT -L /var/run/docker-socks/remote.sock:/var/run/docker.sock root@remote
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

使用方法

  1. 将上述内容分别保存为 /etc/systemd/system/router-ssh-tunnel.service/etc/systemd/system/remote-docker-socket.service

  2. 重新加载 systemd 配置:

    1
    
    sudo systemctl daemon-reload
    
  3. 启动并设置开机自启:

    1
    2
    
    sudo systemctl enable --now router-ssh-tunnel
    sudo systemctl enable --now remote-docker-socket
    

安全提示

SSH 端口转发需要远程 SSH 登陆所需要的证书或者密码,所以仅建议在可以确认本地环境安全的情况下使用。

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计