我正试图使在一个不受我控制的路由器后面的一个linux盒子上控制一个shell。
我的第一个想法是使客户端(路由器后面的框)ssh到我控制下的服务器,并定期从cron转发本地ssh端口,如下所示:
client$ ssh -L 40000:localhost:22 root@server
它适用于我私人的,安全性较低的服务器,但与客户服务器失败,这是一个危急的CentOS,2.6.24.5-grsec-xxxx-grs-ipv4-32([email protected])。 我不知道有关grsecurity的事情,尤其不是关于如何在此服务器上configuration的。 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.
但是当我试图从这个服务器回到客户端时,我所得到的是'连接被拒绝'。
下一个想法:
在客户端:
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创build的命名pipe道。 但不知何故ssh不为我工作,没有任何事情可以通过networking。 这部分工作与普通文件(不命名pipe道)和尾部-f。 但是,比我有这种感觉,这不是你如何做到这一点。 而对普通文件越来越大的担心和覆盖…它似乎并不漂亮。
有任何想法吗? 我有客户服务器的根,但宁愿不安装内核和肆虐。
UPDATE
说明:客户端盒子将由客户安装在路由器后面的一些远处,而我和客户都不能控制它们。 所以,路由器上没有端口转发或dynamicDNS。 networking上只有一个带有私有IP的简单Linux机器。 我想到的第一个想法可能是服务器不如客户服务器安全。 我应该使用grsecured之一。 我能够从客户的grsecured服务器ssh到其他地点,所以它不是一个iptables的问题。 我也能打开侦听端口(用nc -l)并连接到它们。
我从路由器后面的客户端连接到服务器,将一些高端服务器端口(例如40000)转发到客户端的ssh端口,所以我可以先从服务器ssh到服务器,然后从服务器ssh到客户端。 正如我所说的,客户端不在我的networking中,而是在不受我控制的路由器之后。
我不是ssh'ing回家,客户端不是我开始这个奇妙的旅程的机器。 家庭,服务器和客户端位于三个不同的networking上。
我认为你正在做一个错误的SSH隧道,所以你有效地从客户端尝试访问开放服务器,而不是相反。 您将无法使用-L,因为您无法连接到客户端来build立隧道。
前进的方向是,如果GatewayPorts在您控制的服务器上的sshd_config中打开,则使用反向通道,例如: ssh -N -R 40000:localhost:22 user@server_under_your_control
只要你的第一个解决scheme:你检查IPTABLES是不是阻止你的连接? 也许你只需要在系统的防火墙中允许这样的stream量。
你也可以尝试Hamachi。 我使用这个用于相同的目的。 Windows版本是主要的开发版本,但也有一个Linux版本。 当我有更多的时间和编辑时,我会find一个链接。 下面的指南可能实际上将您链接到它。
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
什么詹姆斯说静态IP完美的作品。 如果他没有,他必须使用服务(比方说dyndns ),这将表明他的IP在任何时候。
举个例子, ssh -R blahblah user@thisIsMyIp然后你必须创build一个脚本来检查连接是否启动,如果没有,那么你必须执行上面的命令
您可能需要ssh端口转发另一个方向。 即:
client# ssh -R 40000:localhost:22 clientLogin@yourServer
使用一些SSH密钥和什么,以及一个包装,以重新启动它,如果它下降。 这将让你SSH到你的yourServer:40000并获得client一个shell。