Какой IP-адрес использует интерфейс, когда хост выступает в роли клиента?
Допустим, я настроил eth0 с 2 IP-адресами: 192.168.1.7 и 192.168.1.8.
Команда route показывает что-то вроде этого:
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.240.0 0.0.0.0 255.255.240.0 U 256 0 0 eth0
...
Это в основном означает, что когда я пытаюсь подключиться к любому хосту из 192.168.240.0
сети, он использует интерфейс eth0. Хорошо, но... Какой IP-адрес из этого интерфейса?
Если хост действует как сервер, а клиент подключается к моему компьютеру, используя IP-адрес, 192.168.1.7
который, как я понимаю, будет использовать eth0 192.168.1.7
для связи с клиентом, но что делать, если клиентом являюсь я сам?
РЕДАКТИРОВАТЬ
IP-адреса выдуманы, я не могу добавить еще один IP-адрес к интерфейсу в моем Ubuntu WSL, потому что получаю эту ошибку:
$ ip address add 192.168.1.7/24 dev eth0
RTNETLINK answers: Permission denied
Вывод ip r s
примерно такой:
$ ip r s
none 224.0.0.0/4 dev eth0 proto unspec metric 256
none 255.255.255.255 dev eth0 proto unspec metric 256
none 224.0.0.0/4 dev eth1 proto unspec metric 256
none 255.255.255.255 dev eth1 proto unspec metric 256
...
ПРАВКА 2
Я обновился до WSL2, и теперь команда добавления IP-адресов работает (с помощью sudo).
$ ip -4 a s dev eth0
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.249.181/20 brd 192.168.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.1.7/24 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.1.8/24 scope global secondary eth0
valid_lft forever preferred_lft forever
решение1
Для Linux ответ на ваш вопрос:дано здесь:
Начальный адрес источника для исходящего пакета выбирается в соответствии со следующим рядом правил.
Приложение может запросить определенный IP-адрес, ядро будет использовать подсказку src из выбранного пути маршрута или, при отсутствии этой подсказки, ядро выберет первый адрес, настроенный на интерфейсе, который попадает в ту же сеть, что и адрес назначения или маршрутизатор следующего перехода.
решение2
Клиент будет искать МАРШРУТЫ, соответствующие адресу, к которому он пытается подключиться. Если, как в вашем примере, есть более одного соответствующего маршрута, он выберет запись маршрута с самой высокой метрикой и отправит пакет из интерфейса, найденного в таблице маршрутизации, используя IP-адрес этого интерфейса.
Вы обрезали вывод маршрута и не указали, к чему вы подключаетесь, поэтому я не могу сказать, какой это будет интерфейс.
На сервере... ну, там все становится немного сложнее. У меня есть хосты Centos и Redhat с несколькими интерфейсами в одной подсети. Они будут отвечать на тот же адрес/интерфейс, на который были отправлены пакеты. Но у меня также есть последние системы Ubuntu и Debian, которые будут повторно посещать таблицу маршрутизации, чтобы найти интерфейс и адрес для использования, игнорируя адресацию в пакете клиента. Клиент будет игнорировать пакеты, возвращающиеся с IP-адреса, с которым он не общается.