У меня две машины 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 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
Проверьте вывод 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
исправил проблему.