我需要制定一个解决方案,使其可以作为具有两个端口的网络交换机工作:一个端口位于一个国家,第二个端口位于另一个国家。
+------------ Virtual switch ----------------+
+---------+ | +-------+ +----------+ +-------+ | +--------+
|Client A |<--+-->| BOX 1 |<-->|VPN server|<-->| BOX 2 |<--+-->|Client B|
+---------+ | +-------+ +----------+ +-------+ | +--------+
+--------------------------------------------+
客户端 A 和客户端 B 应该感觉像通常的第 2 层交换机一样。两个盒子之间的 VPN 连接是 OpenVPN。所以我需要以某种方式通过两个盒子之间的 VPN 隧道转发以太网帧。盒子 1 和 2 运行 Debian jessie。我希望不要为它编写自己的软件 :) 有人可以提出可能的解决方案吗?
PS 需要连接两个设计用于工作的硬件仅有的在局域网中。
更新:我安装了 4 台虚拟机来模拟这样的设置(省略了 vpnserver):
- 所有机器都是 Debian 机箱
- 机箱 1 和机箱 2 之间有 GRE tap 隧道(基于 IP 的以太网)
- 在客户端 A 上,本地接口与 gretap 接口桥接:桥接地址为 10.0.0.253
- 在客户端 B 上,本地接口与 gretap 接口桥接:桥接地址为 10.0.0.254
- 客户端 A 有静态 IP 192.168.1.1
- 客户端 B 有静态 IP 192.168.1.2
我从客户端 A 向 192.168.1.2 发送 ICMP Echo 请求,并且可以看到 ARP 请求“谁有 192.168.1.2 告诉 192.168.1.1”在盒子 1 上的桥上、在盒子 2 上的桥上以及在客户端 B 上。但ARP 响应仅在客户端 B 上可见。因此 ARP 响应不会以某种方式返回到 Box2。并且 10.0.0.253 和 10.0.0.254 之间的所有网络都运行良好。所以,我认为该问题是由桥接引起的。
更新2:现在我删除了 GRE 分路隧道并在 Box 1 和 Box 2 之间建立了常规网络。当我创建网桥时,ping 开始工作。执行 GRE 隧道时可能出现什么问题?
解决方案:我最终使用 GRE-TAP 在虚拟机中配置了所有内容。我在 Box 1 和 Box 2 之间的常规网络上使用了 GRE-TAP 隧道。然后我在每个 Box 上将隧道接口与本地接口桥接。以下是我的步骤:
框 1
ip link add tunnel0 type gretap remote 192.168.0.2 local 192.168.0.1
brctl addbr br0
brctl addif br0 eth2 # eth2 - is a local interface on Box 1
brctl addif br0 tunnel
ip addr add 10.0.0.253 dev tunnel0
ip link set br0 up
ip link set tunnel0 up
框 2
ip link add tunnel0 type gretap remote 192.168.0.1 local 192.168.0.2
brctl addbr br0
brctl addif br0 eth2 # eth2 - is a local interface on Box 2
brctl addif br0 tunnel
ip addr add 10.0.0.254 dev tunnel0
ip link set br0 up
ip link set tunnel0 up
谢谢大家!
答案1
我自己还没有尝试过,但我知道你可以用它gretap
来在第 3 层(IP)上建立第 2 层(以太网)隧道。例如根据这个博客条目,您在每一端设置一个gretap
接口并将其与您的以太网接口桥接。如果我理解正确的话,示例中的172.31.0.1
应该是 Box 1 上的 VPN 端点的地址,以及172.31.0.2
Box 2 上的 VPN 端点的地址。10.10.10.1
是 Box 1 的本地 LAN 地址,以及10.10.10.2
Box 2 的 LAN 地址。
方框 1:
ip link add gretap0 type gretap local 172.31.0.1 remote 172.31.0.2
ip link set dev gretap0 up
ip link set dev eth0 up
brctl addbr br0
brctl addif br0 gretap0
brctl addif br0 eth0
ip addr add 10.10.10.1/24 dev br0
ip link set br0 up
方框 2:
ip link add gretap0 type gretap local 172.31.0.2 remote 172.31.0.1
ip link set dev gretap0 up
ip link set dev eth0 up
brctl addbr br0
brctl addif br0 gretap0
brctl addif br0 eth0
ip addr add 10.10.10.2/24 dev br0
ip link set br0 up
您可能需要调整 MTU 设置。我无法测试此设置,因此您可能还需要调整其他内容。
编辑:这里是一篇解释 MTU 问题的文章,显然有点复杂。如果您可以控制 VPN MTU 设置,那么对您来说可能会更容易。
答案2
这不太难,因为你所要求的只是所有 L2 流量都能够从一个网络传输到另一个网络,这是桥接 OpenVPN连接。这意味着:
要么配置 OpenVPN 服务器(和两个客户端)来设置桥接 OpenVPN 连接(并记住允许客户端通过客户对客户服务器配置文件中的指令),......
在任何一个在这种情况下,您需要在 DHCP 和路由上进行工作两个都LAN,因为它们都必须属于同一广播域。例如,我们可以决定我们使用的子网是192.168.0.0/23,LAN1 上的 DHCP 服务器会分配以下范围内的地址192.168.0.0/24,LAN2 上的 DHCP 服务器分配该范围内的地址192.168.1.0/24。
然后需要调整路由,假设Box1是LAN1中的一台电脑,地址为192.168.0.121,Box2是LAN2中的一台电脑,IP地址为192.168.1.173,那么需要在LAN1的网关上添加路由:
ip route add 192.168.1.0/24 via 192.168.0.121
而在 LAN2 的网关上需要添加:
ip route add 192.168.0.0/24 via 192.168.1.173
这会产生一定数量的站点内 L2 流量,您可能会觉得很烦人。我有一个这样的三站点配置,流量和 100Mb/s 连接对我来说没有问题,但 YMMV。如果您想限制通过 OpenVPN 的 L2 流量,您可以使用ebtables在 Box1 和 Box2 上。
这是我所知道的实现您所要求的唯一方法。