Как принимать пакеты на интерфейсе без IP-адреса и маршрутизировать их в локальную таблицу маршрутизации?

Вопрос или проблема

Как принимать пакеты на интерфейсе без IP-адреса и маршрутизировать их в локальную таблицу маршрутизации?

У меня есть сценарий, в котором я использую OpenELB в качестве балансировщика нагрузки для объявления MAC-адреса моего интерфейса и внешнего IP-адреса (192.168.41.71) в моем кластере Kubernetes.

Насколько я понимаю, мне не нужен IP-адрес интерфейса, потому что внешнему миру необходимо знать только EIP-адрес и MAC-адрес интерфейса.

Мой вопрос: как я могу получать пакеты без IP-адреса интерфейса и пересылать их в локальную таблицу маршрутизации с помощью IPVS?

Когда я устанавливаю IP-адрес случайно, пакеты могут быть получены и пересланы нормально. Однако, если я удаляю IP-адрес интерфейса, то это не работает.

Ответ или решение

Ваша ситуация действительно интересна, и задача, которую вы пытаетесь решить — получение пакетов на интерфейсе без IP-адреса и их маршрутизация через локальную таблицу маршрутизации — имеет несколько нюансов.

Основные моменты

  1. MAC-адрес и IP-адрес: Пакеты Ethernet (которые вы будете получать на уровне канала) могут быть адресованы по MAC-адресу, однако при работе с IP-протоколом важно понимать, что большинство стеке сетевых протоколов ожидают наличие IP-адресов на интерфейсах. Если интерфейс не имеет IP-адреса, то он не будет обрабатывать пакеты IP, что потенциально может стать основной причиной проблемы.

  2. Необходимость IP-адреса: В Linux (и других системах) получение пакетов и маршрутизация их требует хотя бы одного IP-адреса на интерфейсе. Это необходимо для установления уровня IP (Internet Protocol), который включает маршрутизацию в IPVS (IP Virtual Server).

Возможное решение

Вы можете рассмотреть следующие варианты:

  1. Настройка 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
  2. Использование ARP:
    Вы можете попробовать использовать ARP (Address Resolution Protocol) для объявления IP-адреса вашего интерфейса. Это позволит вашему устройству «обманывать» сеть, что у него есть соответствующий IP-адрес, даже если он не настроен физически.

  3. Настройка виртуального IP-адреса:
    Хотя вы упомянули, что не хотите устанавливать IP-адрес, но использование виртуального IP, такого как dummy интерфейс, может быть решением. Вы создаете виртуальный интерфейс, на который назначается IP-адрес, который будет обрабатывать маршрут и получать пакеты.

    ip link add dummy0 type dummy
    ip addr add <ваш_IP> dev dummy0
    ip link set dummy0 up
  4. IPVS и NAT:
    Убедитесь, что вы правильно настроили IPVS для обработки NAT. IPVS может работать в различных режимах и должен быть настроен для соответствия вашим требованиям.

Заключение

Хотя можно theoretically обрабатывать Ethernet-пакеты на уровне MAC, для работы с IP-протоколом требуется наличие IP-адреса. Наилучший подход — это либо использование виртуального интерфейса с IP-адресом, либо правильная настройка iptables и маршрутизации.

Рекомендую протестировать каждое из решений и оценить, какое из них наилучшим образом соответствует вашим требованиям и архитектуре приложения.

Оцените материал
Добавить комментарий

Капча загружается...