Tematem niniejszego artykułu będzie budowanie sieci pomiędzy maszyną wirtualną, a hostem w celu np. testowania rozwiązań sieciowych, testowania zabezpieczeń czy zabawy usługami sieciowymi.
Dopuszczenie naszej maszyny wirtualnej w VirtualBox do internetu czy sieci lokalnej jest dosyć proste. Wystarczy aktywować kartę sieciową i wybrać opcję NAT. Wtedy host staje się przekaźnikiem pakietów wirtualnej maszyny w sposób przezroczysty i jeśli system goszczony obsługuje DHCP bez problemu można śmigać w po sieci. Ale nie możemy w ten sposób spingować maszyny wirtualnej spod hosta, ani podłączyć się do którejś z usług. Dlatego potrzebne jest zrobienie takiego wirtualnego kabla sieciowego, który będzie podłączony do naszego wirtualnego portu. Dzięki temu jeśli na maszynie wirtualnej postawimy serwer www, to z hosta po wpisaniu adresu w przeglądarce wyświetli się strona. Ja osobiście to rozwiązanie wykorzystywałem do sprawdzania integracji Samby z Windows'em.
Aby w ten sposób połączyć hosta z maszyną wirtualną w VirtualBox należy wybrać opcję Mostkowana karta sieciowa i wybrać interfejs sieciowy do którego będzie podpięta wirtualna maszyna. Poniżej przedstawiam schemat w jaki sposób maszyna wirtualna będzie komunikować się z hostem.
(Jeśli schemat jest za mały kliknij tutaj)
Zacznijmy najpierw od zainstalowania pakietów odpowiedzialnych za tworzenie mostków pomiędzy interfejsami. Wykorzystując apturl można je zainstalować prosto ze tej strony (jak skonfigurować apturl dowiemy się z tej strony):
Po zainstalowaniu pakietów tworzymy interfejs br0 za pomocą następujących poleceń:
$ sudo brctl addbr br0
$ sudo ifconfig br0 up
$ sudo ifconfig br0 192.168.0.1 netmask 255.255.255.0
$ sudo ifconfig br0 up
$ sudo ifconfig br0 192.168.0.1 netmask 255.255.255.0
Oczywiście polecenia wpisujemy bez znaczka dolara (to tylko zachęta, jak w terminalu). Pierwszym poleceniem tworzymy wirtualny interfejs br0. Drugim poleceniem podnosimy interfejs. Trzecim nadajemy numer IP i maskę podsieci. Ten numer będzie numerem IP hosta w naszej sieci. A o to wynik polecenia ifconfig po wykonaniu tychże poleceń:
$ ifconfig
br0 Link encap:Ethernet HWaddr 1e:2b:49:f4:10:98
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::1c2b:49ff:fef4:1098/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:468 (468.0 B)
(...)
br0 Link encap:Ethernet HWaddr 1e:2b:49:f4:10:98
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::1c2b:49ff:fef4:1098/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:468 (468.0 B)
(...)
Teraz zajmiemy się tworzeniem interfejsu dla wirtualnej maszyny czyli tap0.
$ sudo tunctl -t tap0 -u qkiz
Set 'tap0' persistent and owned by uid 1000
$ sudo ifconfig tap0 up
$ sudo brctl addif br0 tap0
Set 'tap0' persistent and owned by uid 1000
$ sudo ifconfig tap0 up
$ sudo brctl addif br0 tap0
Pierwszym poleceniem tworzymy wirtualny interfejs tap0 i nadajemy właściciela urządzenia. Tutaj tym właścicielem jestem ja (uid 1000), ale normalnie za parametr -u dajcie swój login
Drugim poleceniem podnosimy interfejs, a trzecim mostkujemy oba interfejsy.

Tak wygląda wynik polecenia ifconfig po wykonaniu obu poleceń:
$ ifconfig
br0 Link encap:Ethernet HWaddr ee:99:b1:b9:81:72
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::1c2b:49ff:fef4:1098/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:468 (468.0 B)
(...)
tap0 Link encap:Ethernet HWaddr ee:99:b1:b9:81:72
inet6 addr: fe80::ec99:b1ff:feb9:8172/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:6 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
br0 Link encap:Ethernet HWaddr ee:99:b1:b9:81:72
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::1c2b:49ff:fef4:1098/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:468 (468.0 B)
(...)
tap0 Link encap:Ethernet HWaddr ee:99:b1:b9:81:72
inet6 addr: fe80::ec99:b1ff:feb9:8172/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:6 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Tyle rzeźbienia w konsoli. Teraz uruchamiamy VirtualBox'a i wchodzimy we właściwości maszyny wirtualnej. Przechodzimy do ustawień sieci i z Podłączona do wybieramy Mostkowana karta sieciowa. Poniżej wybieramy którego interfejsu ma używać maszyna, oczywiście wybieramy tap0.
Naciskamy OK i wychodzimy z ustawień maszyny. Teraz uruchamiamy maszynę wirtualną i konfigurujemy interfejs sieciowy w goszczonym systemie. Nadajemy na przykład numer IP 192.168.0.2 i oczywiście tą samą maskę co w Ubuntu, w interfejsie br0: 255.255.255.0.

Teraz spróbujmy spod Ubuntu (host) spingować maszynę wirtualną.
$ ping -c 4 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=128 time=0.624 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=128 time=0.809 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=128 time=3.83 ms
64 bytes from 192.168.0.2: icmp_seq=4 ttl=128 time=0.655 ms
--- 192.168.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.624/1.481/3.838/1.362 ms
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=128 time=0.624 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=128 time=0.809 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=128 time=3.83 ms
64 bytes from 192.168.0.2: icmp_seq=4 ttl=128 time=0.655 ms
--- 192.168.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.624/1.481/3.838/1.362 ms
Jeśli żaden firewall (ani po stronie hosta czy gościa) nie blokuje nam połączeń powinniśmy zobaczyć coś takiego jak wyżej. Ja używam Firestartera i pingi poszły dopiero po ustawieniu sieci lokalnej na interfejsie br0 i włączeniu udostępniania połączenia internetowego. Taki urok Firestartera
Ale dzięki temu w maszynie mamy od razy wyjście na świat (po ówczesnym ustawieniu bramy i DNSów).

Teraz spróbujmy spingować odwrotnie, z maszyny goszczonej.
Jak widać odpowiedzi są. Teraz możemy się bawić w kolejne usługi sieciowe np. udostępnianie plików. W Ubuntu klikamy prawym na jakiś folder i udostępniamy go. W systemie goszczonym np. Windows'ie montujemy udział jako dysk sieciowy i próbujemy się na niego dostać. Należy pamiętać o swoich zabezpieczeniach, u mnie w tym momencie Firestarter zaczął "krzyczeć", że numer 192.168.0.2 (czy wirtualna maszyna) próbuje wejść na port 445 i 139 (czyli Samba). Dodałem jej numer do wyjątków i już mogłem przeglądać udostępnione zasoby.
Jak widać działa. To otwiera nam kolejne możliwości jeśli chodzi o rozwiązania sieciowe. Możemy podstawić Ubuntu Server, a na nim serwer www i testować różne konfiguracje. Możemy postawić Windows Server i próbować go shakować
Duży plus tego rozwiązania to to, że taka wirtualna sieć zachowuje się jak połączenie ethernet i mamy jej wszystkie właściwości.
