LINUX.ORG.RU
ФорумAdmin

network/interfaces bridge и vlan

 , ,


0

1

Копаюсь с VLAN изоляцией узлов, пните в сторону как правильно и как вообще через /etc/network/interfaces настраивается vlan.

Надо:

  • гипервизор на отдельном vlan
  • VM за гипервизором на своих vlan, пока что пусть все их порты будут untagged

Тестовый стенд:

  • коммутатор, порт в сторону гипервизора: tagged vlan10 «группа гипервизоров», tagged vlan20(группа VM).
  • гипервизор, debian13, libvirt, bridge без каких либо доп настроек.
    • # ip l add link br0 name br0.10 type vlan id 10 и задан статический IP
  • «тестовая VM» debian13, пока тут пробую настраивать vlan aware bridge, как разберусь перенесу настройки на гипервизор
    • Если я делаю vlan на ens3 интерфейсе, то успешно общаюсь с соотв vlan гипервозора, если на br0, то нету пинга.

Вопросы:

  • вообще не вижу вменяемой документации, хочется один bridge и настройки как на коммутаторе «для каждого порта»
  • судя по тестам всё что выходит из bridge в сторону физического порта теряет vlan метку

Я примерно понял что мне надо ковырять комманды из # man bridge даже более менее что-то работающее получил. Но как это в /etc/network/interfaces описать без костылей?


результат: Оказывается есть несколько реализаций ifupdown и именно ifupdown-ng делает желаемое

★★★

Последнее исправление: Flotsky (всего исправлений: 1)

Давно с этим не работал.

Но я бы сходу без чтения манов, описал бы настройку в post-up параметрах в interfaces.

shell-script ★★★★★
()

Уточню. Мне не хватает знаний, я не пойму «читай документацию», но я пойму ищи «конкретное» там или вот пример.

Смог повторить https://developers.redhat.com/articles/2022/04/06/introduction-linux-bridging-commands-and-features#vlan_filter

Более конкретный вопрос:

В VM делаю # ip l add link br0 name br0.10 type vlan id 10, задаю ip, поднимаю порт, пинга гипервизора нет.
Не понимаю что мне надо донастроить чтобы сам br0 пускал трафик с 10 тэгом наружу.
Разобрался, неправильно комманду писал. Надо bridge vlan add vid 10 dev br0 self, именно ‘self’ мне и не хватало.

Сделать отдельную veth пару и уже на ней vlan, да можно, но как-то избыточно.


Наткнулся на https://docs.nvidia.com/networking-ethernet-software/cumulus-linux-37/Layer-2/Ethernet-Bridging-VLANs/ но эта инструкция видимо не для debian, перечисляет параметры, которых нет в man, но может я неправильно читаю man…

Flotsky ★★★
() автор топика
Последнее исправление: Flotsky (всего исправлений: 1)
Ответ на: комментарий от shell-script

Я справился с настроить понять как настроить всё оборудование кроме гипервизора linux/debian.

На debian запнулся.

Мне надо чтобы linux bridge реализовывал тот-же функционал что и коммутатор. Т.е. чтобы я ему мог сказать вот на этих портах такие тэги пускай как есть, такие untagged

Проблема с настройкой этого. Да, я уже примерно могу описать скрипт и упихать это в условный post-up, но я нахожу инструкции по настройке прямо в /etc/network/interfaces из чего делаю вывод что можно без скриптов и это правильнее, надо только понять как

Flotsky ★★★
() автор топика

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

Khnazile ★★★★★
()

вот рабочая конфигурация, но для ubuntu, для debian просто копируйте логику:

  ethernets:
    enp2s0:
      dhcp4: false
      dhcp6: false
    enp3s0:
      dhcp4: false
      dhcp6: false
    enp4s0:
      #match: 
      #  macaddress: "2c:56:dc:95:06:9d"
      #set-name: eth0
      #  dhcp6: false
      # dhcp4-overrides: 
      #  route-metric: 50
      dhcp6: false
      dhcp4: false
    enp6s0:
      dhcp4: false
      dhcp6: false
  version: 2
  bridges:
    # default vlan
    br0:
      interfaces: [ enp4s0 ]
      dhcp4: false
      dhcp4: false
      addresses: [ 172.23.0.2/16 ]

    # management
    br-management:  
      interfaces: [ vlan400 ]
      mtu: 1230
      dhcp4: false
      dhcp6: false
      link-local: []
      addresses: [ 172.24.0.2/16 ]
      nameservers:
        addresses:
          - 172.24.0.2
    # public
    br-public:  
      interfaces: [ vlan401 ]
      addresses: [ 172.25.0.2/16 ]
      dhcp4: false
      dhcp6: false
      routes:
        - to: default 
          via: 172.25.0.1
    # private
    br-private:  
      interfaces: [ vlan402 ]
      addresses: [ 172.26.0.2/16 ]
      dhcp6: false
    # san
    br-san:  
      interfaces: [ vlan403 ]
      addresses: [ 172.27.0.2/16 ]
      dhcp4: true
      dhcp6: false
    # internet
    br-internet:  
      mtu: 1230
      interfaces: [ vlan404 ]
      addresses: [ 172.28.0.2/16 ]
      dhcp4: false
      dhcp6: false
    # internet
    br-iot:  
      mtu: 1500
      interfaces: [ vlan405 ]
      addresses: [ 172.29.0.2/16 ]
      dhcp4: false
      dhcp6: false
  vlans:
    # management
    vlan400:
      id: 400
      link: br0
      dhcp4: false
      dhcp6: false
    # public
    vlan401:
      id: 401
      link: br0
      dhcp4: false
      dhcp6: false
    # private
    vlan402:
      id: 402
      link: br0
      dhcp4: false
      dhcp6: false
    # san
    vlan403:
      id: 403
      link: br0
      dhcp4: false
      dhcp6: false
    # internet
    vlan404:
      id: 404
      link: br0
      dhcp4: false
      dhcp6: false

    # IOT
    vlan405:
      id: 405
      link: br0
      dhcp4: false
      dhcp6: false

