Jump to content
Калькуляторы

вопрос по iproute2. Странность.

Возникло у меня недопонимание процессов происходящих в ядре и связанных с маршрутизацией. Опишу ситуацию:

Есть роутер.

На 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 нет?

Share this post


Link to post
Share on other sites

icmp != tcp

 

Такая картина на всем кроме icmp.

udp аналогично себя ведет.

Share this post


Link to post
Share on other sites

Возникло у меня недопонимание процессов происходящих в ядре и связанных с маршрутизацией. Опишу ситуацию:

Есть роутер.

На 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

Share this post


Link to post
Share on other sites

Возникло у меня недопонимание процессов происходящих в ядре и связанных с маршрутизацией. Опишу ситуацию:

Есть роутер.

На 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this