我有两台机器:machineA
:192.168.0.1
和machineB
: 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
现在交通将使用该隧道。