конфигурация виртуалки

<domain type='kvm' id='2'>
  <name>maas</name>
  <uuid>9377988d-e27d-484f-92b7-8c49ec016e6e</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://ubuntu.com/ubuntu/21.10"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>4</vcpu>
  <resource>
    <partition>/machine</partition>
  </resource>
  <os>
    <type arch='x86_64' machine='pc-q35-6.2'>hvm</type>
  </os>
  ...
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='block' device='disk'>
      <driver name='qemu' type='raw' cache='none' io='native' discard='unmap'/>
      <source dev='/dev/vms/maas' index='2'/>
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <boot order='1'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>

    <interface type='bridge'>
      <mac address='52:54:00:d7:ab:62'/>
      <source network='br0' portid='a227b508-ef37-4630-b7ed-3ddd4f11f3f7' bridge='br0'/>
      <target dev='vnet1'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x0a' slot='0x00' function='0x0'/>
    </interface>

</domain>

gagarin0
()

В наше время, всё решает AI Google. Какие могут быть вопросы?

Шаблон безопасной настройки /etc/network/interfaces Перед редактированием обязательно установите пакеты vlan и bridge-utils (если используется мост): sudo apt update && sudo apt install vlan bridge-utils. ini

# Физический интерфейс (Trunk-порт)
# На самом интерфейсе IP-адрес НЕ назначается для безопасности
auto eth0
iface eth0 inet manual
    up ip link set $IFACE up
    # Защита от спуфинга и изменения MAC-адресов
    up ip link set $IFACE multicast off

# VLAN 10 — Например, подсеть Управления (Management)
auto eth0.10
iface eth0.10 inet static
    address 192.168.10.5
    netmask 255.255.255.0
    gateway 192.168.10.1
    dns-nameservers 1.1.1.1
    # Безопасность: запрет пересылки ICMP-редиректов
    up sysctl -w net.ipv4.conf.$IFACE.accept_redirects=0
    up sysctl -w net.ipv4.conf.$IFACE.send_redirects=0

# VLAN 20 - Изолированная сеть для клиентов / ВМ (через Сетевой мост)
auto eth0.20
iface eth0.20 inet manual
    up ip link set $IFACE up

auto br20
iface br20 inet manual
    bridge_ports eth0.20
    bridge_stp off          # Отключаем STP, если топология без петель (защита от атак на STP)
    bridge_fd 0
    # Включаем VLAN-фильтрацию на мосту для жесткой изоляции
    bridge_vlan_aware yes
    # Изоляция портов внутри моста (узлы на этом мосту не увидят друг друга L2)
    up ip link set dev br20 type bridge isolated_mode 1

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

  1. Очистка физического интерфейса (L2-only) Никогда не назначайте IP-адрес на основной физический интерфейс (eth0). Он должен находиться в режиме inet manual. Если злоумышленник отправит нетегированный трафик, он не сможет взаимодействовать со стеком IP хоста.

  2. Запрет маршрутизации между VLAN на самом хостеЕсли этот Linux-узел не должен работать как роутер, полностью отключите форвардинг пакетов. Проверьте, чтобы в файле /etc/sysctl.conf было задано: ini

net.ipv4.ip_forward = 0

Если форвардинг необходим для определенных зон, используйте iptables/nftables, чтобы жестко изолировать VLAN друг от друга: bash

# Запретить трафик между VLAN 10 и VLAN 20
iptables -A FORWARD -i eth0.10 -o eth0.20 -j DROP
iptables -A FORWARD -i eth0.20 -o eth0.10 -j DROP
  1. Изоляция узлов внутри одного VLAN (Private VLAN / Isolated Mode)Обычный сетевой мост (bridge) рассылает широковещательный трафик всем участникам. Если вам нужно, чтобы клиенты внутри одного и того же VLAN не видели друг друга (только шлюз), включите режим изоляции портов:
ip link set dev eth0.20 master br20 isolated_mode 1

(В конфигурационном файле выше эта команда автоматизирована через директиву up). 4. Защита от VLAN Hopping (Смена VLAN ID)Смените Default VLAN: Никогда не используйте VLAN 1 для передачи данных или управления. Этот тег настроен по умолчанию на большинстве коммутаторов и часто подвергается атакам.Drop untagged: Настройте вышестоящий физический коммутатор (Cisco, MikroTik и т.д.) так, чтобы он сбрасывал любые нетегированные пакеты (native vlan) на trunk-порту, ведущем к вашему Linux-серверу.

dobrbiu
()
Ответ на: комментарий от Flotsky

Наткнулся на https://manpages.debian.org/testing/ifupdown-ng/interfaces-bridge.5.en.html и понял что инструкция https://docs.nvidia.com/networking-ethernet-software/cumulus-linux-37/Layer-2/Ethernet-Bridging-VLANs/ актуальна, но для пакета ifupdown-ng

Собственно после # apt install ifupdown-ng всё настроилось как ожидается без post-up скриптов.

Этого и хотел. Далее думаю разберусь т.к. нашёл конкретный man

Flotsky ★★★
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария