通过 SSH 隧道传输数据非常简单:
ssh -D9999 username@example.com
Run Code Online (Sandbox Code Playgroud)
将端口 9999 设置localhost为到 的隧道example.com,但我有更具体的需求:
localhosthost1 可以访问 localhosthost2 只接受来自 host1localhost到创建一个隧道host2实际上,我想创建一个“多跳”SSH 隧道。我怎样才能做到这一点?理想情况下,我希望在不需要成为任何机器上的超级用户的情况下执行此操作。
每当我从不安全的位置(例如公共 wifi)使用互联网时,我喜欢使用 ssh 隧道 ( ssh -D port host) 来确保我的流量不会被嗅探到。不幸的是,似乎有许多应用程序没有提供指定代理的方法(Flash 是一个主要示例)。
感觉应该有某种方法可以为来自我的计算机的所有网络流量使用隧道,但我完全不知道如何做到这一点。任何帮助将不胜感激。
SSH 隧道让我很困惑。我想知道我是否可以在 Linux 中做到这一点。
我有3台机器..
A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.
Run Code Online (Sandbox Code Playgroud)
所以我可以从 A -> B 和 B -> C 进行 SSH,但不能从 A -> C 进行 SSH。
有没有办法设置从 A 到 B 的 SSH 隧道,所以当我运行其他 SSH 命令时,它们只能在我的本地机器 A 上工作?我基本上是在尝试将 git repo 从工作克隆到家(并且我无法在机器 B 上安装 git)。
此外,一旦设置.. 我将如何取消设置?
标题几乎总结了它。我想通过 SSH 隧道发送 UDP 流量。具体来说,我需要能够通过隧道发送 UDP 数据包,并让服务器能够在另一端将它们发送回给我。我知道如何为 TCP 连接做到这一点。这可以用UDP吗?
在远程专用网络上有两台服务器——一个文件服务器和一个数据库服务器(这些都是 Win 机器,以防万一)。
文件服务器有自己相当强大的身份验证机制,并允许我直接从远程位置进行连接。
数据库服务器使用简单的用户名和密码,因此为了防止未经授权的访问,它被锁定到本地网络——外部流量被阻止。
为了访问数据库服务器,我使用 Windows 上的 OpenVPN 客户端连接到专用网络上的 VPN 服务器。
默认情况下,OpenVPN 通过 VPN 路由所有发往 VPN 服务器所在远程网络的网络数据包。不幸的是,通过VPN 访问文件服务器极其缓慢!
题:
如何将 OpenVPN 客户端配置为仅通过发往单个特定 IP 地址(即数据库服务器)的 VPN 路由流量?
我不明白为什么用“隧道”比喻来描述网络隧道。
起初我以为是因为发送的数据是加密的,所以窃听者将无法看到数据(他看到数据包裹在隧道中!)。
但是那些不使用加密的隧道协议呢,为什么也叫“隧道”呢!
我想使用 SSHFS 挂载远程文件系统 (A),但有时我有 IP 地址,不允许访问。所以我的计划是通过该网络中的另一台机器 (B) 访问它。我是否需要在 B 上安装 A,然后在本地计算机上安装 B(和 A)?有没有更好的方法来做到这一点?
更新
只是为了澄清程序:
首先,我做一个隧道
ssh -f user@machineB -L MYPORT:machineA:22 -N
Run Code Online (Sandbox Code Playgroud)
然后我挂载远程文件系统
sshfs -p MYPORT user@127.0.0.1:/myremotepath /mylocalpath
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?
完成后如何摧毁隧道?
ssh -D 可以在本地机器上创建一个socks端口,将流量传递到远程,然后到其他地方。
ssh -L port:host:hostport, 在本地机器上监听端口,从远程机器的角度将流量传递给“host:hostport”。
ssh -R port:host:hostport是 的对应物ssh -L,它在远程机器上监听端口,并从本地机器的角度将流量传递给“host:hostport”。
但是什么是对应的ssh -D,即如何在远程机器上打开一个socks端口,它将流量传递到本地,然后到其他地方?
我们在客户的位置安装了一些硬件,该硬件连接到我们的 ssh 服务器并建立反向 ssh 隧道,以便我们可以访问多个客户端系统以进行监控。
一切正常,直到 SSH 会话断开连接。
发生这种情况时,在我们的 SSH 服务器上,反向隧道使用的端口会停留在 LISTENING 模式,当我们的远程硬件最终尝试自动重新连接并重新建立其隧道时,它会失败并显示错误
警告:侦听端口 XXXX 的远程端口转发失败
我通过尝试干净的断开连接和释放端口的过程来测试我们的 SSH 服务器或客户端是否存在问题。当我模拟连接失败(例如断开客户端硬件的以太网端口)时,我们遇到了我上面描述的相同问题。
处理这种情况的正确方法是什么?请记住,这些是反向隧道,因此无论发生什么都需要在 SSH 服务器上完成。理想情况下,我需要 ssh 服务器立即意识到托管隧道的 SSH 会话已关闭并释放它正在使用的端口。我想解决方案可能涉及终止相关的 SSH 进程,但我需要小心这一点,因为我们有多个客户端连接到同一个 ssh 服务器,我不想让它们脱机。
如此成熟,我确信 SSHD 有某种内置功能来处理这个问题,但我就是想不通。
请提供建议,这样我就不必再回到管理 Windows 机器上去了...
仅供参考:我在基于 Debian 的发行版上运行它。
我需要对我们部门的一台主机进行持续的 SSH 访问,该主机的 IP 地址是动态分配的。我已经建立了一个从目标主机到我们的一台主机的远程 SSH 隧道,它确实提供了一个静态 IP 地址:
ssh -f -N -g -R :22223:localhost:22 tunnelhost
Run Code Online (Sandbox Code Playgroud)
当我将 SSH 指向22223隧道主机上的本地端口时,隧道工作正常。我的问题是,我似乎无法将隧道绑定到本地主机以外的任何东西,即当我尝试通过 SSH 远程连接到 时tunnelhost:12323,没有开放端口来接收它。我也试过:
ssh -f -N -R :22223:localhost:22 tunnelhost -o GatewayPorts=yes
Run Code Online (Sandbox Code Playgroud)
但仍然没有运气。Netstat 向我展示了:
[me@tunnel_host ~]$ netstat -an | grep 22223
tcp 0 0 127.0.0.1:22223 0.0.0.0:* LISTEN
tcp6 0 0 ::1:22223 :::* LISTEN
Run Code Online (Sandbox Code Playgroud)
确认隧道仅绑定到本地主机。我在隧道主机上添加了一个端口例外,使用 firewalld-cmd,并确保没有网络硬件干扰连接。关于它可能是什么的任何想法?
干杯,詹姆斯。