据我了解,防火墙(假设默认设置)拒绝所有没有先前对应的传出流量的传入流量。
基于Reversing an ssh connection和SSH Tunneling Made Easy,反向 SSH 隧道可用于绕过烦人的防火墙限制。
我想在远程机器上执行 shell 命令。远程机器有自己的防火墙,并在附加防火墙(路由器)后面。它有一个像 192.168.1.126(或类似的东西)这样的 IP 地址。我不在防火墙后面,我知道从 Internet 上看到的远程机器的 IP 地址(不是 192.168.1.126 地址)。此外,我可以要求某人ssh (something)
首先在远程机器上以 root身份执行。
谁能一步一步地向我解释反向 SSH 隧道如何绕过防火墙(本地和远程机器的防火墙以及它们之间的附加防火墙)?
开关 ( -R
, -f
, -L
, -N
)的作用是什么?
相关问题:启动服务器到客户端的ssh连接
那里的回答对我帮助很大,这个命令可以满足我的需求:
ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
Run Code Online (Sandbox Code Playgroud)
所以我写了脚本来一直重新连接:
#!/bin/bash
while true; do
echo "try to connect..."
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
echo "restarting in 5 seconds.."
sleep 5
done
Run Code Online (Sandbox Code Playgroud)
并将其添加到/etc/crontab
. 但是我发现如果我只从 shell 中“手动”执行它,它就可以工作,但是如果它被 cron 调用,ssh 会连接并立即完成。(所以,上面的脚本一直重新连接)
从man ssh
,我发现对于后台连接,我应该用-n
密钥调用它,但它没有帮助。然后,我只是环顾四周寻找类似的脚本,我发现如果我调用它就可以工作tail -f something
,即一些“永无止境”的命令,所以我刚刚创建了一个空文件/tmp/dummy_file
,现在我的 ssh 命令如下所示:
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
Run Code Online (Sandbox Code Playgroud)
它现在有效!但是,这个解决方案似乎有点难看,而且我真的不明白这种行为的实际原因。碰巧,我试图调用bash
而不是tail -f
(bash
在我看来也是“永无止境”的命令),但它不起作用。
那么,任何人都可以解释这种行为,以及创建后台 ssh 连接以保持反向 ssh 隧道的正确方法是什么?