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

快速的问题 – 我运行两个Linux的盒子,一个我自己的桌面和其他我的VPS。 出于VPS端的安全原因,我select了与MySQL的套接字连接( /var/run/mysqld/mysql.sock )。 我知道我可以像这样隧道: ssh -L 3307:127.0.0.1:3306 [email protected]如果我设置远程SQL服务器来侦听某个端口,但我想知道的是我可以这样做: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sock从而隧道两个套接字,而不是两个端口?

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

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

    根据需要转发本地套接字

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

    然后

     mysql -S $SOCKET_DIR/mysqld.sock -u mysqluser -p 

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

    在那个时候,当问题被问到的时候,这是不可能的,但现在是可能的。

    你可以同时使用:UNIX => TCP和UNIX => UNIX转发。

    例如:

     ssh \ -R/var/run/mysql.sock:/var/run/mysql.sock \ -R127.0.0.1:3306:/var/run/mysql.sock \ somehost 

    从OpenSSH 6.7开始是可能的。

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

     ssh [email protected] -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 

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

    哈维尔的答案详细阐述,这对我的作品:

    ssh -f [email protected] -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"

    您需要fork才能在closures第一个连接后多次连接而无需死亡。 此外,socat让你指定一个地址绑定的方式是通过bind选项,而不是作为端口之前的地址。

    在这之后,只要正常连接到localhost:9999 。 然后去拆卸隧道

    ssh -f [email protected] "killall socat"

    (或类似的东西,你可以做更复杂的事情,涉及保持社会的PID)

    是的,你可以使用socat。

    首先用SSH进行TCP隧道。 然后使用这样的socat:

    socat unix-listen:/var/run/mysqld/mysqld.sock,fork,unlink-early tcp:127.0.0.1:3306

    然后授予新创build的套接字(chmod 777可能)

    从ssh 6.7开始,不再需要socat了。 您可以直接转发unix域套接字,如:

     ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock user@someremote 

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

    @mpontes'/ @ javier的答案的另一个修改

     ssh user@remoteserver -L 9999:localhost:9999 'socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done' 

    清洁器

     ssh user@remoteserver -L 9999:localhost:9999 ' socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$! trap "kill $pid" 0 while echo -ne " \b"; do sleep 5 done ' 

    PROS

    1. 在6.7以前的openssh上工作(如CentOS 7)
    2. 杀sash终止而不是必须重新ssh进入远程服务器socat
    3. 允许非公开的sshlogin(不像ijk解决scheme)

    特征

    1. 由于没有使用-f选项,您可以使用公钥并通过&在后台运行,也可以交互式login并使用Ctrl + Z并使用相同的$! 存储的PID。

    缺点

    1. 不能轻易使用-f ssh选项,因为这样会丢失ssh的pid。 这种方法依赖于在前台运行和Ctrl + C来杀死。
    2. 远比较复杂

    说明

    • socat ...& – 在远程服务器的后台运行socat
    • pid=$! – 存储pid
    • trap kill\ $pid 0 – 在bash终止时运行kill $pid
    • while :; sleep... while :; sleep... – 坐在一个无限循环
    • echo -ne \ \b – 回显空格,后跟退格键。 一旦ssh断开连接就会失败。 在sleep 5 ,这意味着socat可以在ssh之后运行5秒钟

    注意:实际上使用docker,端口2375 ,/ DOCKER_HOST='tcp://localhost:2375'和环境variablesDOCKER_HOST='tcp://localhost:2375' ,但是对于mysql来说应该是一样的

    更新

    使用SSH控件 ,您可以使用我的方式使用-f标志,只需添加以下标志

     -f -o ControlPath=~/.ssh/%C -o ControlMaster=auto 

    你会得到的

     ssh -f -o ControlPath=~/.ssh/%C -o ControlMaster=auto user@remoteserver -L 9999:localhost:9999 'set -m; socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done' 

    现在,您可以使用终止所有受控会话

     ssh -o ControlPath=~/.ssh/%C -O exit remoteserver 

    -o选项可以保存在你的.ssh/config文件中,也可以用-S代替(但你仍然需要-o ControlMaster