Mik*_*ell 5 linux vpn tunneling centos ssh-tunnel
我有以下设置
2 x linode vps
1 x lab (physical) running 4 vps
Run Code Online (Sandbox Code Playgroud)
我的目标是让所有节点都像在同一个 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
Run Code Online (Sandbox Code Playgroud)
我使用192.168.0.x ip addies 连接到 VPS,但10.0.x ip addies 用于练习连接子网。我对上述设计的目标是通过网关 ips在service-a-2和service-a-3之间建立安全隧道;分别为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 隧道(用于加密)。隧道将连接两个路由器的外部 ips,我认为,如果设置正确,将允许我访问另一端路由器后面的节点。
我突然想到了其他事情,比如我有以下设置:
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
Run Code Online (Sandbox Code Playgroud)
在每个子网之间建立隧道以充当虚拟局域网是否有意义?正如我在最初的问题中提到的,我这样做是为了 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
Run Code Online (Sandbox Code Playgroud)
通过此设置,我完全期望从 service-a-1 (10.0.0.1) ping service-a-3 (10.0.64.1) 但我一直收到“目标网络无法访问”。两台服务器上的 IPTables 都已关闭,但 service-a-1 位于防火墙后面,但它被配置为允许所有出站流量。知道为什么我不能在两个子网之间 ping 就好像它是平面网络一样吗?
您可以简化解决方案...
如果您正在寻找一种方法来链接所有这些服务器(不是路由器或网关设备),就好像它们在一个平面网络上一样,我建议您查看ntop的n2n对等产品。
该工具允许您遍历中间设备;如果您无法访问防火墙或遇到复杂的路由问题,这将很有帮助。就我而言,我使用 n2n 从中央位置监视客户端系统。它比站点到站点 VPN 更干净,而且我可以解决重叠的子网/IP 地址。想一想...
编辑:
我推荐使用n2n_v2 fork和手工编译。
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
Run Code Online (Sandbox Code Playgroud)
在客户端系统上,您有很多选择。您应该选择隧道设备名称、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
Run Code Online (Sandbox Code Playgroud)
这些可以在前台运行以进行测试,但所有功能都在edge命令中。我通常会将其包装在Monit框架中,以确保进程保持正常运行。