Я работаю в Linux 2.6.30.9 и пытаюсь настроить прозрачный Ethernet через туннель GRE. Используемая сетевая топология следующая:
Я хочу соединить ПК1 и ПК2 с помощью прозрачного Ethernet через GRE. RouterA подключен к Интернету через ppp0 как RouterB. Оба подключения к Интернету являются PPPOE (PVC PPPoEoA).
Итак, я делаю:
В 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 на ПК2. Я не вижу запроса ARP на ПК2.
Я пытаюсь использовать статические записи ARP, но запрос ICMP имеет ту же проблему, он не пересылается на ПК2.
Нет правил ebtables. Ни правил iptables (действие по умолчанию - ACCEPT для ebtables и iptables). Должен ли я добавить ppp0 в интерфейс моста или что-то в этом роде? Любые предложения приветствуются.
Проблема была связана с вопросом, который я задал здесь, о сбое сервера. 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+init%3A+can%27t+add+protocol когда драйвер IP GRE не может запуститься, потому что драйвер демультиплексора GRE еще зарегистрировал обработчик GRE, и я обнаружил несколько устройств с этой ошибкой.