在最新版本的 OpenSSH 上创建反向隧道时,可以指定远程端口 0 来绑定任何可用端口:
-R [bind_address:]port:host:hostport
...
如果端口参数为“0”,则侦听端口将在服务器上动态分配并在运行时报告给客户端。
openssh ssh 客户端联机帮助页
我的问题是如何(以自动方式)确定服务器上的此端口分配。向运行 ssh 客户端的主机报告它似乎没有帮助 - 但不是向目标报告,目标将要连接到此端口以访问客户端上的服务。
我能想到的两个类似选项正在运行
# netstat -ntlp
Run Code Online (Sandbox Code Playgroud)
在服务器上并通过 sshd 或查看输出来查找绑定在 127.0.0.1 上的可疑端口
# lsof -p $PPID | grep TCP | grep LISTEN
Run Code Online (Sandbox Code Playgroud)
但是从自动化的角度来看,这两种方法都不是令人愉快的,如果创建了多个这样的隧道,则没有任何方法可以将动态端口绑定回原始服务端口。
在 sshd 服务器端有效地获取活动隧道列表(本地和远程端口号)是否有任何遗漏,例如相当于 SSH_CONNECTION 环境变量,但对于活动隧道?
对于某些情况,我正在尝试创建可能非常多的并发反向隧道到主机,隧道返回到许多不同主机上的相同端口号。让 TCP 堆栈自动管理端口池似乎是最有效的方法。
长期以来,我一直在我的 linux 桌面上使用 sshuttle 来规避越南 ISP 的限制。但是我想知道是否有类似的易于使用的Windows软件?可以通过 ssh 隧道重定向所有/选定流量的东西?
我知道这个问题已经被问过几次了,但我认为我的问题可能略有不同。也许我不了解问题的基本原理。
我有一个 Linux Samba 共享,我想通过 ssh 隧道从 Windows 中使用它。当我在 VPN 上时,我可以访问 Samba 共享,并且隧道端口 139 在 Linux 上工作正常。当我从 VPN 之外的 Linux 机器访问共享时,我需要做的就是像这样转发端口 139:
ssh user@remotehost -L 1139:localhost:139
Run Code Online (Sandbox Code Playgroud)
然后挂载驱动:
mount -t cifs //remotehost/shared /mnt/cifs -o username=myuser,password=mypass,ip=127.0.0.1,port=1139
Run Code Online (Sandbox Code Playgroud)
对于 Windows,我尝试按照教程通过 PuTTY 创建环回适配器和隧道:http : //www.nikhef.nl/~janjust/CifsOverSSH/Win8Loopback.html
这不起作用,所以我尝试遵循使用端口 139 而不是 445 的不同教程:https : //www.simonholywell.com/post/2009/04/samba-file-share-over-ssh-tunnel/
这两个教程都没有奏效,所以我想我的第一个问题是我实际上需要转发这些端口中的哪一个?我需要端口 139、端口 445 还是两者都需要?我不明白这可能是什么问题。
如果您需要任何其他信息,请告诉我,我曾尝试使用 nmap 进行故障排除,但没有取得任何进展。
两者在功能上有什么区别?我有点困惑。
本地转发使远程端口在本地可用。
远程转发使本地端口远程可用。
但是这种“可用性”将在两个方向上起作用......或者是吗?
例如以下(从主机“家”发出)
ssh -R 1234:localhost:2345 user@work
Run Code Online (Sandbox Code Playgroud)
这将在 work::1234 和 home::2345 之间建立安全隧道,对吗?
如果我在一端放入任何东西,它就会从另一端出来。
但是,我可以通过来自主机“工作”的以下调用来实现相同的目的:
ssh -L 1234:localhost:2345 user@home
Run Code Online (Sandbox Code Playgroud)
所以,唯一的区别是我从哪里调用它,对吗?
我正在尝试使用远程位置的 ssh 隧道连接到我的家庭网络并访问路由器 Web 界面。
我可以通过 SSH 访问家庭网络,并且可以连接到网关机器“Lounge”。(例如 192.168.1.100)
我需要做什么来通过“休息室”将 Web 请求代理到家庭网络上的路由器 (192.168.1.1),以便我可以从远程位置查看它?
如果它有所不同,则“休息室”机器正在运行 OS X。
我想要一个仅限 ssh/命令行的解决方案,谢谢。
我的家是 Linux 服务器,在那里 SSH 总是可以用来绕过稍微限制性太强的防火墙。然而,在工作中,我们处理的所有服务器都是基于 Windows 的。
我需要连接到在 Windows 2008 服务器上运行的 SQL Server 2000 实例。服务器位于防火墙后面,该防火墙似乎阻止了除远程桌面之外的所有传入端口。假设有一个 VPN,但由于某种原因它已经消失了,根据我们最终访问远程桌面的速度来判断,可能需要几周的时间才能在防火墙或用户中设置异常添加到 VPN。
所以现在我正在寻找一个快速解决方案来解决它。绕过它的最佳方法是什么?
此外,我们用来连接到服务器的计算机运行的是 Windows 7。我们拥有对服务器的管理员访问权限,但我们不希望永久安装任何东西
我有一台机器在几跳之外,我需要设置端口转发才能传输文件。
编辑:需要明确的是,需要多跳才能访问远程机器。在我的机器上,我设置了一个 VPN,我可以在其中访问 10.255.xx - 这是我可以通过 VPN 连接的唯一机器。一旦登录到 .xx,我就可以连接到其他机器 - .yy 就是其中之一。
从我的机器:
ssh -L 4567:localhost:4567 me@10.255.x.x
Run Code Online (Sandbox Code Playgroud)
然后从那台机器:
ssh -L 4567:localhost:22 me@10.255.y.y
Run Code Online (Sandbox Code Playgroud)
那我可以
scp -P 4567 me@localhost:/path/to/large/file.gz .
Run Code Online (Sandbox Code Playgroud)
我让这个运行过夜,才发现转移在某个时候死了。
我已经看到一些建议使用 rsync over ssh 来恢复传输,但我不清楚如何设置。这可能吗?
我不断地从不同的物理位置(以及不同的物理机器)连接到许多机器。其中大部分是通过 ssh 完成的,有时需要一两台网关机器(我通过ProxyCommandin调用~/.ssh/config)。我想知道是否有一种方法可以识别远程端调用初始连接(即我正在使用的机器)的机器的 IP 或主机名?
PermitUserEnvironment。$SSH_CLIENT环境变量是用于直接连接有用,但只列出最近的网关。我目前对解决方案的想法是抓取$SSH_CLIENT,ssh 到它,找到该机器的$SSH_CLIENT值并重复直到它不存在;然后获取主机名并以某种方式将其拉回。
不过看起来有点像黑客工作;有人有更好的方法吗?
我主要在 bash shell 中工作,但我也很高兴任何不使用它的建议。
我需要通过代理跳转建立到远程服务器的连接。我正在尝试使用 -J 标志来做到这一点。据我了解,语法如下:
ssh -J A B
Run Code Online (Sandbox Code Playgroud)
但我需要对两个连接使用密钥文件。所以我尝试过这个:
ssh -J -i /path/proxy.pem user@proxy_host -i /path/target.pem user@target_host
Run Code Online (Sandbox Code Playgroud)
显然它不起作用,我得到了
option requires an argument -- i
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-E log_file] [-e escape_char]
[-F configfile] [-I pkcs11] [-i identity_file]
[-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]
[-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
[-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
[user@]hostname [command]
ssh_exchange_identification: Connection closed by remote host
Run Code Online (Sandbox Code Playgroud)
在这种情况下,在不编辑 ssh 设置的情况下,正确的内联语法是什么?在这种情况下,密钥存储在哪个服务器上没有区别。
我使用 SSH 隧道作为浏览器用来访问互联网的端口。结果是我绕过了我的网络使用的防火墙,这阻止了我使用我想使用的许多站点(facebook,任何人?)。如果我像这样建立 SSH 隧道,系统管理员会看到我的互联网历史记录吗?他只是看到一个SSH连接,然后加密信息吗?或者他能以某种方式看到我在 facebook 上,而 SSH 隧道只对防火墙足够好?