如何配置多个子网之间的安全连接

如何配置多个子网之间的安全连接

我有以下设置

2 x linode vps
1 x lab (physical) running 4 vps

我的目标是让所有节点都像在同一个 LAN 上一样。这样我就可以修改 IPTable 规则,只允许本地流量,而不必为需要访问目标节点端口的每个服务器添加新的 IPTable 条目。

我做了一些初步研究和测试,但似乎无法找到实现目标的最佳解决方案。在开始配置实际生产 VPS 之前,我一直在使用两个位于不同子网的实验室 VPS 进行练习。

实验室机器有两个物理网卡;eth0 和 eth1。eth1 设置为桥梁,为 VPS 提供虚拟网卡。

设置如下

service-a-1 (physical node):
    eth0: 192.168.0.1
    eth1: br0
    br0:  192.168.0.2

service-a-2 (vps):
    eth0: 192.168.0.3
    eth0:0 10.0.0.1, 255.255.192.0
    eth0:1 10.0.1.1, 255.255.192.0, gw 10.0.0.1

service-a-3 (vps):
    eth0: 192.168.0.4
    eth0:0 10.0.64.1, 255.255.192.0
    eth0:1 10.0.65.1, 255.255.192.0, gw 10.0.64.1

我用192.168.0.xip addies 连接到 VPS,但10.0.xip addies 练习连接子网。我使用上述设计的目的是在服务-a-2服务-a-3通过其网关 IP;10.0.0.110.0.64.1然后,对于每个子网中的所有其他节点,使用已经建立隧道的网关,这样我就不必为任一子网上的每个节点继续创建新隧道。

为了测试连接性,我一直在使用:ping -I 10.0.1.1 10.0.65.1,它应该模拟子网 1 上的节点 1 和子网 2 上的节点 1 之间的通信。

我尝试按照本文概述的说明进行操作教程因为它看起来非常简单,但在阅读其他帖子后,不确定它是否真的加密,因为模式设置为“gre”。但在阅读有关使用 OpenSSH 的一些信息后,似乎子网上的每个节点都需要一个新连接,而不是在两个网关之间建立单个连接。

经过更多的搜索后,我发现了一个文章由 linode 提供的,看起来很有希望,但在前几段中提到,OpenSSH 是完成我想要做的事情的首选方法(而不是 OpenVPN)。

我的问题分为两部分:

  1. 我的逻辑对于尝试将子网相互连接是否有效?(在网关之间建立隧道,然后将网关分配给子网上的每个节点)

  2. 在两个网关之间建立隧道以供其各自子网中的 X 个节点共享的首选方法是什么?使用 Linux 路由、OpenSSH、OpenVPN 还是其他方法?

- 更新 -

经过一番折腾,我似乎需要在不同的路由器之间建立一个 Open-SSH 隧道(用于加密)。该隧道将连接两个路由器的外部 IP,我认为,如果设置正确,它将允许我访问另一端路由器后面的节点。

我突然想到了另外一些事情,比如说我有以下设置:

subnet-1: Office #1, San Diego, CA

subnet-2: Colo #1, Dallas, TX

subnet-3: Colo #1, Tokyo, Japan

subnet-4: Colo #1, Sydney, Australia

在每个子网之间建立隧道以充当虚拟局域网是否有意义?正如我在原始问题中提到的那样,我这样做是为了让 IPTables 能够允许任何通过 10.0.0.0/18 的流量,而不是必须为每个需要从另一台服务器访问的服务器设置 iptables。

再退一步说,如果每台服务器都位于防火墙后面,那么在每台服务器上运行 IPTables 是否有意义?也许在防火墙后面的所有服务器上停止 IPTables 会更容易。我非常重视安全性,在每个节点上运行 IPTables 似乎是常识,即使在防火墙后面也是如此。但是如果有人获得了对某个节点的访问权限,那么理论上他们可以访问其他节点,就好像它们没有运行 IPTables 一样,因为每台服务器上都有 10.0.0.0/18 规则。

