LINUX.ORG.RU
ФорумAdmin

туннель, нат, ping -I

 


0

1

Всем добра!

Делаю туннель между двумя компьютерами (A, B) между ними роутер R

A (eth0) -----------(enp0s1) R (enp0s2) --------- C (eth0)

A (eth0 secondary) ---- B (env1)

  • IP комп. A (eth0) — 192.168.1.1/24
  • IP комп. A (eth0 secondary) — 192.168.254.2/24
  • IP роутера R (enp0s1) — 192.168.1.254/24
  • IP роутера R (enp0s2) — 192.168.2.254/24
  • IP комп. C (eth0) — 192.168.2.1/24
  • IP комп. B (env1) — 192.168.254.1/24

на компьютере А создаю туннель следующей командой

ip tunnel add IPT mode ipip local 192.168.1.1 remote 192.168.2.1
ip link set dev IPT up
ip addr add 192.168.3.1/24 dev IPT
на компьютере C:
ip tunnel add IPT mode ipip local 192.168.2.1 remote 192.168.1.1
ip link set dev IPT up
ip addr add 192.168.3.254/24 dev IPT

итоговая маршрутная таблица компьютера A:

192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1
192.168.3.0/24 dev IPT proto kernel scope link src 192.168.3.1
192.168.254.0/24 dev eth0 proto kernel scope link src 192.168.254.2

Всё работает,всё движется.

Но вопрос не про это :).

Вот чисто гипотетически. Не привязываясь к конкретной конфигурации и сфере применения.

вот если я делаю так на компьютере A:

iptables -t nat -A OUTPUT -o eth0 -j DNAT --to 192.168.254.1

и на том же компьютере A:

ping -I IPT 192.168.3.254 
я получаю отсутствие соответствующих пакетов на интерфейсе eth0 (комп. А). А ядро мне говорит, что у меня loop
Dead loop on virtual device IPT ...

Если я не ошибаюсь цепочка движения пакета с компьютера А будет:

local process (ping) — routing decision — ... — netfilter output (-o IPT) — netfilter postrouting — вход на псевдо устройство tun (IPT) — ( ipip инкапсуляция ) — выход tun (IPT) — routing decision — ... — netfilter output (-o eth0) — netfilter postrouting — arp (link layer) — ...

Адреса такие же.

Должно происходить сначала routing decision, а уже потом DNAT. Что заставляет пакеты исходящие из eth0 вернуться в IPT (в бесконечном loop)?

Помогите, пожалуйста! Посоветуйте, что почитать. Интересно разобраться.

Спасибо.



Последнее исправление: gnom111 (всего исправлений: 4)

1. «кто этот человек» «192.168.254.1» ?
2. "-t NAT" именно так и писали? И оно сработало? Сомневаюсь.
3. DNAT (подмена адреса назначения) для всех локальных исходящих пакетов, в случае если у вас один интерфейс, так себе идея.
ЗЫ Да, я сейчас нетрезв. С праздником Вас!!! Но то что я написал, это первое что бросается в глаза в части однозначной «неправильности».

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от anc

С праздником Вас!!!

Cпасибо! С праздником!

«кто этот человек»

Компьютер в сети к которая маршрутизируется с интерфейса eth0 компьютера A

-t NAT

Вы правы. Я поправил

для всех локальных исходящих пакетов

Согласен, что это выглядит плохо. Но что-то здесь происходит. Я не понимаю почему пакет возвращается в IPT.

gnom111
() автор топика

1. рероут происходит при выходе из цепочки OUTPUT.
2. Кастую vel, Вы гуру в части сетевой системы ядра. Поясните плиз вопрос ТС.

anc ★★★★★
()
Ответ на: комментарий от anc

Да. reroute происходит между OUTPUT и POSTROUTING (filter/OUTPUT не видит смены интерефйса, но видит измененный адрес!)

Делаю туннель между двумя компьютерами (A, B) между ними роутер R

между А и С ?

туннель тип ipip, но настройки как для gre

«ping -I ifname» это особое действие и это не то, что «ping -I ipaddr». ТС не пробовал проверить разницу?

iptables -t nat -A OUTPUT -o eth0 -j DNAT --to 192.168.254.1

Выстрел себе в ногу. Все что локально передается через eth0 должно перенаправиться на comp B.

пакеты самого туннеля - это локально генерируемые пакеты и они попадают под это правило.

Непонятно что ТС хотел сделать этим правилом в nat/output И все усложняется из-за использованием дополнительных адресов.

vel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.