将 TCP 连接从一台 Linux 机器转移到 NAT 后面的另一台机器?

将 TCP 连接从一台 Linux 机器转移到 NAT 后面的另一台机器?

当我的一个 HTTP 连接的下载速度极其缓慢时,我想如果我能将该连接从我的 PC 转移到共享相同外部 IP 地址的节能家庭服务器,那就太好了。

按照我的想象,我想运行一个命令来接管来自特定 IP 和端口的连接,让我将所有流经它的传入数据传输到一个文件,而不会让连接的原始所有者关闭它。

已经有任何工具可以做到这一点吗?

答案1

在大多数情况下这没有意义。中止下载,将已下载的内容复制到服务器并用于wget恢复下载。

答案2

我认为这是不可能的,因为除了 NAT 防火墙之外,TCP/IP 连接的工作原理还为您提供了在 LAN 上的多台计算机之间共享外部 IP 地址的能力。话虽这么说,有一些提示/技巧可能会有所帮助,只要您了解它们是如何工作的。

技巧 #1 - 屏幕/tmux

通常,如果我有一个大文件要下载,我会ssh进入网络上的另一台计算机,并在那里运行 screen/tmux。通过 screen/tmux 会话,我可以在终端中运行长时间运行的程序(例如下载),而当我断开ssh与该辅助计算机的连接时,它们不会停止。

该模式如下所示:

laptop$ ssh remotemachine

...login...

remote$ screen -S mydownload

...now have a screen session called "mydownload"...

remote$ wget http://www.bigfiles.com/somebigfile

...Ctrl+A Ctrl+D.... <--- (disconnect from screensession)

...a little while later...

laptop$ ssh remotemachine
remote$ screen -r mydownload

...wget is still running in here...

技巧 #2 - xdg-open

该程序允许您通过首选应用程序运行文件和/或 URL。例如,我在 LAN 上的远程计算机上设置了 Firefox,以便它与“magnet://”处理程序关联。通过在远程计算机上的此操作,我可以运行如下命令:

ssh remotemachine "DISPLAY=:0.0; xdg-open magnet://url_of_magnet_link...."

在我的笔记本电脑上,它将“触发”我的远程计算机开始通过 Firefox 下载该磁力链接,然后火狐会将该 URL 传递到与处理 Magnet:// 链接相关的应用程序。在这种情况下我使用维泽来进行处理。

如果您好奇如何设置 Firefox 来执行此操作,我不久前在我的博客上写过相关内容。文章标题为:[one-liner]:如何让 Firefox 10.x 在 Linux 上通过 Magnet Link 启动 BitTorrent 客户端

答案3

从IP、TCP和NAT的角度来看,这绝对是可能的。我可以想象服务器获取 PC 的 IP 地址。我还可以通过初始化所需的套接字数据结构和协议控制块来想象服务器的 Linux 内核准备连接传输。实际的连接传输需要两个 Linux 内核之间的一些协调。

确实存在一种有希望的方法:TCP 连接传递。它由一个扩展用于连接传递的套接字 API 的内核补丁和一组用于启动传递的工具组成。这种方法考虑了应用层的作用。

事实是:TCP 连接还涉及在两端之间共享的应用程序状态。两端都期望对方按照该状态行事。因此,如果您用某种仅吸收数据而不回复任何内容的通用实体替换一端,则您可能会因行为不当而破坏状态(从而破坏连接)。对于您所描述的场景来说,这可能不是问题,但它限制了您想到的通用连接传递方案的适用性。所以不,我不认为这样的事情存在,但 TCP 连接传递是一个好的开始。您可以根据您的需求进行定制。

相关内容