-- 更新 #2 --

因此我按以下方式配置了 n2n:

service-a-1 (behind router, but pinholed 55554 udp):

  IP config: 
    ifcfg-eth0:  inet addr:10.0.0.1  Bcast:10.0.63.255  Mask:255.255.192.0 HWaddr 00:1B:78:BB:91:5A

  n2n (edge) startup:
    edge -d n2n0 -c comm1 -k eme -u 99 -g 99 -m 00:1B:78:BB:91:5C -a 10.0.0.1 -l supernode1.example.com:55555 -p 55554 -s 255.255.192.0

service-a-3 (linode vps):

  IP config:
    ifcfg-eth0: inet addr:4.2.2.2  Bcast:4.2.127.255  Mask:255.255.255.0 HWaddr F2:3C:91:DF:D4:08

    ifcfg-eth0:0: inet addr:10.0.64.1  Bcast:10.0.127.255  Mask:255.255.192.0 HWaddr F2:3C:91:DF:D4:08

    n2n (server) startup:
     supernode -l 55555 -v

    n2n (edge) startup:
      edge -d n2n0 -c comm1 -k eme -u 99 -g 99 -m F2:3C:91:DF:D4:08 -a 10.0.64.1 -l supernode1.example.com:55555 -p 55554 -s 255.255.192.0

使用此设置,我完全期望从 service-a-1 (10.0.0.1) ping service-a-3 (10.0.64.1),但我一直收到“目标网络不可达”的提示。两台服务器上的 IPTables 都已关闭,但 service-a-1 位于防火墙后面,但配置为允许所有出站流量。知道为什么我无法像在平面网络一样在两个子网之间 ping 通吗?

答案1

您可以简化解决方案...

如果你正在寻找一种方法来将所有这些服务器(不是路由器或网关设备)链接起来,就像它们在一个平面网络上一样,我建议你看看n2nntop 提供的点对点服务

此工具允许您遍历中间设备;如果您无法访问防火墙或遇到复杂的路由问题,此工具将非常有用。就我而言,我使用 n2n 从中心位置监控客户端系统。它比站点到站点 VPN 更干净,而且我可以解决重叠子网/IP 地址的问题。想想看...

编辑:

我建议使用n2n_v2 分支并手动编译。

n2n 的示例配置如下所示:

在你的超级节点,您需要选择一个允许通过超级节点系统前面的防火墙的 UDP 端口。假设 UDP 端口为 7655,名称为edge.mdmarra.net

# supernode -l 7655 -f -v 
# edge -d tun0 -m CE:84:4A:A7:A3:40 -c mdmarra -k key -a 10.254.10.1 -l edge.mdmarra.net:7655

在客户端系统上,您有很多选择。您应该选择隧道设备名称、MAC 地址(可能)、社区名称、密钥/秘密、IP 地址和超级节点的地址:端口。我倾向于使用更完整的命令字符串:

# edge -d tun0 -m CE:84:4A:A7:A3:52 -c mdmarra -k key -a 10.254.10.10 -l edge.mdmarra.net:7655

这些可以在前台运行以进行测试,但所有功能都在edge命令中。我通常会将其包装在监控框架来确保流程保持正常运行。

答案2

您可以设置 GRE 隧道,看看它是否符合您的需求。总体思路(非常一般)与 VPN 解决方案类似,只是没有所有的安全开销。这是基于我的假设,即您不需要或不想要安全性。

如果稍后您决定为链接添加安全性,您可以这样做。实施 PPTP-over-GRE 甚至 IPSEC-over-GRE 相对容易。

尽管 GRE 是 CISCO 开发的技术,但它绝不是专有技术。许多 Linux 发行版都具有设置 GRE 隧道所需的工具。

您可以检查这篇简短的文章关于 PPTP-over-GRE 在 Arch Linux 中的实现,这是我为大多数设置的服务器使用的发行版。

相关内容