Я настраиваю туннель GRE в Linux 2.6.26, и я столкнулся с очень странной проблемой, для которой я не мог найти никакого решения.
Я создал туннель 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
, но это относится к любой другой настройке, о которой я, возможно, даже не подозреваю) хранится?Если потребуется дополнительная информация, дайте мне знать.
Большое спасибо за любую помощь.
Я считаю, что нашел ответ на эту проблему.
Немного повозившись, я решил воспроизвести проблему в чистой установке.
В ip_gre
модуль не вставляется по умолчанию в ядро после установки Debian. ip tunnel show
не отображает туннель. После вставки ip_gre
модуль, но без создания туннеля, gre0
появляется, и его невозможно удалить и изменить, как и ожидалось. Таким образом gre0
кажется фиктивным туннелем, созданным по умолчанию ip_gre
модуль.
Раздражает то, что эта «функция» полностью недокументирована и даже является неожиданной, поскольку было бы естественно попытаться создать gre0
туннель как первый (и единственный) туннель GRE в системе.
В gre0
Туннельный интерфейс называется резервным интерфейсом и имеет особое значение. Он создан ip_gre
модуль ядра при инициализации модуля. Вы не можете отключить эту функцию.
Когда хост получает пакеты gre, для которых не найден подходящий туннельный интерфейс, будет использоваться этот резервный интерфейс. К сожалению, это действительно недокументированная функция. Только в исходный код это описано.
Такая же логика используется для других типов туннелирования.
Таким образом, вы не можете удалить его полностью без потери других туннелей gre. Но вы можете переименовать его с помощью команды ip link set dev gre0 name gre_fallback
. А затем вы можете создать другой туннель gre с помощью gre0
название.
Вам необходимо убедиться, что модуль gre полностью удален. Бегать
sudo lsmod | grep gre
чтобы проверить, есть ли модуль в списке. Если это так, запустите
sudo rmmod ip_gre
sudo rmmod gre
чтобы удалить их из ядра.