1

У меня есть интересная проблема, с которой, я надеюсь, кто-то может помочь. Я пытаюсь создать GRE туннель между 2 маршрутизаторами (под управлением Linux Ubuntu 12.04) и передавать трафик между 2 подсетями через этот туннель.

То, чего я пытаюсь достичь, можно упростить с помощью следующей настройки. Представьте себе 4 компьютера (как показано на следующей диаграмме), 2 маршрутизатора, 2 компьютера, подключенных к шлюзу ...

      |----------------------|              |----------------------|
SUBA--+--ETH0          ETH1--+----------- --+--ETH0          ETH1--+--SUBB
      |----------------------|              |----------------------|
            PC1 as router                        PC2 as router

Теперь, если диаграмма выглядит неправильно, позвольте мне объяснить это. У меня 2 компьютера настроены как маршрутизаторы (ip_forwarding=1, proxy_arp=1). Каждый компьютер в качестве маршрутизатора имеет 2 интерфейса, и каждый интерфейс имеет свой собственный IP-адрес.

Левая сторона диаграммы (ПК1 в качестве маршрутизатора)

  • SUBA=192.165.13.25
  • ETH0 на ПК1 в качестве маршрутизатора =192.165.13.254 (ГВт SUBA)
  • ETH1 на ПК1 в качестве маршрутизатора = 192.168.6.40 (адрес предоставлен поставщиком услуг) -> это GW по умолчанию для ПК1 в качестве маршрутизатора.

Правая сторона диаграммы (ПК2 в качестве маршрутизатора)

  • SUBB=192.160.20.25
  • ETH0 на ПК2 в качестве маршрутизатора =192.168.20.41 (адрес предоставлен поставщиком услуг)
  • ETH1 на ПК2 в качестве маршрутизатора =192.160.20.254 (ГВт SUBB)

Маршрутизация довольно проста на каждом конце и может быть описана словами.

На ПК1 в качестве роутера:

  • для доступа к 192.165.13.0/24 используйте eth0
  • для доступа к 192.168.6.0/24 используйте eth1
  • GW по умолчанию: 192.168.6.40 => это eth1

На ПК2 в качестве роутера:

  • для доступа к 192.160.20.0/24 используйте eth1
  • для доступа к 192.168.20.0/24 используйте eth0
  • GW по умолчанию: 192.168.20.41 => это eth0

В этой настройке БЕЗ ЛЮБЫХ ПРАВИЛ IPTABLES каждый может пинговать всех. И у меня все хорошо. SUBA может пинговать SUBB, и наоборот все в порядке.

Теперь я создаю туннель GRE между ПК1 в качестве маршрутизатора eth1 и ПК2 в качестве туннеля eth0 маршрутизатора на ПК1, поскольку маршрутизатор имеет туннель GRE с локальным = 192.168.6.40 и удаленным = 192.168.20.41 и, конечно, у меня есть симметрия на другом маршрутизаторе с туннелем на ПК2 в качестве маршрутизатора имеется туннель GRE с локальным = 192.168.20.41 и удаленным = 192.168.6.40 ...

Я изменяю маршрутизацию (добавляю одно правило) на ПК2 в качестве маршрутизатора просто для принудительного трафика в туннель: для доступа 192.165.13.0/24 используйте туннель GRE.

Больше ничего не делается.

Теперь SUBB пытается пропинговать SUBA, и он не работает, не работает, либо пытается пропинговать GW SUBA (который является вторым интерфейсом PC1 в качестве маршрутизатора).

Вот что я вижу, используя wireshark или tcpdump:

  1. Трафик попадает в туннельный интерфейс на ПК2 как маршрутизатор
  2. Трафик выходит из туннельного интерфейса на ПК1 как маршрутизатор
  3. Трафик никогда не попадает на интерфейс eth0 ПК1 в качестве маршрутизатора.

Поэтому я покопался глубже и добавил несколько правил в таблицы IP, чтобы увидеть, что происходит:

каждый запрос ping учитывается в:

mangle prerouting
nat prerouting

Но пинг не учитывается ни в мангл-форварде (при попытке пересылки в SUBA), ни в мангл-входе. Кажется, что ядро молча отбрасывает пакет в маршрутизации, и я понятия не имею, почему. По моему мнению, я не должен был изменять iptables, поскольку мне не нужно было создавать таблицы GRE ...

Будем весьма благодарны за любую помощь в отношении того, что может происходить, как заставить ядро сообщать о пакете или причину, по которой он отбрасывается.

0