Marcin Lewandowski
Marcin Lewandowski
Programista PHP ( Symfony ), blogger, trener oraz miłośnik kawy. Na co dzień pracuję z Symfony, RabbitMQ, ElasticSearch, Node.js, Redis, Docker, MySQL.

Konfiguracja sieci w Vagrant

Konfiguracja sieci w Vagrant

Konfiguracja sieci wirtualnej maszyny przez Vagrant-a jest dość elastyczna i każdy powinien znaleźć rozwiązanie spełniające jego wymagania. Zaczynając od zwykłego przekierowania portów przez stworzenie prywatnej sieci niedostępnej spoza maszyny gospodarza (hosta), kończąc na publicznym dostępie.

Wpis ten będzie bazował na pliku Vagrantfile, który tworzyłem w poprzednim wpisie Vagrant instalacja i konfiguracja środowiska. Końcowym efektem był serwer www oparty o Nginx-a + PHP + MariaDB, pokażę jak udostępnić go w różnych konfiguracjach sieci.

Dla osób, które nie chcą czytać poprzedniego wpisu, a chcą na bieżąco testować wprowadzane modyfikacje, zapraszam do pobrania Vagrantfile wraz z dodatkowymi plikami na GitHub-a.

Przekierowanie portów – forwarded_port

Zaczniemy od najprostszej konfiguracji, czyli zwykłe przekierowanie portów. Dla osób nie będących w temacie, przekierowanie portów działa w bardzo prosty sposób. Na naszym komputerze (host) pod jakimś portem np. 1234 jest ustawione przekierowanie na zdefiniowany port innego komputera lub naszego.

Najprościej można sobie to wyobrazić jako skrót, taki jak spotykamy w programach. Pomimo że mamy na pulpicie skrót do programu, który go uruchamia to wiemy, że prowadzi on do innego miejsca w systemie skąd jest uruchamiana aplikacja.

We wzorcowym pliku mamy zdefiniowaną sieć prywatną:

config.vm.network :private_network, ip: '192.168.33.10'

Usuwamy powyższy wpis i zastępujemy go poniższym:

config.vm.network "forwarded_port", guest: 80, host: 1234

Klucz config.vm.network przyjmuje w tym przypadku następujące parametry:

  • forwarded_port – rodzaj sieci, w tym przypadku przekierowanie portów,
  • guest – numer portu w wirtualnej maszynie na którą mówimy że jest gościem (guest),
  • host – numer portu komputera na którym jest uruchamiana wirtualna maszyna (host)

Po wprowadzeniu zmian zapisujemy plik i przeładowujemy maszynę poleceniem:

vagrant reload

Po ponownym uruchomieniu wirtualnej maszyny i wczytaniu nowej konfiguracji. Powinniśmy zobaczyć w naszej przeglądarce pod adresem http://localhost:1234 stronę wyświetlaną przez Nginx-a, który znajduje się w wirtualnej maszynie.

Sieć prywatna – private_network

Sieć prywatna podobnie jak przekierowanie portów daje dostęp do wirtualnej maszyny tylko z poziomu komputera gospodarza (host-a). Tym samym nikt z “zewnątrz” nie będzie miał dostępu do tak przygotowanej maszyny.

Z siecią prywatną mieliśmy już do czynienia w podstawowej konfiguracji pliku Vagrantfile jaka została przygotowana. Poniżej wpis, który możemy zobaczyć domyślnie w naszym pliku.

config.vm.network :private_network, ip: '192.168.33.10'

Klucz config.vm.network przyjmuje w tym przypadku następujące parametry:

  • private_network – rodzaj sieci, w tym przypadku sieć prywatna,
  • ip – statyczny adres IP,

Jak zapewne zauważyliście mamy tutaj zdefiniowany statyczny adres IP naszej wirtualnej maszyny. Jest to o tyle wygodne, że od razu mamy wiedzę pod jakim adresem IP będzie ona dostępna.

Jednak dla chcących skorzystać z serwera DHCP istnieje także taka możliwość. Zmieniamy tylko wpis na:

config.vm.network :private_network, type: "dhcp"

Jednak to wymaga od nas zalogowania się do wirtualnej maszyny lub sprawdzenia w serwerze DHCP jaki adres został przyznany. Szybciej będzie zalogować się do wirtualnej maszyny 😉

vagrant ssh

Następnie sprawdzamy interfejsy sieciowe, ja korzystam z Ubuntu lub Debian-a więc skorzystam z polecenia ifconfig.

Sieć publiczna – public_network

Ostatni rodzaj sieci z jakim mamy do czynienia, to maszyna dostępna publicznie w naszej sieci jak pozostałe komputery i urządzenia.

Konfigurację sieci zmieniamy na:

config.vm.network "public_network", ip: "192.168.1.200"

Klucz config.vm.network przyjmuje w tym przypadku następujące parametry:

  • public_network – rodzaj sieci, w tym przypadku sieć publiczna,
  • ip – statyczny adres IP z naszej sieci,

Podobnie jak przy konfigurowaniu sieci prywatnej tutaj także mamy statyczny adres IP. Jednak w odróżnieniu od sieci prywatnej w tym przypadku istnieje dużo większe ryzyko wystąpienia problemów. Jest to związane z faktem, że w sieci zapewne znajduje się serwer DHCP, który przyznaje adresy IP urządzeniom. My zaś definiując adres statyczny adres możemy spowodować konflikt adresów, gdyż serwer DHCP nie wie że adres IP 192.168.1.200 został wykorzystany. Więc albo wykluczymy go z puli w konfiguracji serwera DHCP, albo zmienimy konfigurację na DHCP.

Po zmianie ustawień w pliku Vagrantfile, zapisujemy je i restartujemy serwer poleceniem vagrant reload. I tutaj możecie się nieco zdziwić, gdyż podczas procesu uruchamiania zostaniecie zapytani, który interfejs sieciowy gospodarza (host-a) ma zostać wykorzystany przy połączeniu z siecią.

Wybieracie ten, który wykorzystujecie do połączenia z internetem (wpisujecie jego numer i potwierdzacie enter-em). I operacja powinna przebiec dalej bez problemów.

Skoro przypisywanie adresu IP na stałe jest ryzykowne, to ustawmy pobieranie go z serwera DHCP.

config.vm.network "public_network", type: "dhcp"

Tak jak poprzednio podczas procesu uruchamiania konieczne jest wybranie interfejsu sieciowego, którego Vagrant ma użyć do konfiguracji sieci. Jest to dość upierdliwe więc dodamy dodatkowy parametr bridge, który pozwoli na automatyczne wybranie interfejsu.

config.vm.network "public_network", 
    type: "dhcp", 
    bridge: "en0: Wi-Fi (AirPort)"

Wartość nowo dodanego parametru bridge musi być nazwą naszego interfejsu sieciowego z którego będziemy chcieli skorzystać. Zapisujemy zmiany i restartujemy wirtualną maszynę, tym razem nie powinniśmy zostać zapytani o interfejs sieciowy.

Dalej jak w przypadku sieci prywatnej logujemy się przez ssh poleceniem vagrant ssh i sprawdzamy adres IP poleceniem ifconfig.

I to by było na tyle jeśli chodzi o konfigurację sieci w Vagrancie. Oczywiście że powyższe rozwiązania nie wyczerpują tematu sieci i ich konfiguracji, gdyż możliwe jest ręczne konfigurowanie interfejsów sieciowych oraz wiele więcej. Jednak tym zajmiemy się innym razem 😉