Как постоянно включить беспорядочный режим на сетевой карте, управляемой NetworkManager?

Я пытаюсь соединить два из нескольких сетевых адаптеров, чтобы они работали как коммутатор.
Для этого необходимо включить неразборчивый режим на сетевых адаптерах.
Даже если я установлю "promisc on" с помощью команды "ip link", настройка будет сброшена при перезагрузке ПК.

Как я могу включить беспорядочный режим навсегда, даже если я перезагружаю свой компьютер?

Среда - Ubuntu Desktop 20.04 LTS.
По этой причине конфигурация сети основана на NetworkManager.

Пример минимальной конфигурации показан ниже:

Vagrant.configure("2") do |config|
  config.vm.define :bridge do |machine|
    machine.vm.box = "bento/ubuntu-20.04"
    machine.vm.network :private_network, auto_config: false, virtualbox__intnet: "intnet_a"
    machine.vm.network :private_network, auto_config: false, virtualbox__intnet: "intnet_b"

    machine.vm.provision "shell", inline: <<-SHELL
      apt-get update
      apt-get install -y network-manager
      cat > /etc/netplan/50-bridge.yaml <<'EOS'
network:
  version: 2
  ethernets:
    eth1:
      addresses:
        - 0.0.0.0/32
    eth2:
      addresses:
        - 0.0.0.0/32
  bridges:
    br0:
      interfaces:
        - eth1
        - eth2
EOS
      echo 'network: { version: 2, renderer: NetworkManager }' > /etc/netplan/99-NetworkManager.yaml
      netplan apply
    SHELL
  end
end

Команда «ip link» активирует состояние PROMISC сетевой карты, как показано ниже.

$ sudo ip link set dev eth1 promisc on
$ sudo ip link set dev eth2 promisc on
$ ip addr
[...]
3: eth1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether xx:xx:xx:xx:c4:f5 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether xx:xx:xx:xx:48:57 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether xx:xx:xx:xx:c4:f5 brd ff:ff:ff:ff:ff:ff
[...]

Однако после перезагрузки ОС статус PROMISC будет сброшен.

$ sudo reboot
[...]
$ ip addr
[...]
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether xx:xx:xx:xx:c4:f5 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether xx:xx:xx:xx:48:57 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether xx:xx:xx:xx:c4:f5 brd ff:ff:ff:ff:ff:ff
[...]

В этом примере я использовал Vagrant для демонстрации воспроизводимой среды.
Бродяжничество не является обязательным, я действительно хочу использовать Ubuntu на физическом ПК.
Простое включение беспорядочного режима через запуск Vagrant Provisioning не решает эту проблему.

2
задан 6 August 2021 в 02:10

1 ответ

Я нашел несколько методов и решил проблему самостоятельно.

Метод 1: Использовать NetworkManager-dispatcher

$ sudo bash -c 'cat > /etc/NetworkManager/dispatcher.d/50-promisc' <<'EOS'
#!/usr/bin/bash -e
case "$2" in
    up)
        if [[ "$1" = "eth1" ]] || [[ "$1" = "eth2" ]]; then
            ip link set dev $1 promisc on
        fi
        ;;
esac
EOS
$ sudo chmod u=rwx,g=rx,o=rx /etc/NetworkManager/dispatcher.d/50-promisc
$ sudo reboot
[...]
$ ip addr
[...]
3: eth1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether xx:xx:xx:xx:c4:f5 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether xx:xx:xx:xx:48:57 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether xx:xx:xx:xx:c4:f5 brd ff:ff:ff:ff:ff:ff
[...]

Зарегистрируйте скрипт для NetworkManager-dispatcher, который будет включать promisc, когда целевая сетевая карта (eth1 или eth2) находится в состоянии up.

Метод 2: Зарегистрируйте одноразовую службу в systemd, которая будет отложена до запуска блока network-online.target

$ sudo bash -c 'cat > /etc/systemd/system/bridge-promisc.service' <<'EOS'
[Unit]
Description=Makes interfaces run in promiscuous mode at boot
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ip link set dev eth1 promisc on
ExecStart=/usr/sbin/ip link set dev eth2 promisc on
TimeoutStartSec=0
RemainAfterExit=yes

[Install]
WantedBy=default.target
EOS
$ sudo systemctl enable bridge-promisc
$ sudo reboot
[...]
$ ip addr
[...]
3: eth1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether xx:xx:xx:xx:c4:f5 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether xx:xx:xx:xx:48:57 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether xx:xx:xx:xx:c4:f5 brd ff:ff:ff:ff:ff:ff
[...]

Я думаю, что этот метод можно применить к шаблонам, которые не используют NetworkManager.

0
ответ дан 20 August 2021 в 10:29

Другие вопросы по тегам:

Похожие вопросы: