Для исходящего пакета по route
Я могу знать, какой интерфейс используется, но для входящего пакета, как узнать, какой интерфейс используется?
Вы ищете ip route get
команда. Это эквивалент BSD route get
.
ip route get 50.232.186.20
например, покажет, какой маршрут будет использоваться для доступа к этому IP. Эта команда не разрешает имена хостов сама по себе.
пакет будет поступать с его интерфейса IP-адреса (адрес назначения), в противном случае он не достигнет интерфейса, и пакет будет проигнорирован (как в концентраторе), если пакет является широковещательным, тогда он будет приходить со всех интерфейсов, подключенных к этому широковещательному домену (одна из причин, почему только один ip должен быть в одной подсети ip)
то же самое происходит на уровне MAC
В общем, Linux ожидает, что пакет будет входить через тот же интерфейс, что и выход.
Если это не так, ядро сообщает о пакете как о марсианском, и если у вас установлено следующее значение sysctl, пакеты будут отброшены, если они видны с интерфейса, который не может вернуться к ( rp
в rp_filter
стандарт для обратного пути).
net.ipv4.conf.all.rp_filter = 1
Поэтому обычно, если у вас нет особо сложной таблицы маршрутизации или настройки, вы можете проверить вывод ip r
и сделать обоснованное предположение. Скорее всего, вы захотите проверить, какой у вас маршрут по умолчанию, и будет большая вероятность, что ответом на ваш вопрос будет «на какой интерфейс указывает ваш маршрут по умолчанию».
Все вышеперечисленное может быть изменено администраторами при необходимости, но в целом, AFAIK именно так работает большинство систем.