Я пытаюсь соединить два из нескольких сетевых адаптеров, чтобы они работали как коммутатор.
Для этого необходимо включить неразборчивый режим на сетевых адаптерах.
Даже если я установлю "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 не решает эту проблему.
Я нашел несколько методов и решил проблему самостоятельно.
$ 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.
$ 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.