将本地端口或套接字文件转发到远程套接字文件

35 mysql ssh port-forwarding socket socat

快速提问 - 我运行两个 linux 机器,一个是我自己的桌面,另一个是我的 VPS。出于 VPS 端的安全原因,我选择了与 MySQL ( /var/run/mysqld/mysql.sock) 的套接字连接。我知道我可以像这样ssh -L 3307:127.0.0.1:3306 user@site.com建立隧道:如果我设置远程 sql server 来监听某个端口,但我想知道的是我可以做这样的事情:ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sock从而隧道两个套接字,而不是两个端口?

一个完全可以接受的解决方案也是将本地端口转发到远程套接字文件,但在可能的情况下,我试图不在远程机器上运行 tcp 服务器。

(是的,我知道 tcp 会更容易)。

小智 45

虽然在当时问这个问题的时候,确实是不可能的,但是现在可以了。

您可以同时进行:UNIX=>TCP 和 UNIX=>UNIX 转发。

例如:

ssh \
  -R/var/run/mysql.sock:/var/run/mysql.sock \
  -R127.0.0.1:3306:/var/run/mysql.sock \
  somehost
Run Code Online (Sandbox Code Playgroud)

从 OpenSSH 6.7 开始就可以了。

  • 我设法使用上面的方法将本地套接字转发到远程服务器套接字,并远程运行 docker 客户端(可以直接通过 ssh 完成,但其中的乐趣在哪里:) `ssh -L /home/user/docker.sock:/ var/run/docker.sock dockerhost -N` (3认同)

ijk*_*ijk 38

按需转发本地套接字

  • 设置 SSH 公钥认证
  • socat两端安装
  • 在本地为您的套接字创建一个目录,其他用户无法访问。
export SOCKET_DIR=~/.remote-sockets
mkdir -p $SOCKET_DIR
socat "UNIX-LISTEN:$SOCKET_DIR/mysqld.sock,reuseaddr,fork" \
EXEC:'ssh user@server socat STDIO UNIX-CONNECT\:/var/run/mysqld/mysqld.sock'
Run Code Online (Sandbox Code Playgroud)

然后

mysql -S $SOCKET_DIR/mysqld.sock -u mysqluser -p
Run Code Online (Sandbox Code Playgroud)

使用 ssh 和 socat 转发 unix 域套接字中被盗


Jav*_*ier 11

我还没有这样做,但我会尝试使用socat。也许是这样的:

ssh xxx@yyy.zzz -L 9999:localhost:9999 "socat TCP-LISTEN:localhost:9999 UNIX-CONNECT:/var/run/mysqld/mysql.sock"
socat UNIX-LISTEN:/path/to/local/socket TCP:localhost:9999
Run Code Online (Sandbox Code Playgroud)

再说一次,我从来没有做过这样的事情。


CMC*_*kai 8

自 ssh 6.7 起不再需要 socat。您可以直接转发 unix 域套接字,例如:

ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock user@someremote
Run Code Online (Sandbox Code Playgroud)

更多信息:https : //medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160