Есть 2 NIC (сетевые карты) с IP-адресами IP0
и IP1
как первичные адреса, предоставленные им, как видно в таблице маршрутизации ядра через ip route
. Скажем, сокет TCP привязан к IP0
(и немного порта P0
). Таким образом, он будет получать пакеты, предназначенные для IP0:P0
и эту часть я понимаю. Когда он хочет отправить данные в пункт назначения IP-Dest:Port-Dest
, таблица маршрутизации ядра говорит, что в конечном итоге это должно пройти через другую сетевую карту с основным IP как IP1
. Я хочу знать, каковы правила в таких случаях. Отбрасывает ли ядро пакет, поскольку отправитель (сокет) был привязан к другому сетевому адаптеру с другим IP (IP0
) или он отправляет его через другой сетевой адаптер, но игнорирует связанный с ним IP (IP1
) и вместо этого отметьте исходный IP как IP0
к которому был привязан сокет или (наоборот) игнорировать IP0
и отметьте источник как IP1
при этом все еще отправляя другую сетевую карту, или существуют другие правила, которые определяют поведение здесь, и результаты могут отличаться?
Последующий вопрос: при привязке ко всем интерфейсам через 0.0.0.0
и порт 0
, - это один и тот же (независимо от выбора ядра) номер порта, выбранный для всех интерфейсов для этого сокета, или нет такой гарантии, и он может выбрать IP0:P0
и IP1:P1
где P0 != P1
или это зависит от протокола или другого фактора?
Если приложение привязывается к 0.0.0.0
порты будут одинаковыми для всех интерфейсов.
Тем не менее маршрутизация становится сложной при привязке к 0.0.0.0
. Часто программное обеспечение генерирует пакеты, а затем 0.0.0.0
источник в IP SRC
. Это приводит к попаданию в таблицу маршрутизации по умолчанию, которая обычно является первым шлюзом / подсетью интерфейсов.
Поэтому необходимо настроить две независимые таблицы маршрутизации:
https://serverfault.com/a/823061/476056
И укажите маршрутизацию на основе пункта назначения для интерфейсов