adron2 Posted May 1, 2014 Возникло у меня недопонимание процессов происходящих в ядре и связанных с маршрутизацией. Опишу ситуацию: Есть роутер. На eth1.104 влане ip адрес 10.255.19.254/24 На eth1.101 влане ip адрес 10.255.1.6/24 Дальше есть таблица роутинга rt1: ip ro add default via 10.255.1.1 t rt1 и правило ip ru add from 10.255.19.0/24 t rt1 ... как бы к транзитному трафику через этот роутер вопросов нет. Все что от сети 10.255.19.0/24 пришло роутер исправно перенаправляет на роутер 10.255.1.1. Но! Если попытаться с этого роутера(10.255.19.254) сделать telnet 10.255.19.222 но ничего не выходит. А tcpdump показывает что пакеты на соединение идут но не через eth1.104 как им положено а через eth1.101. То есть роутер пытается посединиться с 10.255.19.222 используя шлюз 10.255.1.1(через интерфейс eth1.101). Это то понятно. Так как срабатывает правило: ip ru add from 10.255.19.0/24 t rt1 Но! Внимани вопрос ! Если пустить пинги с этого роутера на 10.255.19.222 то они проходят! Как? Почему на пинги этот рул никак не действует? Я не спрашиваю как сделать чтобы с роутера работал telnet на 10.255.19.222. Это то как раз понятно: ip ro add 10.255.19.0/24 dev eth1.104 t rt1 и все работает. Мне просто интересно почему пинги ходят а telnet нет? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
bondales Posted May 2, 2014 icmp != tcp Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
adron2 Posted May 2, 2014 icmp != tcp Такая картина на всем кроме icmp. udp аналогично себя ведет. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
nuclearcat Posted May 2, 2014 Возникло у меня недопонимание процессов происходящих в ядре и связанных с маршрутизацией. Опишу ситуацию: Есть роутер. На eth1.104 влане ip адрес 10.255.19.254/24 На eth1.101 влане ip адрес 10.255.1.6/24 Дальше есть таблица роутинга rt1: ip ro add default via 10.255.1.1 t rt1 и правило ip ru add from 10.255.19.0/24 t rt1 ... как бы к транзитному трафику через этот роутер вопросов нет. Все что от сети 10.255.19.0/24 пришло роутер исправно перенаправляет на роутер 10.255.1.1. Но! Если попытаться с этого роутера(10.255.19.254) сделать telnet 10.255.19.222 но ничего не выходит. А tcpdump показывает что пакеты на соединение идут но не через eth1.104 как им положено а через eth1.101. То есть роутер пытается посединиться с 10.255.19.222 используя шлюз 10.255.1.1(через интерфейс eth1.101). Это то понятно. Так как срабатывает правило: ip ru add from 10.255.19.0/24 t rt1 Но! Внимани вопрос ! Если пустить пинги с этого роутера на 10.255.19.222 то они проходят! Как? Почему на пинги этот рул никак не действует? Я не спрашиваю как сделать чтобы с роутера работал telnet на 10.255.19.222. Это то как раз понятно: ip ro add 10.255.19.0/24 dev eth1.104 t rt1 и все работает. Мне просто интересно почему пинги ходят а telnet нет? Пинги raw socket, tcp/udp обычные, возможно с этим связано. Обычно в raw socket выбор интерфейса может идти по другому. Попробуйте биндиться на конкретный интерфейс через -I, правда не факт, что поможет. Ну и конечно важно, чтоб не было никакого nat или правил в tc filter Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
adron2 Posted May 2, 2014 Возникло у меня недопонимание процессов происходящих в ядре и связанных с маршрутизацией. Опишу ситуацию: Есть роутер. На eth1.104 влане ip адрес 10.255.19.254/24 На eth1.101 влане ip адрес 10.255.1.6/24 Дальше есть таблица роутинга rt1: ip ro add default via 10.255.1.1 t rt1 и правило ip ru add from 10.255.19.0/24 t rt1 ... как бы к транзитному трафику через этот роутер вопросов нет. Все что от сети 10.255.19.0/24 пришло роутер исправно перенаправляет на роутер 10.255.1.1. Но! Если попытаться с этого роутера(10.255.19.254) сделать telnet 10.255.19.222 но ничего не выходит. А tcpdump показывает что пакеты на соединение идут но не через eth1.104 как им положено а через eth1.101. То есть роутер пытается посединиться с 10.255.19.222 используя шлюз 10.255.1.1(через интерфейс eth1.101). Это то понятно. Так как срабатывает правило: ip ru add from 10.255.19.0/24 t rt1 Но! Внимани вопрос ! Если пустить пинги с этого роутера на 10.255.19.222 то они проходят! Как? Почему на пинги этот рул никак не действует? Я не спрашиваю как сделать чтобы с роутера работал telnet на 10.255.19.222. Это то как раз понятно: ip ro add 10.255.19.0/24 dev eth1.104 t rt1 и все работает. Мне просто интересно почему пинги ходят а telnet нет? Пинги raw socket, tcp/udp обычные, возможно с этим связано. Обычно в raw socket выбор интерфейса может идти по другому. Попробуйте биндиться на конкретный интерфейс через -I, правда не факт, что поможет. Ну и конечно важно, чтоб не было никакого nat или правил в tc filter Да похоже вы правы. Скорей всего для raw сокетов(и вообще сокетов у которых бинд не сделан к конкретному адресу) происходит следующее: Сокет оставляет на усмотрение ядра выбор src ip. Дальше ядро создает skb и начинает искать для него skb->dst. При этом ip_hdr(skb)->saddr пока еще не заполнен(==0). Ясное дело что рулы не срабатывают и поиск маршрута идет в таблице main. А уже после того как маршрут найден что то в ядре заполняет ip. И испытание с пингами это подтверждает: ~# ping 10.255.19.222 PING 10.255.19.222 (10.255.19.222) 56(84) bytes of data. 64 bytes from 10.255.19.222: icmp_req=1 ttl=64 time=10.5 ms ^C --- 10.255.19.222 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 10.545/10.545/10.545/0.000 ms ~# ping 10.255.19.222 -I 10.255.19.254 PING 10.255.19.222 (10.255.19.222) from 10.255.19.254 : 56(84) bytes of data. ^C --- 10.255.19.222 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...