Прозрачный Ethernet через GRE, не пересылающий трафик

Я работаю в Linux 2.6.30.9 и пытаюсь настроить прозрачный E thernet через туннель GRE. Используемая топология сети выглядит следующим образом:

введите описание здесь

Я хочу соединить ПК1 и ПК2, используя прозрачный E thernet через GRE. RouterA подключен к Интернету через ppp0 как RouterB. Оба интернет-соединения являются PPPOE (PPPoEoA PVC).

Итак, я делаю:

В RouterA (Linux 2.6.30.9):

ip link add testgre type gretap remote 193.152.243.206 local 95.121.205.77 ttl 255
brctl addif br0 testgre
ip link set testgre up

В RouterB (Linux 2.6.30.9):

ip link add testgre type gretap remote 95.121.205.77 local 193.152.243.206 ttl 255
brctl addif br0 testgre
ip link set testgre up

Вывод некоторых команд:

В RouterA (аналогичный вывод в RouterB):

# ip link show testgre
36: testgre: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1442 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 5f:79:cd:4d:c6:57 brd c1:98:f3:ce:ff:ff

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.5f79cd4dc657       no              eth0.5
                                                        eth0.4
                                                        eth0.3
                                                        eth0.2
                                                        wlan0
                                                        testgre

Затем я делаю PING-запрос от ПК1 к ПК2:

ping 192.168.1.33

Я запускаю tcpdump в RouterA и вижу кадр запроса ARP поверх ppp0 (файл pcap открывается с помощью Wirehark):

введите описание здесь

Я запускаю tcpdump в RouterB, подключенном к ppp1, и вижу, что ARP-запрос прибыл, но его не пересылают с L2 на PC2. Я не вижу ARP-запрос в PC2.

Я пытаюсь использовать статические записи ARP, но ICMP-запрос имеет ту же проблему, он не пересылается на ПК2.

Там нет правил ebtables. Ни правила iptables (Действие по умолчанию - ПРИНЯТЬ для ebtables и iptables). Должен ли я добавить ppp0 для интерфейса моста или что-то подобное? Любые предложения приветствуются.

1 ответ

Решение

Проблема была связана с вопросом, который я задал здесь о сбое сервера IP/GRE, скомпилированном в ядре, но интерфейс gre0 не существует.

Я решил первый вопрос, выпустив драйвер демультиплексора GRE в gre.c зарегистрировать обработчик протокола GRE в ядре. Но я обнаружил, что при получении пакета GRE обработчик GRE не указывает ни на какой ip_gre.c функция (драйвер демультиплексора GRE предназначен для проверки версии GRE в пакете и передачи блока правильному обработчику протокола, но в моем случае он указывает NULL).

Я прокомментировал кусок кода, где gre.c регистрирует обработчик протокола GRE, и я раскомментировал кусок кода, где ip_gre.c регистрирует обработчик протокола GRE. Теперь, когда приходит пакет GRE, он хорошо декапсулирован и передан на следующий уровень, теперь я могу без проблем пропинговать ПК1 - ПК2. Я думаю, что эта проблема возникает у многих людей на их встроенных устройствах, потому что я искал в Google сообщение об ошибке https://www.google.com/search?q=ipgre%20init:%20can%27t%20add%20protocol, когда Драйвер IP GRE не может запуститься, поскольку драйвер демультиплексора GRE еще не зарегистрировал обработчик GRE, и я обнаружил несколько устройств с этой ошибкой.

Другие вопросы по тегам