LINUX.ORG.RU

sendto посылает пакеты не с адреса, указанного в bind


0

0

1. использую bind для связывания UDP сокета с локальным интерфейсом.
2. посылаю пакет с помощью sendto
3. С помощью tcpdump вижу, что пакеты шлются всегда в соответствии с таблицой роутинга, независимо от того, куда сделал bind;
обратный адрес IP-пакета -- данный в bind.

Я нигде в инете и мануалах не нашел, что bind задает только адрес, который сокет будет слушать.
Я бы хотел от специалистов услышать подтверждение или опровержение этого факта: bind задает listening internet address, а не просто internet address. И, если можно, где я могу прочитать про это явно.

Если это так, что route всегда задает адрес, откуда пакет пошлется, то почему sendto не возвращает ошибку, типа такой "не могу послать через этот интерфейс (указанный в bind), не найден route для адреса доставки", а всегда шлет с другого интерфейса, где найден route?
Хотя и указывает в пакете правильный обратный адрес, но через другой интерфейс адрес доставки не доступен, а управлять таблицей роутингов я не могу.

Что-то я пароль запамятовал. Если что, я sergio_nsk.

anonymous

bind задает адрес этого сокета(см поле "откуда" в пакете). Будешь ты его слушать или нет - твое дело. А как доставить пакет до получателя - дело таблицы маршрутов. И указывает она "куда" пакет пошлется. Обычно посылать пакет на основании информации об источнике - не очень хорошая идея (кроме случая policy routing).

DonkeyHot ★★★★★
()

отступление: прямым роутингом называют поиск пути по dst адресу(+еще некоторые параметры), source роутингом называют поиск пути по некой заранее оговоренной инфе например src адрес, а все виды роутинга (прямой,сорц,...) - роутингом

никакие манипуляцие с bind, sendto - не приводят к изменению рутинга(могут конечно изменить, но это извращения .. например тебе нужно поднять новую запись в таблице если пришол icmp echo request длиной больше 66 байт). Поэтому ты подчиняешься тому что есть.

вывод: просто не надо деалать bind перед посылками если тебе это действительно не надо. или делай конечно если вы с сервером договорилсь что ты типа будешь ломится с 5678 порта но тогда в поле src-addr ставь 0

BTW: в bind указывается не интерфейс а адрес .. у интерфеса может быть несколько адресов

lg ★★
()

Спасибо за информацию.

Мне просто не хватало подтверждения моих высказываний. Теперь всё ясно. Придётся объяснять о необходимости настройки роутинга. Спасибо.

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