从一个网络到另一个网络的“隧道”

从一个网络到另一个网络的“隧道”

我确信这个问题的答案可以在 Google 上找到,但我真的不知道我在 Google 上搜索什么。

情况;

我们有两个网络;我们自己的内部网络(192.168.0.[0-255])和我们的“服务器”网络(内部地址为 192.168.1.[0-255])。我们的服务器网络位于远程数据中心,我们的服务器是租用的专用服务器(即我们完全控制服务器软件,RedHat 5/6 和 FreeBSD 的混合,但无法控制网络硬件或服务器硬件)。我们的服务器网络位于防火墙后面,限制某些外部端口,我们也完全控制软件,但它的功能仅限于防火墙/NAT(没有花哨的 VPN 等)。我们的内部网络相当基础,我们有一条 20Mb/s 的线路,来自我们的 ISP,连接到一个相当典型的 Netgear 家用路由器。我们还有一个运行网络服务(DNS、DHCP 等)的 Mac OS/X 服务器

我们想要什么;

我们希望能够从这些完全独立的网络仅使用 IP 地址或内部主机名(相同的区别)访问另一个网络上的服务器。

因此,我坐在我们的内部网络上的工作站 192.168.0.10 前。如果我打开终端,ssh 192.168.1.20它将连接到我们服务器网络中的 192.168.1.20 服务器,就像它坐在房间里一样*。同样,如果我通过 SSH 连接到服务器并想从我们内部网络上的 Mac 服务器下载某些内容,我应该能够scp 192.168.0.100:file ./……

这扩展到其他方面,例如将服务器上的 NFS 驱动器安装到我们的桌面*,连接到我们的数据库而无需在防火墙上打开端口(我们将它们锁定到我们的静态外部 IP 地址,但这仍然很烦人)。

我大概知道我想要什么,但我真的不知道从哪里开始。我想最简单的方法是在两个站点之间建立某种 VPN 连接,然后我们将通过 VPN 隧道路由某些 IP,我不知道这是否可行。

是否有仅软件就可以实现这一点(我们可以在内部网络上获得新硬件,但就像我说的,我们无法物理访问我们的服务器基础设施)?

这可能是一个愚蠢的问题,但答案很明显,但我仍然很困惑。

*性能可能很糟糕,但不会比远程连接更差。

答案1

编辑:此答案的大部分内容可帮助您ssh无缝地将盒子连接到内部网络。请参阅下面标有“与其他网络资源协作“以阅读更多相关内容。

您还可以使用 SSH 优雅地完成此操作:

步骤1:设置/选择跳转框

许多企业网络都有通常称为“堡垒主机”或跳转箱的设备。这台机器通常会禁用许多网络服务,除了 ssh(并且通常位于非标准端口上)。如果您的“服务器”网络上没有这样的机器,请找到一个可以通过 ssh 从内部网络访问的机器进行测试。

第2步:编辑你的 ssh 配置文件

找到您的 ssh 配置文件(通常在 中~/.ssh/config)并启动您最喜欢的文本编辑器。假设您的跳转箱位于 ,jump.foo.com而您要访问的主机之一位于server.foo.com。包括以下内容:

Host server.foo.com
  User <username>
  ProxyCommand /usr/bin/nc -x localhost:1080 %h %p

Host jump.foo.com
  User <username>
  DynamicForward localhost:1080

替换<username>为您的用户名。您可能还需要编辑 (netcat) 的路径nc:请注意,这是您本地主机上的 netcat 路径。如果配置不是 100% 合理,我将对其进行分解:

配置jump.foo.com包含一个指令,用于启动一个监听指定端口(在我的示例中为端口 1080)的 SOCKS 代理。这意味着当您通过 ssh 连接到 时jump.foo.com,您还会自动启动一个 SOCKS 代理...敬请期待。

配置server.foo.com说:当我 ssh 到 时server.foo.com,执行指定的 ProxyCommand:

/usr/bin/nc -x localhost:1080 %h %p

其中选项允许您指定代理地址(在本例中,是我们刚刚打开的端口 1080 上-x的连接)、 = 主机和= 端口。localhost%h%p

步骤3:SSH

