Назад | Перейти на главную страницу

Трафик GRE не перенаправляется в локальную подсеть

У меня две машины debian в разных местах, и я хочу включить маршрутизацию между двумя внутренними подсетями через GRE.

Моя общая маршрутизация уже работает, то есть любая внутренняя машина направляет трафик к двум машинам, которые подключены через GRE, а также трафик отправляется через туннель, но при получении этого трафика он больше не пересылается в локальную подсеть.

Моя конфигурация на этих двух машинах (без использования реальных IP-адресов):

Хост A (172.19.0.1):

ip tunnel add tun0 mode gre remote 172.20.0.1 local 172.19.0.1
ip addr add 10.10.10.1/24 dev tun0
ip link set tun0 up

Хост B (172.20.0.1):

ip tunnel add tun0 mode gre remote 172.19.0.1 local 172.20.0.1
ip addr add 10.10.10.2/24 dev tun0
ip link set tun0 up
echo 1 > /proc/sys/net/ipv4/ip_forward

Проверка связи с любой машиной на IP-адресах туннельного интерфейса (10.10.10.1 и 10.10.10.2) работает безупречно, но когда я пытаюсь выполнить проверку связи с внутренним IP-адресом через туннель, например, Бег ping 10.100.77.8 -I tun0 на хосте А я не получаю ответа. tcpdump показывает, что не существует даже одного сгенерированного сообщения, которое указывает на то, что пакет никогда не попадает в интерфейс после распаковки GRE.

root@hostb:~# tcpdump -i any host 172.19.0.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:36:10.983403 IP 10.10.10.1 > 172.20.0.1: GREv0, length 88: IP 10.10.10.1 > 10.100.77.8: ICMP echo request, id 20422, seq 8, length 64
10:36:10.983419 IP 10.10.10.1 > 10.100.77.8: ICMP echo request, id 20422, seq 8, length 64
10:36:11.991415 IP 10.10.10.1 > 172.20.0.1: GREv0, length 88: IP 10.10.10.1 > 10.100.77.8: ICMP echo request, id 20422, seq 9, length 64
10:36:11.991427 IP 10.10.10.1 > 10.100.77.8: ICMP echo request, id 20422, seq 9, length 64

Я не вижу, как ICMP-пакет поступает на целевой компьютер 10.100.77.8. В iptables нет настроенных правил, а действие по умолчанию всегда ACCEPT.

Похоже, что что-то не так с выбором исходного адреса, потому что у вас есть адрес внутреннего туннеля во внешнем заголовке пакетов GRE. Исходный адрес внешнего заголовка должен быть 172.19.0.1не 10.10.10.1.

10:36:10.983403 IP10.10.10.1> 172.20.0.1: GREv0, length 88:\ IP 10.10.10.1 > 10.100.77.8: ICMP echo request, id 20422, seq 8, length 64

Проверьте вывод ip route get 10.100.77.8 на хост А. Также проверьте вывод ip route get 10.100.77.8 from 10.10.10.1 iif tun0 на хозяин B. Если вы видите что-то вроде invalid cross-device link вы должны отключить rp_filter.

Также покажите вывод 'ip -4 r ls'команда от обоих хостов.

Задача решена. rp_filter был включен для туннельных интерфейсов

$ cat /proc/sys/net/ipv4/conf/all/rp_filter
1
$ cat /proc/sys/net/ipv4/conf/tun0/rp_filter
1

Изменение обоих на 0 исправил проблему.