Вопрос или проблема
Как принимать пакеты на интерфейсе без IP-адреса и маршрутизировать их в локальную таблицу маршрутизации?
У меня есть сценарий, в котором я использую OpenELB в качестве балансировщика нагрузки для объявления MAC-адреса моего интерфейса и внешнего IP-адреса (192.168.41.71) в моем кластере Kubernetes.
Насколько я понимаю, мне не нужен IP-адрес интерфейса, потому что внешнему миру необходимо знать только EIP-адрес и MAC-адрес интерфейса.
Мой вопрос: как я могу получать пакеты без IP-адреса интерфейса и пересылать их в локальную таблицу маршрутизации с помощью IPVS?
Когда я устанавливаю IP-адрес случайно, пакеты могут быть получены и пересланы нормально. Однако, если я удаляю IP-адрес интерфейса, то это не работает.
Ответ или решение
Ваша ситуация действительно интересна, и задача, которую вы пытаетесь решить — получение пакетов на интерфейсе без IP-адреса и их маршрутизация через локальную таблицу маршрутизации — имеет несколько нюансов.
Основные моменты
-
MAC-адрес и IP-адрес: Пакеты Ethernet (которые вы будете получать на уровне канала) могут быть адресованы по MAC-адресу, однако при работе с IP-протоколом важно понимать, что большинство стеке сетевых протоколов ожидают наличие IP-адресов на интерфейсах. Если интерфейс не имеет IP-адреса, то он не будет обрабатывать пакеты IP, что потенциально может стать основной причиной проблемы.
- Необходимость IP-адреса: В Linux (и других системах) получение пакетов и маршрутизация их требует хотя бы одного IP-адреса на интерфейсе. Это необходимо для установления уровня IP (Internet Protocol), который включает маршрутизацию в IPVS (IP Virtual Server).
Возможное решение
Вы можете рассмотреть следующие варианты:
-
Настройка IpTables:
Возможно, вы сможете использоватьiptables
для перенаправления пакетов на вашу виртуальную машину или контейнер, даже если у вас нет установленного IP-адреса. Вы можете создать правило, которое будет захватывать пакеты, адресованные вашему MAC-адресу, и перенаправлять их на нужный интерфейс.iptables -t mangle -A PREROUTING -i <ваш_интерфейс> -m mac --mac-source <ваш_MAC_адрес> -j MARK --set-mark 1 ip rule add fwmark 1 table 100 ip route add default via <ваш_шлюз> table 100
-
Использование
ARP
:
Вы можете попробовать использовать ARP (Address Resolution Protocol) для объявления IP-адреса вашего интерфейса. Это позволит вашему устройству «обманывать» сеть, что у него есть соответствующий IP-адрес, даже если он не настроен физически. -
Настройка виртуального IP-адреса:
Хотя вы упомянули, что не хотите устанавливать IP-адрес, но использование виртуального IP, такого какdummy
интерфейс, может быть решением. Вы создаете виртуальный интерфейс, на который назначается IP-адрес, который будет обрабатывать маршрут и получать пакеты.ip link add dummy0 type dummy ip addr add <ваш_IP> dev dummy0 ip link set dummy0 up
- IPVS и NAT:
Убедитесь, что вы правильно настроили IPVS для обработки NAT. IPVS может работать в различных режимах и должен быть настроен для соответствия вашим требованиям.
Заключение
Хотя можно theoretically обрабатывать Ethernet-пакеты на уровне MAC, для работы с IP-протоколом требуется наличие IP-адреса. Наилучший подход — это либо использование виртуального интерфейса с IP-адресом, либо правильная настройка iptables и маршрутизации.
Рекомендую протестировать каждое из решений и оценить, какое из них наилучшим образом соответствует вашим требованиям и архитектуре приложения.