У меня есть интересная проблема, с которой, я надеюсь, кто-то может помочь. Я пытаюсь создать 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:
- Трафик попадает в туннельный интерфейс на ПК2 как маршрутизатор
- Трафик выходит из туннельного интерфейса на ПК1 как маршрутизатор
- Трафик никогда не попадает на интерфейс eth0 ПК1 в качестве маршрутизатора.
Поэтому я покопался глубже и добавил несколько правил в таблицы IP, чтобы увидеть, что происходит:
каждый запрос ping учитывается в:
mangle prerouting
nat prerouting
Но пинг не учитывается ни в мангл-форварде (при попытке пересылки в SUBA), ни в мангл-входе. Кажется, что ядро молча отбрасывает пакет в маршрутизации, и я понятия не имею, почему. По моему мнению, я не должен был изменять iptables, поскольку мне не нужно было создавать таблицы GRE ...
Будем весьма благодарны за любую помощь в отношении того, что может происходить, как заставить ядро сообщать о пакете или причину, по которой он отбрасывается.