通过 GRE 隧道连接机器

通过 GRE 隧道连接机器

我有两台机器:machineA:192.168.0.1machineB: 192.168.0.2。两台机器都在 上运行Ubuntu 18.04 LTS。两台机器互相可见,因此可以从 运行machineB

sudo tcpdump -i devB # the name of "standard" interface

并从运行machineA

ping 192.168.0.2 

并接收有关 上的数据包交换的信息machineB

我想通过 GRE 隧道在上述机器之间建立通信。我执行以下步骤:

machineA

sudo ip tunnel add gre1 mode gre remote 192.168.0.2 local 192.168.0.1 ttl 255
sudo ip link set up dev gre1
sudo ip address add 192.168.0.10/24 dev gre1 # I have taken this address from nowhere, it's imaginary

machineB

sudo ip tunnel add gre2 mode gre remote 192.168.0.1 local 192.168.0.2 ttl 255
sudo ip link set up dev gre2
sudo ip address add 192.168.0.20/24 dev gre2 # I have taken this address from nowhere, it's imaginary

然后,我希望机器能够通过 GRE 隧道进行通信。但是当我运行时machineB

sudo tcpdump -i gre2

并运行machineA

ping 192.168.0.2 # or
ping 192.168.0.10 # or
ping 192.168.0.20

所有数据包都已发送和接收,但我没有看到任何输出machineB

也许问题在于我对 GRE 隧道的工作原理缺乏了解。大多数教程都写到了路由器,但我没有接触过任何路由器,只是使用机器上的终端配置一切。你能告诉我我在哪里犯了错误,如何解决问题(能够看到通信是通过 GRE 隧道进行的)吗?

答案1

如果在隧道内使用与端点网络使用的 IP 地址相同的 IP LAN 网络 (192.168.0.0/24),则自动添加的路由将共享先前的网络,并且通常不会使用它们,因为已有先前的路由外部隧道。这也与 Linux 使用弱宿主模型,从而在其所有接口上共享其 IP 地址。

可以通过询问内核(在机器 A 上)将选择哪条路由来简单地验证这一点:

# ip route get 192.168.0.2
192.168.0.2 dev devA src 192.168.0.1 uid 0 
    cache 
# ip route get 192.168.0.20
192.168.0.20 dev devA src 192.168.0.1 uid 0 
    cache 

尽管:

# ip route
192.168.0.0/24 dev devA proto kernel scope link src 192.168.0.1 
192.168.0.0/24 dev gre1 proto kernel scope link src 192.168.0.10 

只需从其他 IP 网络分配 IP 地址即可消除路由歧义。例如 192.168.10.0/24:

机器A:

# ip address flush dev gre1
# ip address add 192.168.10.10/24 dev gre1

机器B:

# ip address flush dev gre2
# ip address add 192.168.10.20/24 dev gre2

机器A:

# ip route get 192.168.10.20
192.168.10.20 dev gre1 src 192.168.10.10 uid 0 
    cache 

现在交通将使用该隧道。

相关内容