Тот же IP в нескольких интерфейсах

Привет сетевые гуру,

У меня есть Linux (ядро 3.14) сервер, который действует как TFTP, NFS и сервер HTTP для фермы устройств бытовой электроники (абонентские установки - STBs). Устройства используют TFTP для начальной загрузки их ядер от, затем монтируют их корневой FSes с сервера NFS на нашей машине и т.д. и т.д.

Теперь, для одной тайной технической причины я не собираюсь пахать в здесь (просто верят мне:), каждый STB должен быть в ее собственном, физически отдельном, LAN. Таким образом, способ объединиться в сеть настраивается, ATM:

Сервер имеет 1 сетевую плату, которая привыкла к остальной части мира доступа. Это также имеет 1 сетевую плату для каждого STB, которому это служит - и каждый из тех подключен к маленькому маршрутизатору, к которому STB + некоторые другие устройства подключены и формируют LAN.

В настоящее время существует 3 STBs, соединенные, и LAN является 172.16.50.0/24, 172.16.51.0/24 и 172.16.52.0/24. Его вся работа приятно.

Однако: то, что у нас есть 3 различной LAN, означает, что к тому же самому серверу нужно получить доступ как 172.16.50.1 от STB1, 172.16.51.1 от STB2 и 172.16.52.1 от STB3 - и это означает, что у нас есть немного другая среда на каждом STB и каждый раз, когда мы - говорим - загружают новый RootFS, который будет использоваться на STBs, мы должны вручную отредактировать некоторый конфигурационный файл и поместить корректный IP, к серверу нужно получить доступ от этого конкретного STB. Не очень удобный и подверженный ошибкам!

Это получило меня взгляды: что, если мы просто настроили те три LAN все, чтобы быть тем же самым 172.16.50.0/24? От STB (и отдых устройств в LAN) точка зрения все должно быть прекрасным, но что относительно точки зрения сервера?

Сервер Linux может иметь различные интерфейсы Ethernet N, все настроенные с тем же статическим IP, но каждым подключенным к физически отдельной LAN?

8
задан 15 July 2015 в 16:07
3 ответа

Да, это возможно, если использовать удобную функцию под названием сетевые пространства имен (см. man ip-netns (8) ). По сути, он дает вам несколько различных сетевых стеков, каждый со своим собственным набором интерфейсов, маршрутов и т. Д.

Вам нужно будет создать пространство имен для каждой из ваших STB, а затем вы сможете запускать необходимые службы отдельно в каждом пространстве имен.

Для пространств имен вам нужно будет действовать следующим образом:

  • Создайте пространство имен с именем ] net1 :

     IP netns добавить net1
     
  • Назначьте свой интерфейс ethX новому пространству имен и настройте свой IP-адрес 172.16.50.1:

    ip link set dev ethX netns net1
    ip netns exec net1 ip link set dev ethX up
    ip netns exec net1 ip-адрес добавить 172.16.50.1/24 dev ethX
     

IP-адрес 172.16.50.1 теперь не отображается из вашего пространства имен по умолчанию. Простой ping 172.16.50.1 не работает, вам сначала нужно переключиться в пространство имен net1 и выполнить там команду:

ip netns exec net1 <command>

Таким образом, теперь вы можете запускать каждую службу в каждом из ваших пространств имен.

Если вы любите приключения, вы можете даже попытаться каким-то образом перенаправить все запросы от ваших STB к центральной службе. Для этого вам понадобится туннель из каждого пространства имен в пространство имен по умолчанию (см. ip link help veth ) и немного магии iptables ...

13
ответ дан 2 December 2019 в 22:48

Нельзя использовать один и тот же IP-адрес на нескольких интерфейсах. Он просто не будет работать должным образом (обычно он будет работать только на последнем интерфейсе, которому был назначен IP-адрес).

Вам необходимо подключить интерфейсы Ethernet к мосту и назначить IP-адрес самому мосту.

По сути, все порты Ethernet в этом мосту будут работать как коммутаторы.

В качестве альтернативы вы можете удалить все карты Ethernet для каждого STB и просто добавить коммутатор (который более масштабируемый, чем добавление новых карт Ethernet на ваш сервер).

Но поскольку существует требование, чтобы каждый STB находился в собственном широковещательном домене, я боюсь, что вам нужно придерживаться своих текущих настроек.

Или, чтобы упростить, по крайней мере, аппаратную часть вашего сервера, отказаться от нескольких карт Ethernet и просто добавьте управляемый коммутатор и используйте VLAN для имитации «нескольких карт Ethernet», используя только одну физическую карту Ethernet.

2
ответ дан 2 December 2019 в 22:48

Технически можно, но конфигурация будет красочной. Это будет кладж, и для удовлетворения ваших требований каждый STB должен иметь уникальный IP-адрес, будучи изолированным на собственном проводе. Конфигурация на клиентах не меняется. Вот конфигурация на сервере:

ifconfig eth0 10.0.50.1 netmask 255.0.0.0
route del -net 10.0.0.0 netmask 255.0.0.0 dev eth0
route add 10.0.50.2 dev eth0
ifconfig eth1 10.0.50.1 netmask 255.0.0.0
route del -net 10.0.0.0 netmask 255.0.0.0 dev eth1
route add 10.0.50.3 dev eth1
# ...

В результате в таблице маршрутизации должен быть только один IP-адрес на интерфейс. Они находятся на отдельных проводах, поэтому перекрестных помех нет. Каждое из этих устройств будет думать, что они находятся на 2 узлах 10.0.0.0/8.

Когда сервер хочет поговорить с 10.0.50.2, он будет смотреть на таблицу ARP, а затем на таблицу маршрутизации. Если таблица ARP пуста, таблица маршрутизации сообщает ей об отправке запроса ARP на соответствующий интерфейс, поэтому они ДОЛЖНЫ иметь уникальные IP-адреса, иначе сервер сможет разговаривать только с последним добавленным маршрутом.

Вы можете установить свой DHCP-сервер для назначения IP-адресов на основе аппаратных адресов или запуска отдельного динамического диапазона DHCP для каждого интерфейса. DHCP-сервер может передавать все, что угодно, но 10.0.50.3 на канале eth0 будет недоступен.

2
ответ дан 2 December 2019 в 22:48

Теги

Похожие вопросы