我正在 Linux 2.6.26 中配置 GRE 隧道,但遇到了一个非常奇怪的问题,找不到任何解决方案。
我创建了一个名为 的 GRE 隧道gre0
,但无论我做什么,我都无法删除此隧道。该命令ip tunnel del gre0
失败并返回ioctl: Operation not permitted
。任何更改隧道地址的尝试也会失败。
以下命令说明了该问题:
# ip tunnel del gre0
ioctl: Operation not permitted
# ip tunnel change gre0
# ip tunnel change gre0 remote <some address> local <some address>
ioctl: No such file or directory
我可以毫无问题地创建、更改和删除其他隧道,但它gre0
只是停留在那里,不会消失,即使我重新启动或关闭接口。
如果我移除ip_gre
模块,隧道就会消失。一旦我再次插入模块,隧道gre0
就会重新出现,问题仍然存在。
我有两个问题:
- 我该怎么做才能摆脱这个讨厌的隧道?我怀疑这可能是内核或模块错误。
- 这些持久数据(在本例中为的信息
gre0
,但这适用于我可能甚至不知道的任何其他设置)存储在哪里?
如果需要任何其他信息,请告诉我。
非常感谢您的帮助。
答案1
隧道gre0
接口被称为 fallback 接口,具有特殊含义。它由ip_gre
内核模块在模块初始化时创建。您无法禁用此功能。
当主机收到没有找到合适隧道接口的 gre 数据包时,将使用此后备接口。不幸的是,这实际上是一个未记录的功能。仅在源代码这是描述的。
相同的逻辑也适用于其他类型的隧道。
因此,您无法完全删除它,否则会丢失其他 gre 隧道。但您可以使用命令重命名它ip link set dev gre0 name gre_fallback
。然后您可以创建具有gre0
名称的其他 gre 隧道。
答案2
我相信我已经找到了这个问题的答案。
经过一段时间的调整后,我决定在全新安装中重现该问题。
ip_gre
安装 Debian 后,默认情况下不会在内核中插入模块。不ip tunnel show
显示任何隧道。插入模块后ip_gre
,但不创建任何隧道,gre0
如预期的那样,出现并且不可删除和不可更改。因此gre0
似乎是模块默认创建的虚拟隧道ip_gre
。
令人沮丧的是,这个“功能”完全没有记录,甚至是出乎意料的,因为尝试创建隧道gre0
作为系统中第一个(也是唯一的)GRE 隧道可能是很自然的。
答案3
您需要验证 gre 模块是否已完全删除。运行
sudo lsmod | grep gre
检查模块是否在列表中。如果在,则运行
sudo rmmod ip_gre
sudo rmmod gre
将它们从内核中删除。