Если хоть раз попробуешь установить Linux под VirtualBox’ом, может сложиться впечатление, что это очень простой инструмент. Интерфейс виртуальной машины не содержит ничего лишнего, а работа с приложением предельно понятна и прозрачна. На самом же деле под этой простотой скрывается масса дополнительных возможностей, которая нужна далеко не всем. Но эта история не про нас.
Работая с VirtualBox’ом каждый день, открываешь для себя все новые и новые фишки. Например, недавно, когда мне понадобилось отснифать весь трафик виртуальной машины, оказалось, что необязательно использовать сниффер: для этого есть встроенная опция в самой программе. А встроенный API, как оказалось, за последние полтора года сильно шагнул вперед, и я буквально за часик разобрался и сварганил скрипт, который автоматически выполнял нужные мне действия внутри гостевой системы. Сегодня мы решили аккумулировать свой опыт и составить несколько полезных и подчас неочевидных приемов работы с VirtualBox, к которым нам нередко приходится прибегать.
Трик 1. Управляем виртуальными машинами через RDP
Удаленный доступ — это то, что я использую каждый день. С этой стороны особенно приятно, что к любой виртуальной машине VirtualBox можно удаленно подключиться и комфортно работать с ней, используя стандартный протокол RDP (Remode Desktop Protocol). Подойдут любые знакомые клиенты: виндовая утилита mstsc или, например, никсовый FreeRDP (www.freerdp.com). Для каждой виртуальной машины выделяется отдельный порт, поэтому нет никакой проблемы, чтобы запустить на хостовой машине сразу несколько виртуалок и в случае необходимости обращаться к любой из них. Соответственно, все, что нужно для подключения — это указать IP-адрес хостовой машины с нужным портом. Стандартный виндовый клиент вызывается по команде mstsc. Под никсами выполнить подключение не менее просто через rdesktop, который в любом современном дистрибутиве установлен по умолчанию:
1 |
rdesktop host_system_ip:port |
Включить доступ по RDP и назначить порт можно в настройках каждой виртуальной машины на вкладке «Удаленный дисплей». Для виртуалки с виндой можно оставить порт по умолчанию 3389 (имей в виду, что он может быть занят непосредственно серверо м RDP хостовой машины), а для машины с никсами — 3390 и т.д. Если планируется несколько одновременных подключений, необходимо активировать соответствующую опцию. Помимо этого здесь настраиваются параметры авторизации.
Самый небезопасный метод — полностью отключить процедуру аутентификации, но в этом случае доступ к виртуалке получит любой желающий. Вместо этого можно выбрать авторизацию через аккаунты хостовой системы или учетные записи гостевой системы. Для того, чтобы данные было невозможно отснифать, любая RPD-сессия шифруется с помощью симметричного RC4 алгоритма с 128-битным ключом, который меняется каждые 4096 отправленных пакетов.
Трик 2. Устанавливаем веб-морду
Чтобы иметь доступ к виртуальным машинам извне, на домашнем роутере мне приходится пробрасывать порты для каждой из них.
Все хорошо ровно до того момента, пока не окажешься в сети, где админ режет весь подозрительный (с его точки зрения) трафик, и попытки подключения по RDP летят в тартарары. К счастью, старый добрый протокол HTTP разрешен везде, и этим фактом нельзя не воспользоваться. Мы уже когда-то рассказывали о веб-интерфейсе для управления виртуальной машиной с помощью VirtualBox Web Console (code.google.com/p/vboxweb). Ныне этот проект не развивается и не поддерживается, но зато он был взят за основу актуального решения phpVirtualBox (code.google.com/p/phpvirtualbox). По сути, это точная копия интерфейса десктопной версии VirtualBox, но реализованная на PHP и AJAX. Получается, что из любого места, имея под рукой лишь браузер, можно обратиться к серверу с установленным phpVirtualBox и получить доступ к свои виртуальным машинам. Блеск.
1. Для работы phpVirtualBox необходим запущенный на хостовой машине демон vboxwebsrv (он распространяется вместе с VirtualBox). На никсовых машинах он, как правило, располагается в папке /usr/bin. Под виндой он находится в папке с VirtualBox, то есть, скорее всего, в C:\Program Files\Oracle\VirtualBox. Важный момент: программа должна быть запущена под тем же пользователем, что и сам VirtualBox. Лучше всего отключить весь вывод программы, в противном случае будет сильно страдать производительность.
1 |
"C:\Program Files\Oracle\VirtualBox\vboxwebsrv.exe" >nul |
2. Далее нам понадобится любой работающий веб-сервер с PHPинтерпретатором. Чтобы не париться с настройкой, можно взять готовую сборку XAMP или XAMPPLite (www.apachefriends.org). Файлы из архива phpVirtualBox необходимо разместить в папке htdocs.
3. В завершение необходимо прописать некоторые настройки VirtualBox’а в файле config.php, назначив новые значения для переменных $username, $password, $location. Все. После этого можно попробовать открыть админку (http://<ip-адрес сервера>:<порт>) и убедиться, насколько все здорово работает. На сайте VirtualBox можно скачать SDK разработчика, в котором помимо прочего находятся исходники RDP-клиента, реализованного на Flash’е. Технология называется RDP Web Control и позволяет прямо из вкладки браузера управлять виртуальной машиной так же, как через любой RDP-клиент. Разработчики phpVirtualBox, само собой, встроили RDP Web Control в свою оболочку. Так что через веб-оболочку доступно не только управление настройками виртуальных машин, но и полноценная работа с ними. Это очень круто!
Трик 3. Управляем ВМ через консоль!
Но удаленный доступ — это не все, что нужно для эффективного использования виртуальных машин. Еще одна важная часть — возможность автоматизации. К счастью, в VirtualBox никто не обязывает тебя использовать GUI-интерфейс. Любые действия можно выполнить через консольную утилиту администрирования VBoxManage.exe и использовать ее в любых своих сценариях. Можешь попробовать ввести команду «VBoxManage list vms» — получишь в консоли список всех существующих виртуальных машин, их имена и идентификаторы UUID:
1 2 3 4 5 6 |
Oracle VM VirtualBox Command Line Management Interface Version 3.2.10 (C) 2005-2010 Oracle Corporation All rights reserved. "MacOS" {5f74df26-8f93-4f18-b120-da107a5e0a9c} "macox" {8385d552-b41e-4ffd-add0-3b8795e53f46} "ubuntu" {09e0b578-3668-4492-92d2-7fa5fb21c911} "vista" {27b526c2-6bca-4cfe-ace8-703b803670a8} "xp" {521f3a25-68c7-44e7-a28f-0c60ee87295e} |
Хочешь запустить одну из них прямо из консоли? Ничего сложного: отдаем соответствующую команду, указав имя нужной виртуалки — «VBoxManage.exe startvm xp». Верный способ получить справку о том, какие команды доступны, и как их использовать — запустить приложение без параметров. Разработчики гарантируют, что консольная версия ничем не уступает GUI-оболочке, и любые действия с виртуальными машинами можно с не меньшим успехом выполнить через VBoxManage. Выше я упоминал SDK для разработчиков, который обновляется с каждой новой версией VirtualBox и выкладывается на официальном сайте.
Программа предоставляет мощнейший API для управления виртуальными машинами. Система встроенных вызовов такова, что использовать ее можно из самых разных языков программирования: существуют привязки (то есть специальные модули) для Java, Python и других языков. В качестве хорошего примера для старта можно взять из SDK vboxshell.py, в котором через API реализовано несколько полезных опций для управления виртуалками. В том числе запуск программы внутри гостевой ОС, создание скриншота с дисплея виртуальной машины, подключение ISO-образа в качестве CD/DVD-диска, проброс портов из хостовой машины в гостевую ОС и т.д. В прошлом году у нас был материал «Прокачиваем виртуальную машину», где мы уже рассматривали API VirtualBox’а. Тогда из-за отсутствия вызовов для управления поведением гостевой системы (например, запуска приложений) нам пришлось использовать API VMware с более продвинутыми возможностями. Сейчас же API VirtualBox сделала два шага вперед, и мы вполне могли обойтись без использования платной VMware.
Трик 4. Снифаем весь трафик виртуальной машины
Недаром во время установки VirtualBox под винду выводятся предупреждения, что все сетевые подключения будут на небольшое количество времени отключены. Программа устанавливает в систему дополнительные сетевые драйвера и виртуальные сетевые адаптеры. Их можно найти через диспетчер устройств: «VirtualBox Host-Only Ethernet Adapter» — то, о чем я говорю. Весь трафик гостевой системы, конечно же, проходит через эти вспомогательные элементы. И вот за что разработчикам хочется в очередной раз сказать «Спасибо», так это за возможность записать весь трафик напрямую в pcap-файл. Да, для перехвата пакетов можно было воспользоваться и обычным сниффером (причем как под гостевой, так и под хостовой системой), но используя эту встроенную возможность VirtualBox, ты получаешь в распоряжение лог абсолютно всех пакетов, который отправила или получила гостевая ОС. Для включения записи сетевого трафика достаточно двух команд:
1 2 3 4 5 6 7 |
VBoxManage modifyvm [your-vm] --nictrace[adapternumber] on --nictracefile[adapter-number] file.pcap VirtualBox -startvm [your-vm] Например, так: VBoxManage modifyvm "ubuntu" --nictrace1 on --nictracefile1 file.pcap VirtualBox -startvm "ubuntu" |
В результате в файле file.pcap будет полный дамп трафика, который можно изучить с помощью любого анализатора, например, Wireshark. Важно после всех экспериментов не забыть отключить логирование, иначе pcap-файлы будут разрастаться на диске (особенно если ты решишь скачать под гостевой ОС какие-то тяжелые файлы).
Трик 5. Переносим существующую Windows-систему в виртуальное окружение
Под виртуальной машиной не всегда удобно устанавливать систему с нуля.
Избежать геморроя с установкой и настройкой дополнительного софта можно, если перенести под VirtualBox свою существующую систему. Этот процесс называется миграцией, или P2V (Physical-to-Virtual). В отличие от Linux’а, перенести Windows с одного железа на другое — не такая простая задача. Виной тому ядро и драйверы, которые сильно завязаны на текущее оборудование. Каждый, наверное, сталкивался с ситуацией, когда после подключения системного диска с виндой к другому компьютеру система вместо нормального запуска вываливалась в BSOD. В случае с миграцией на виртуальную машину — ровно такая же ситуация. Разработчики VirtualBox не предлагают специальной утилиты для P2V-миграции, но процесс можно проделать вручную. Итак, пошаговая инструкция:
1. Первым делом понадобится вспомогательная тулза MergeIDE (http://bit.ly/Merge_IDE). По какой-то странной причине Windows запоминает, на каком IDE/ATA-контроллере она была установлена, и вылетает, если контроллер меняется (а под виртуальной машиной он, само собой, будет другим). Проблему можно исправить, поковырявшись в реестре, но чтобы не заниматься этим вручную, достаточно просто запустить BAT-файл MergeIDE.
2. Выключаем компьютер. Теперь наша задача — сделать полный образ жесткого диска. Как вариант — можно загрузиться с LiveCDдистрибутива и воспользоваться любой низкоуровневой утилитой для работы с образами. Идеально подойдет dd.
3. Полученный образ необходимо преобразовать в VDI-образ, который далее мы сможем подключить к VirtualBox. Воспользуемся уже знакомой нам программой VBoxManage:
1 |
VBoxManage convertfromraw ImageFile.dd OutputFile.vdi |
Все, этот образ можно и нужно подключить к VirtualBox’у с помощью менеджера виртуальных носителей (вызывается хоткеем <Ctrl+D>).
4. Теперь необходимо создать виртуальную машину и подготовить ее к имплантации сложного пациента :). В качестве диска необходимо выбрать только что созданный VDI-образ. Еще один обязательный момент — активация в настройках виртуалки опции «Включить IO APIC».
5. Пробуем загрузить систему. Здесь два варианта: либо все сразу заработает, либо система сразу уйдет в BSOD. Если все пошло по удачному сценарию, можно смело устанавливать Guest Editions и приступать к работе.
6. В противном случае необходимо выключить виртуалку и загружаться с установочного диска Windows. Проходим до места, где указывается раздел для установки, и выбираем вместо полной инсталляции пункт «repair». Установщик сам доставит все необходимые файлы и отконфигурирует винду под новое железо.
Трик 6. Подготовка DualBoot
Но если реальную систему можно подогнать под работу в виртуальном окружении, не получится ли создать универсальный вариант? Чтобы система могла грузиться сама по себе, а в случае необходимости — под виртуальной машиной. Возможно ли такое? Да! Правда, для этого виртуалке необходим доступ «наружу», то есть напрямую к жестким дискам компьютера. В VirtualBox такая возможность называется «raw hard disk access» и предлагается разработчиками с массой предупреждений о том, что это верный способ убить систему. И, кстати, они не шутят :). Еще бы, ведь нарушается целостность понятия изолированной виртуальной системы — она получает доступ вовне. И всетаки, как включить raw hard disk access?
Прямой доступ к дискам (как ко всей поверхности, так и к отдельным разделам) реализован как часть формата дисков для виртуальной машины VMDK. Необходимо создать специальный образ, в котором будет указано, где на самом деле будут храниться данные на физическом диске. Принцип понятен: подключив такой образ к виртуальной машине, ты получаешь доступ к жесткому диску. Проще всего дать виртуалке доступ вообще ко всему жесткому диску:
1 2 3 |
VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk \\.\ PhysicalDrive0 -register |
Это пример для винды. Под линуксом путь к физическому диску, конечно же, будет другим, например, /dev/sda. Создание образа предполагает, что у тебя есть доступ для записи и чтения с указанного девайса. Те же права потребуются для обращения к файлам из виртуальной машины. После создания VMDK-файла остается подключить его к виртуальной машине:
1 2 3 4 |
VBoxManage storageattach WindowsXP --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium /path/to/ file.vmdk |
Если все сделано правильно, виртуальная машина будет грузиться с указанного физического диска. Но это лишь часть работы. Чтобы система работала и под виртуальной машиной, и без нее, придется немного поковыряться. Подробнейшие пошаговые инструкции доступны на форуме VirtualBox: для Windows XP (http://bit.ly/dualbox_xp) и Windows 7 (http://bit.ly/dualboot_w7). Повторяться не будем.
Трик 7. Wi-Fi и вардрайвинг под виртуальной машиной
Используя виртуальную машину, на которой установлен Linux, я не раз сталкивался с ограничениями из-за отсутствия прямого доступа к Wi-Fi-адаптору. Да, сделать инет в гостевой системе через хостовую ОС — не проблема, но использовать беспроводной адаптер со специальными приложениями просто не выйдет.
Поэтому всякий раз, когда была необходимость поэкспериментировать с беспроводными сетями с помощью aircrack’а и kismeta, чтобы послушать эфир или оценить защиту хотспота, приходилось запускать линукс с загрузочной флешки. Проблема эта, как оказалось, легко решаема благодаря возможности VirtualBox обращаться к USB-устройствам напрямую. Другими словами, можно купить за $20 USB’шный Wi-Fi-адаптер (причем сразу на правильном чипсете и с возможностью использовать внешнюю антенну) и сделать так, чтобы гостевая система думала, что он подключен к ней. Конечно, после подключения устройства к компьютеру/ноутбуку девайс определяется и устанавливается в основной системе (в моем случае — Windows). Но если зайти в свойства виртуальной машины и найти там раздел USB, то любое из устройств можно «примонтировать» к гостевой ОС. Для этого нажимаем на кнопку «Добавить новый фильтр» и из контекстного меню выбираем наш USB’шный адаптер. Все, устройство отключится от хостовой ОС и станет доступным в виртуальной машине. Пробуем запустить под Backtrack’ом aircrack и убеждаемся, что все работает. Наконец-то все это стало возможным без перезагрузки в Linux.
Напоследок еще один маленький секрет. VirtualBox, хотя и прочно устанавливается в системе, вполне работоспособен при запуске с флешки. Умельцы заморочились и сделали Portable-версию виртуальной машины и предлагают загрузить ее всем желающим с сайта www.vbox.me.
Джерело: https://xakep.ru/2011/04/20/55217/
Leave a Reply