Jak mogę automatycznie przełączać zmostkowane adaptery moich maszyn wirtualnych między eth0 i wlan0 w zależności od tego, co jest aktywne?

3

W Virtualbox mam kilka maszyn wirtualnych. Host jest laptopem Debiana, który często przełącza się między połączeniem przewodowym i bezprzewodowym. Za każdym razem, gdy korzystam z połączenia bezprzewodowego (lub przewodowego), muszę zmienić ustawienia Virtualbox każdej maszyny wirtualnej z eth0 na wlan0 (lub na odwrót), aby goście mogli połączyć się z siecią. Jak mogę ustawić ten przełącznik automatycznie?

Matt Alexander
źródło
Czy mówisz, że łączysz maszynę wirtualną z interfejsem bezprzewodowym? Ponieważ to nie jest możliwe.
Ambroz Bizjak,
@AmbrozBizjak, Tak, właśnie to mówię. W rzeczywistości te słowa są wysyłane z gościnnej maszyny wirtualnej na bezprzewodowym hoście Debiana.
Matt Alexander
Ach, więc wygląda na to, że VBox robi jakieś hakery, żeby to działało. Interfejsy klienta bezprzewodowego nie mogą być mostkowane w zwykłym znaczeniu, ponieważ każdemu klientowi bezprzewodowemu przypisany jest jeden i tylko jeden adres MAC.
Ambroz Bizjak,
Czy absolutnie konieczne jest zmostkowanie maszyny wirtualnej? Dlaczego routing nie działa?
Ambroz Bizjak,
Używam ich jako serwerów, więc potrzebują adresu IP.
Matt Alexander

Odpowiedzi:

3

Można zmienić typ interfejsu sieci wirtualnej za pomocą polecenia:

VBoxManage controlvm <VM_name> nic1 bridged eth0

Spowoduje to, że pierwszy wirtualny interfejs w tej maszynie wirtualnej zostanie połączony z eth0. Działa to jednak tylko wtedy, gdy gość jest uruchomiony . (Nie jestem pewien, kiedy dokładnie zaktualizuje trwałą konfigurację, ale niektóre testy wykazały, że polecenie nic nie robi, jeśli gość nie jest uruchomiony, ale jeśli tak, zmienia zarówno bezpośredni stan interfejsu, jak i aktualizuje konfigurację .)

Ale można go uruchomić, jeśli często go uruchamiasz, określając interfejs, z którym chcesz się połączyć. Możesz użyć mojego języka programowania NCD, aby zrobić to automatycznie. Poniższy program NCD będzie obserwował stan eth0 i wlan0 i wielokrotnie będzie wywoływał polecenie takie jak powyżej, aby upewnić się, że maszyna wirtualna jest połączona z odpowiednim interfejsem. (w szczególności ten, który ma flagę RUNNING; np. w przypadku interfejsów przewodowych oznacza to, że kabel jest podłączony)

process vbox_iface {
    # Wait for link on either eth0 or wlan0. Prefer eth0.
    multidepend({"link-eth0", "link-wlan0"}) linkif;

    println("Using ", linkif.dev);

    # Enter loop (this is a hackish loop).
    multiprovide("loop-run");
    multidepend({"loop-again", "loop-run"});

    println("Setting bridged to ", linkif.dev);

    # Set VM NIC config.
    runonce({"/usr/bin/VBoxManage", "controlvm", "Windows XP", "nic1", "bridged", linkif.dev});

    # Wait some time (in milliseconds).
    sleep("2000", "0");

    # Continue loop.
    multiprovide("loop-again");
}

process lan_iface {
    var("eth0") dev;

    # Wait for device to appear and for link (e.g. cable).
    net.backend.waitdevice(dev);
    net.backend.waitlink(dev);

    multiprovide("link-eth0");
}

process wlan_iface {
    var("wlan0") dev;

    # Wait for device to appear and for link (e.g. cable).
    net.backend.waitdevice(dev);
    net.backend.waitlink(dev);

    multiprovide("link-wlan0");
}

Możesz użyć powyższego programu, uruchamiając (jako konto użytkownika, a nie root):

badvpn-ncd --loglevel warning --config-file <file_with_above_script.ncd>

Pamiętaj, aby dostosować nazwy interfejsu w skrypcie i nazwę maszyny wirtualnej. Po sprawdzeniu, że działa, możesz skonfigurować środowisko pulpitu, aby automatycznie uruchamiało badvpn-ncdproces.

Ambroz Bizjak
źródło