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

Используйте сетевые и широковещательные IPv4-адреса для обычного одноадресного трафика

Учитывая текущее исчерпание IPv4-адресов, я хотел бы попробовать использовать сетевой и широковещательный адрес с префиксом by / 29.

Это возможно?

Я арендую / 29 у Hetzner и назначаю отдельные IP-адреса виртуальным машинам, которые работают на выделенном сервере.

Сам сервер имеет другой IPv4-адрес из другой подсети.

Это ответ только для Linux (но, по крайней мере, второй представленный метод не очень специфичен для Linux, поэтому его, вероятно, можно использовать с другими ОС).

Вот три способа сделать это для Linux-сервера (который здесь выступает в качестве маршрутизатора) и с использованием виртуальных машин, также работающих под управлением Linux. Первый метод предназначен только для ознакомления с третьим методом. следует использовать второй или третий методы, а не первый. Все три метода можно использовать вместе (то есть: одни виртуальные машины используют один метод, другие - другой, то же самое для сервера Linux, выступающего в качестве маршрутизатора).

В приведенных ниже примерах я предполагаю, что блок IP-адресов - 192.0.2.0/29, а IP-адрес сервера в этом блоке - 192.0.2.1/29, установленный непосредственно на интерфейсе моста (как это часто делается в программах виртуализации) с именем мост0. Виртуальные машины будут иметь eth0 интерфейс.


Настройте стандартную / 29 LAN как обычно в Linux, но удалите специальную широковещательную роль первого и последнего IP-адресов.

  • pro: ... помогает представить третий метод.
  • Минусы: использует трюк, который нужно повторять каждый раз, когда сетевой интерфейс административно отключается, а затем включается или при изменении IP-адреса. Он должен применяться после интерфейс активен, возможно небольшое окно нарушения трафика.

Как только адрес добавлен и интерфейс открыт, местный Таблица маршрутизации получает два широковещательных адреса: первый и последний из сетевого блока:

# ip address add 192.0.2.2/29 dev eth0
# ip link set dev eth0 up
# ip route show table local dev eth0
broadcast 192.0.2.0 proto kernel scope link src 192.0.2.2 
local 192.0.2.2 proto kernel scope host src 192.0.2.2 
broadcast 192.0.2.7 proto kernel scope link src 192.0.2.2 

Просто удалите эти два лишних трансляция Записи удаляют особые роли сетевых и широковещательных адресов, превращая их в обычные одноадресные IP-адреса при обмене данными:

# ip route flush table local dev eth0 type broadcast
# ip route show table local dev eth0
local 192.0.2.2 proto kernel scope host src 192.0.2.2 

Пока это не будет сделано, эта система, вероятно, не сможет правильно взаимодействовать с 192.0.2.0 и 192.0.2.7. Система должна иметь пользовательские настройки конфигурации, чтобы делать это при загрузке или при запуске интерфейса (например, up команды в /etc/network/interface для некоторых систем, подобных Debian).

И как обычно добавляем на сервер маршрут по умолчанию:

# ip route add default via 192.0.2.1

Точно то же самое делается для систем, использующих 192.0.2.0 и 192.0.2.7. У этих систем могут быть проблемы со связью с любой другая система, пока не будут удалены широковещательные маршруты.

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

Если некоторые виртуальные машины не могут принять ни этот параметр (например: не запускать Linux), ни следующие варианты, изоляция (PVLAN) для них и тех, которые используют 192.0.2.0 и 192.0.2.7 (так что с участием как минимум 3 виртуальных машин), вероятно, должна быть сделано (см. например Можно ли включить изоляцию портов на мостах Linux?).


Используйте адрес / 32 и маршруты / 32 для любого IP-адреса в локальной сети / 29.

  • pro: очень похоже на настройки IP-адреса переключения при отказе, описанные некоторыми провайдерами хоста (не очень понятный пример здесь), так что, вероятно, уже доступна документация для различных ОС.
  • Минусы: требуется установить один маршрут для каждого узла.

Хотя интерфейсы по-прежнему будут (виртуальными) Ethernet-интерфейсами на уровне 2 и будут по-прежнему использовать ARP как обычно для разрешения адресов IPv4 под капотом, все маршруты будут добавлены, как это было бы сделано для маршрутов точка-точка уровня 3.

Например, в системе, использующей IP-адрес 192.0.2.0, адрес будет добавлен следующим образом:

# ip address add 192.0.2.0/32 dev eth0

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

# ip route add 192.0.2.1/32 dev eth0

Эти первые две команды (адрес / 32 + один / 32 маршрут, вероятно, к маршрутизатору) могут быть дополнительно сокращены одной командой следующим образом:

# ip address add 192.0.2.0 peer 192.0.2.1/32 dev eth0

бонус в виде маршрута добавляется автоматически ядром, когда интерфейс отключается / запускается.

Маршрут по умолчанию должен быть добавлен как обычно:

# ip route add default via 192.0.2.1

Если эта виртуальная машина должна взаимодействовать с другой виртуальной машиной, просто добавьте ее конкретный маршрут / 32 по мере необходимости:

# ip route add 192.0.2.2/32 dev eth0
# ip route add 192.0.2.3/32 dev eth0
# ip route add 192.0.2.4/32 dev eth0
# ip route add 192.0.2.5/32 dev eth0
# ip route add 192.0.2.6/32 dev eth0
# ip route add 192.0.2.7/32 dev eth0

Сохраните лучшее из обоих: установите адрес / 32, вручную добавьте маршрут / 29

  • за: простой
  • против: ничего, я не вижу, за исключением того, что я не знаю эквивалентов, отличных от Linux.

Добавьте адрес / 32 (опять же, без особых трансляция маршруты автоматически добавляются в местный таблица маршрутизации ядра) и заполнить вручную обычным маршрутом / 29, который не был автоматически добавлен в основной таблица маршрутизации по ядру:

# ip address add 192.0.2.3/32 dev eth0
# ip route add 192.0.2.0/29 dev eth0
# ip route add default via 192.0.2.1

# ip route show table local dev eth0
local 192.0.2.3 proto kernel scope host src 192.0.2.3 

Результат такой же, как и в первом случае, за исключением того, что ядро ​​Linux не добавляло автоматически потенциально нарушающие широковещательные адреса в местный таблица маршрутизации, поэтому их не нужно удалять при выполнении таких изменений, как уменьшение / увеличение. Вместо этого необходимо вручную добавить маршрут LAN.