Назад | Перейти на главную страницу

Как Linux выбирает, какой сетевой интерфейс использовать?

Допустим, у меня есть машина с двумя сетевыми адаптерами в разных подсетях, eth0 (10.0.100.5) и eth1 (10.0.200.5). Предполагая, что обе подсети имеют маршруты к Интернету (через свои собственные NAT) и к остальной части локальной сети (через свои собственные переключатели):

  1. Как Linux выберет, какой сетевой интерфейс использовать при запросе к 10.0.150.5 или 173.194.43.102?
  2. Есть ли способ повлиять на это на сетевом уровне? Повлияет ли на это удаление маршрутов из подсетей? Я нахожусь в среде AWS и работаю с AMI устройства, в который не могу войти, поэтому что-то вроде этот не сработает.

Среда AWS VPC, другие машины под управлением Ubuntu 12.04, понятия не имею, какая машина, на которую я пытаюсь повлиять, работает (так как я не могу войти в нее).

Разъяснения:

Подсеть определяется сеть и маска, например

сеть: 10.0.100.5 маска: / 8

Это означает, что ваша подсеть: 10.0,100,5 /8

По сути, любой действующий IP-адрес семейства 10.xxx.xxx.xxx принадлежит этой подсети. Для доступа к хостам в этой подсети можно использовать только один интерфейс. Так что в вашем случае это либо eth0, либо eth1. Другой интерфейс может иметь IP в той же подсети, но он не будет работать должным образом.

Вот что произойдет, если у вас возникнет описанная вами ситуация, когда и eth0, и eth1 подключены к одной сети с IP-адресами в одной подсети.

  • eth0 10.0.100.5/8
  • eth1 10.0.200.5/8

Теперь только один из этих интерфейсов имеет маршрут (допустим, eth0) который говорит to access subnet 10.0.100.0/8 использовать eth0. Таким образом, пакет, покидающий этот интерфейс, будет иметь адрес источника 10.0.100.5

! УВЕДОМЛЕНИЕ - 10.0.100.5/8 и 10.0.200.5/8 - одна и та же подсеть (поскольку маска маскирует последние 3 оксета, мы также можем записать ее как 10.0.0.0/8)

Итак, теперь представьте, что у нас есть хост в этой подсети, который пытается связаться с 10.0.200.5 Пакет попадает в систему через eth1 но не могу вернуться из eth1 поскольку eth0 только один с маршрутом в сеть 10.0.0.0/8 а ответы от eth0 имеют другой IP; поэтому тот, кто устанавливает соединение с 10.0.200.5, не сможет понять ответ, исходящий от другого источника.

РЕДАКТИРОВАТЬ

Чтобы определить, какой интерфейс будет использоваться, вам нужно взглянуть на вашу таблицу маршрутизации. Поскольку вопрос не содержит таблицы маршрутизации, я попытаюсь объяснить с помощью следующей таблицы маршрутизации

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 wlan0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0

альтернативный вывод таблицы маршрутизации

$ ip route show
default via 192.168.0.1 dev wlan0  proto static 
10.0.0.0/24 dev eth0  proto kernel  scope link  src 10.0.0.5 
192.168.0.0/24 dev wlan0  proto kernel  scope link  src 192.168.0.14 

Итак, в примере выше у нас есть 2 интерфейса.

  • eth0 с IP 10.0.0.5 в подсети 10.0.0.5/255.255.255.0 или в нотации CIDR 10.0.0.5/24
  • wlan0 с IP 192.168.0.14 в подсети 192.168.0.14/255.255.255.0 или в нотации CIDR 192.168.0.0/24

Теперь о том, что нам сообщает таблица маршрутизации; построчная интерпретация, снизу вверх:

192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.14

Для доступа к хостам в подсети 192.168.0.0/24 использовать интерфейс wlan0 и src IP 192.168.0.14

10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.5

Для доступа к хостам в подсети 10.0.0.0/24 использовать интерфейс eth0 и src IP 10.0.0.5

default via 192.168.0.1 dev wlan0 proto static

Для доступа к любому другому хосту, не указанному в правилах выше, используйте default маршрут, доступный через интерфейс wlan0 и шлюз в другие сети 192.168.0.1

Посмотрите на свою таблицу маршрутизации - команда - это маршрут. С новой командой ip используйте ip route show. Вы можете посмотреть справку для любого из них о том, как добавлять / удалять записи маршрутизации в таблице.