Post
通过SSH反向代理和socat实现本地服务端口的公网映射
通过SSH反向代理和socat实现本地服务端口映射到公网
概述
本文介绍如何通过SSH反向代理和socat工具,将本地服务的端口映射到公网,实现远程访问。适用于需要临时暴露本地服务(如数据库、Web服务)的场景,支持TCP/UDP协议及Unix Socket转发。
核心概念
- SSH反向代理:通过SSH协议建立隧道,将远程服务器的端口转发到本地服务。
- socat:多功能网络工具,支持多种协议(TCP/UDP/Unix Socket)的端口映射与数据转发。
工作原理
SSH反向代理
- 建立SSH连接:本地主机(hosta)通过SSH连接到具有公网IP的远程服务器(hostb)。
- 端口映射:在SSH命令中指定
-R参数,将本地端口(如8080)映射到远程服务器的指定端口(如1080)。 - 数据转发:远程用户通过访问 hostb 的公网IP和映射端口(如
http://12.34.56.78:1080),实际访问的是 hosta 的本地服务。
socat 端口映射
socat 可通过以下方式实现更灵活的映射:
- Unix Socket映射:将远程服务的Unix Socket转发到本地路径。
- TCP/UDP转发:将远程端口映射到本地端口,支持协议转换。
使用方法
1. SSH反向代理(TCP)
场景:本地Web服务监听在 hosta:8080,需通过公网访问。
步骤:
- 在 hosta 执行命令:
ssh -R 1080:localhost:8080 root@12.34.56.7812.34.56.78为远程服务器的公网IP。- 访问地址:
http://12.34.56.78:1080。
注意事项:
- SSH隧道需保持连接,可后台运行或使用
tmux/screen。 - 需确保远程服务器允许SSH反向连接(防火墙/SSH配置)。
2. socat Unix Socket映射
场景:远程MySQL服务通过Unix Socket访问,需本地映射。
步骤:
- 在本地执行命令:
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" - 本地使用
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"'
常见问题
- 依赖公网IP:需远程服务器(hostb)具有公网IP,且SSH服务可访问。
- SSH隧道中断:长时间运行需保持SSH会话,或配置自动重连。
- 权限问题:Unix Socket映射需本地路径有写权限,远程服务需允许SSH连接。
总结
SSH反向代理和socat工具为临时暴露本地服务提供了灵活方案,适用于开发调试或小规模场景。选择时需根据协议类型(TCP/UDP/Unix Socket)和具体需求(如是否需持久化连接)决定工具和配置。