ssh 到jump.foo.com(我使用tmux, A屏幕替代方案,并始终打开一个窗口并连接到我的jump.foo.com)。现在,在单独的窗口/终端中,尝试直接 ssh 到server.foo.com。我应该注意到server.foo.com可以是内部主机名或者和内部 IP 地址(在您的服务器网络上)。

server.foo.com假设您所有事情都正确,那么您应该可以毫无问题地被传递下去。

有很多方法可以使这个过程更加无缝,使用更强大的 ssh 配置和 bash 别名。以下是我第一次设置时用作参考的一些文章,它们应该可以为您指明正确的方向:

http://blog.gidley.co.uk/2009/03/tunnelling-ssh-over-socks-proxy.html http://blog.electricjellyfish.net/2006/03/dynamicforward-where-have-you-been-all.html http://bent.latency.net/bent/git/goto-san-connect-1.85/src/connect.html

与其他网络资源协作

windows.foo.com假设你需要远程桌面进入“服务器”网络上的主机。在一个窗口中,

ssh -L 3390:windows.foo.com:3389 jump.foo.com

这会将端口 3390 上的所有流量转发localhost到 上的端口 3389(标准远程桌面端口)windows.foo.com。要真正远程登录windows.foo.com,请将您的远程桌面应用程序指向 ,localhost:3390然后您就应该能够透明地连接到windows.foo.com

man ssh或谷歌“ssh 端口转发”获取更多信息。

请记住,你随时可以

telnet <server> <port>

确保你能<server>port

telnet localhost 3390

foo.com在网络中添加新主机

你会不是您必须在跳转盒上为每个服务器配置一个条目。只需

ssh -o "ProxyCommand /usr/bin/nc -x localhost:1080 %h %p" new.server.foo.com

是的,您应该能够通过主机名或 IP 访问内部网络上的主机。

就像我们在 ssh 配置文件中定义的那样,您可以使用选项将 ProxyCommand 参数传递给 ssh -o。同样,这应该会将您的 ssh 流量发送到new.server.foo.com端口 1080 上的同一 SOCKS 代理。

对于每个foo.com域,您只需在 ssh 配置文件中添加一个通配符规则:

Host *.foo.com
      User <username>
      ProxyCommand /usr/bin/nc -x localhost:1080 %h %p

如果您想通过 ssh 连接到配置文件中没有条目的主机,您也可以使用 bash 别名:

alias ssh-socks='ssh -o "ProxyCommand /usr/bin/nc -x localhost:1080 %h %p"'

ssh-socks newer.server.foo.com

我不确定 DNS 请求是否由您发出localhost,或者是否来自跳转盒。我localhost在 ssh 连接到我的“服务器”网络上的几个主机时尝试了 tcpdump

tcpdump port 53

并且实际上没有看到任何流量(/etc/hosts 中没有条目...我必须发出 DNS 请求才能访问主机)。这可能意味着 DNS 请求是从跳转箱发出的,但我不能 100% 确定。

答案2

VPN 可以解决你的问题。我推荐 OpenVPN。

但是如果您只想要 SSH 和 SCP,则只需在边界路由器上配置 NAT 设置就足够了。

例如:在独立工作场所的边界路由器上打开端口(例如)2200 至 2210

像这样:

  • 2200 将转换为端口 22 和地址 192.168.1.20
  • 2201 将转换为端口 22 和地址 192.168.1.21
  • 等等..

此后,您可以连接到独立的工作场所:

ssh <wan_ip_of_detached_workplace> -p 2200

这将连接到您独立工作场所的 192.168.1.20。

希望这会有所帮助。

答案3

VPN隧道是一个答案,有一个小的坏补充(部分细节仅限以下)

这条隧道必须是(嗯,最好有,你可以最后一招使用在边界之间建立的从主机到主机的 p2p VPN 隧道,将显示为额外的 WAN 链路,它在其内部路由“远程”网络的所有流量(是的,远程网络可能从本地可见,这取决于……但可行)。

它可以是硬件解决方案或纯软件(OpenVPN 将成为 SW 解决方案),但是 - 太复杂了,无法一次性写出所有细节。

尝试从 OpenVPN 现场文档开始(如果你可以在两端安装它)并了解其中不同连接类型的示例

相关内容