Привет сетевые гуру,
У меня есть 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?
Да, это возможно, если использовать удобную функцию под названием сетевые пространства имен
(см. 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 ...
Нельзя использовать один и тот же IP-адрес на нескольких интерфейсах. Он просто не будет работать должным образом (обычно он будет работать только на последнем интерфейсе, которому был назначен IP-адрес).
Вам необходимо подключить интерфейсы Ethernet к мосту и назначить IP-адрес самому мосту.
По сути, все порты Ethernet в этом мосту будут работать как коммутаторы.
В качестве альтернативы вы можете удалить все карты Ethernet для каждого STB и просто добавить коммутатор (который более масштабируемый, чем добавление новых карт Ethernet на ваш сервер).
Но поскольку существует требование, чтобы каждый STB находился в собственном широковещательном домене, я боюсь, что вам нужно придерживаться своих текущих настроек.
Или, чтобы упростить, по крайней мере, аппаратную часть вашего сервера, отказаться от нескольких карт Ethernet и просто добавьте управляемый коммутатор и используйте VLAN для имитации «нескольких карт Ethernet», используя только одну физическую карту Ethernet.
Технически можно, но конфигурация будет красочной. Это будет кладж, и для удовлетворения ваших требований каждый 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 будет недоступен.