Post
通过SSH和socat实现远程端口转发与本地服务访问
概述
端口转发和Unix Socket映射是网络调试与服务访问的常用技巧,尤其在开发、测试场景中能快速打通本地与远程环境的连接。通过SSH和socat工具,可以将本地服务暴露到公网,或反向映射远程服务到本地,实现灵活的网络穿透。
核心概念
- SSH端口转发:通过
ssh -R命令建立反向隧道,将远程主机的端口映射到本地服务。 - socat:一个多功能的数据转发工具,支持Unix Socket、TCP/UDP等协议的双向通信。
工作原理
-
SSH反向端口转发
使用ssh -R [远程端口]:[本地地址]:[本地端口] [远程主机]命令,SSH会在远程主机上创建一个监听端口,将流量转发到本地指定端口。例如,ssh -R 1080:localhost:8080 root@hostb会将hostb的1080端口映射到hosta的8080端口。 -
socat Unix Socket映射
通过UNIX-LISTEN监听本地Socket,并通过SSH连接将数据转发到远程Unix Socket(如MySQL的/var/run/mysqld/mysqld.sock)。例如:1socat "UNIX-LISTEN:/local.sock" EXEC:"ssh user@remote 'socat STDIO UNIX-CONNECT:/remote.sock'"此方式可将远程服务的Socket“搬”到本地,实现无缝访问。
使用方法
1. SSH端口转发
- 场景:本地服务需被公网访问。
- 步骤:
- 在远程主机(hostb)上保持SSH服务运行。
- 在本地主机(hosta)执行:
1ssh -R 1080:localhost:8080 root@hostb_ip - 远程用户可通过
http://hostb_ip:1080访问本地服务。
2. socat Unix Socket映射
-
场景:访问远程数据库或本地无法直接连接的服务。
-
TCP映射示例:
1socat TCP-LISTEN:5500 EXEC:"ssh user@remote 'socat STDIO UNIX-CONNECT:/var/run/mysqld/mysqld.sock'"本地通过
mysql -P 5500连接远程MySQL服务。 -
UDP映射示例:
1socat udp-listen:1611 system:"ssh user@remote 'socat stdio udp-connect:target_ip:161'"将远程UDP端口161转发到本地1611端口。
示例
- Web服务映射:将本地8080端口映射到远程hostb的1080端口,远程用户通过
http://hostb_ip:1080访问。 - MySQL Socket映射:通过socat将远程MySQL的Unix Socket映射到本地文件
/var/run/mysqld.temp.sock,使用mysql -S /var/run/mysqld.temp.sock连接。
常见问题
- 权限问题:确保SSH用户有权限在远程主机创建Socket或监听端口。
- 防火墙限制:检查远程主机的防火墙是否放行相关端口(如1080、5500)。
- SSH连接中断:使用
-f参数让SSH后台运行,或配置SSH保持连接。 - socat语法错误:注意引号和命令嵌套,使用
EXEC参数时需正确转义。
总结
SSH端口转发和socat映射是轻量级的网络工具组合,适用于快速调试、服务暴露等场景。前者适合TCP端口映射,后者在处理Unix Socket和UDP转发时更具灵活性。掌握这两项技术,能显著提升跨网络环境的开发效率。