我有以下设置
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.1和10.0.64.1然后,对于每个子网中的所有其他节点,使用已经建立隧道的网关,这样我就不必为任一子网上的每个节点继续创建新隧道。
为了测试连接性,我一直在使用:ping -I 10.0.1.1 10.0.65.1
,它应该模拟子网 1 上的节点 1 和子网 2 上的节点 1 之间的通信。
我尝试按照本文概述的说明进行操作教程因为它看起来非常简单,但在阅读其他帖子后,不确定它是否真的加密,因为模式设置为“gre”。但在阅读有关使用 OpenSSH 的一些信息后,似乎子网上的每个节点都需要一个新连接,而不是在两个网关之间建立单个连接。
经过更多的搜索后,我发现了一个文章由 linode 提供的,看起来很有希望,但在前几段中提到,OpenSSH 是完成我想要做的事情的首选方法(而不是 OpenVPN)。
我的问题分为两部分:
我的逻辑对于尝试将子网相互连接是否有效?(在网关之间建立隧道,然后将网关分配给子网上的每个节点)
在两个网关之间建立隧道以供其各自子网中的 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 中的实现,这是我为大多数设置的服务器使用的发行版。