Post

通过SSH反向代理和socat实现本地服务端口的公网映射

2026-04-30

通过SSH反向代理和socat实现本地服务端口映射到公网

概述

本文介绍如何通过SSH反向代理和socat工具,将本地服务的端口映射到公网,实现远程访问。适用于需要临时暴露本地服务(如数据库、Web服务)的场景,支持TCP/UDP协议及Unix Socket转发。

核心概念

  • SSH反向代理:通过SSH协议建立隧道,将远程服务器的端口转发到本地服务。
  • socat:多功能网络工具,支持多种协议(TCP/UDP/Unix Socket)的端口映射与数据转发。

工作原理

SSH反向代理

  1. 建立SSH连接:本地主机(hosta)通过SSH连接到具有公网IP的远程服务器(hostb)。
  2. 端口映射:在SSH命令中指定 -R 参数,将本地端口(如8080)映射到远程服务器的指定端口(如1080)。
  3. 数据转发:远程用户通过访问 hostb 的公网IP和映射端口(如 http://12.34.56.78:1080),实际访问的是 hosta 的本地服务。

socat 端口映射

socat 可通过以下方式实现更灵活的映射:

  • Unix Socket映射:将远程服务的Unix Socket转发到本地路径。
  • TCP/UDP转发:将远程端口映射到本地端口,支持协议转换。

使用方法

1. SSH反向代理(TCP)

场景:本地Web服务监听在 hosta:8080,需通过公网访问。
步骤

  1. 在 hosta 执行命令:
    ssh -R 1080:localhost:8080 root@12.34.56.78
    
    • 12.34.56.78 为远程服务器的公网IP。
    • 访问地址:http://12.34.56.78:1080

注意事项

  • SSH隧道需保持连接,可后台运行或使用 tmux/screen
  • 需确保远程服务器允许SSH反向连接(防火墙/SSH配置)。

2. socat Unix Socket映射

场景:远程MySQL服务通过Unix Socket访问,需本地映射。
步骤

  1. 在本地执行命令:
    socat "UNIX-LISTEN:/var/run/mysqld.temp.sock,reuseaddr,fork" EXEC:"ssh root@12.34.56.78 socat STDIO UNIX-CONNECT:/var/run/mysqld/mysqld.sock"
    
  2. 本地使用 mysql -S /var/run/mysqld.temp.sock 连接远程MySQL。

3. socat TCP/UDP端口映射

TCP示例:将远程MySQL映射到本地5500端口

socat TCP-LISTEN:5500 EXEC:'ssh root@12.34.56.78 "socat STDIO UNIX-CONNECT:/var/run/mysqld/mysqld.sock"'

UDP示例:将远程UDP 161端口映射到本地1611端口

socat udp-listen:1611 system:'ssh root@12.34.56.78 "socat stdio udp-connect:remotetarget:161"'

常见问题

  1. 依赖公网IP:需远程服务器(hostb)具有公网IP,且SSH服务可访问。
  2. SSH隧道中断:长时间运行需保持SSH会话,或配置自动重连。
  3. 权限问题:Unix Socket映射需本地路径有写权限,远程服务需允许SSH连接。

总结

SSH反向代理和socat工具为临时暴露本地服务提供了灵活方案,适用于开发调试或小规模场景。选择时需根据协议类型(TCP/UDP/Unix Socket)和具体需求(如是否需持久化连接)决定工具和配置。