控制路由器后面的 Linux 机器

控制路由器后面的 Linux 机器

我正在尝试控制不受我控制的路由器后面的 Linux 机器上的 shell。

我的第一个想法是让客户端(路由器后面的盒子)通过 ssh 连接到我控制下的服务器并定期从 cron 转发本地 ssh 端口,如下所示:

client$ ssh -L 40000:localhost:22 root@server

它在我的私有的、安全性较低的服务器上运行正常,但在客户服务器上却失败了,客户服务器是经过 grsecurity 强化的 CentOS,2.6.24.5-grsec-xxxx-grs-ipv4-32 ([电子邮件保护])。我对 grsecurity 一无所知,尤其是不知道它在这个服务器上是如何配置的。AllowTCPForwarding 选项是 sshd_config 的默认选项,据说(截至 RTFM)是“是”,ssh -v 告诉我

debug1: Local connections to LOCALHOST:40000 forwarded to remote address localhost:22
debug1: Local forwarding listening on 127.0.0.1 port 40000.

但是当我尝试从该服务器 ssh 返回客户端时得到的只是“连接被拒绝”。

下一个想法:
在客户端:

client$ bash -i <in >out 2>err &
client$ ssh root@server 'cat <client.in' >in &
client$ ssh root@server 'cat >client.out' <out &
client$ ssh root@server 'cat >client.err' <err &

在服务器上:

server# cat client.out &
server# cat client.err &
server# cat >client.in
ls

所有这些,{client.,}{in,out,err},都是用 mkfifo 创建的命名管道。但不知何故,ssh 对我来说不起作用,没有任何东西可以通过网络传输。这部分适用于普通文件(非命名管道)和 tail -f。但我感觉这不是实现这一点的方法。而且担心纯文件变得太大,并被覆盖……这看起来不太好。

有什么想法吗?我在客户服务器上拥有 root 权限,但不想安装内核并造成严重破坏。

更新

澄清:客户将把客户端机箱安装在路由器后面的某个远程位置,我和客户都无法控制该位置。因此,路由器上没有端口转发或动态 DNS。只是一个在网络上某个地方具有私有 IP 的普通 Linux 机箱。我设想的第一个想法是使用比客户服务器安全性更低的服务器。我应该使用 grsecured 服务器。我能够从客户的 grsecured 服务器 ssh 到其他位置,所以这不是 iptables 问题。我还可以打开侦听端口(使用 nc -l)并连接到它们。

我从路由器后面的客户端连接到服务器,将一些高服务器端口(例如 40000)转发到客户端上的 ssh 端口,这样我就可以先从家里 ssh 到服务器,然后从服务器 ssh 到客户端。正如我所说,客户端不在我的网络中,并且位于不受我控制的路由器后面。

我没有在家里使用 ssh,客户端不是我开始这段奇妙旅程的机器。家、服务器和客户端位于三个不同的网络上。

答案1

我认为您以错误的方式建立了 SSH 隧道,因此您实际上是从您尝试访问的客户端到开放服务器建立隧道,而不是相反。您将无法使用 -L,因为您无法连接到客户端来建立隧道。

如果您控制的服务器上的 sshd_config 中的 GatewayPorts 处于打开状态,则前进的方法是使用反向隧道,例如: ssh -N -R 40000:localhost:22 user@server_under_your_control

答案2

只是对你的第一个解决方案的一个想法:你检查过 IPTABLES 没有阻止你的连接吗?也许你只需要在系统的防火墙中允许这样的流量。

答案3

您也可以尝试 Hamachi。我使用它的目的是相同的。Windows 版本是主要的开发路线,但也有 Linux 版本在流传。当我有更多时间并进行编辑时,我会找到一个链接。下面的指南实际上可能会将您链接到它。

http://en.wikipedia.org/wiki/Hamachi http://www.hackitlinux.com/50226711/using_hamachi_on_linux.php https://secure.logmein.com/US/products/hamachi2/download.aspx

答案4

你可能想要将 ssh 端口转发到另一个方向。即:

client# ssh -R 40000:localhost:22 clientLogin@yourServer

带有一些 SSH 密钥和其他东西,以及一个用于在它掉线时重新启动它的包装器。这将允许您通过 SSH 访问yourServer:40000并获取 shell client

相关内容