Содержание статьи
Итак, какие же причины мешают просто взять и установить VirtualBox в Tails так же, как в любой дистрибутив Linux? Их несколько.
Первая. Tails — это дистрибутив «без памяти». Любые сделанные тобой модификации системы (в том числе установка пакетов) будут сброшены при выключении машины. Обойти эту проблему можно, создав Persistent-раздел и внеся нужные пакеты в список для сохранения. При следующей загрузке Tails установит эти пакеты заново. Но это только начало.
Вторая. У Tails есть одна дурацкая особенность: 64-битное ядро и 32-битное окружение исполнения. Все пакеты этого дистрибутива 32-битные, а это значит, что стандартными методами можно установить только 32-битную версию VirtualBox, которая будет иметь ограничение в три гига для каждой виртуальной машины. Более того, запустить эту версию на 64-битном ядре ты не сможешь: 32-битной VirtualBox нужны 32-битные модули ядра и соответствующее ядро.
Эту проблему можно обойти, загрузив Tails с 32-битным ядром (оно есть в комплекте). Но тогда ты получишь систему, которая сама будет ограничена тремя гигабайтами оперативной памяти. Если учесть, что Tails довольно требователен к оперативке, так как использует RAM-диск для корневой файловой системы (стандартная практика для Live CD / Live USB), виртуалкам не останется вообще ничего.
Третья. Даже если ты сможешь обойти две предыдущие проблемы, ты столкнешься с тем, что твои виртуалки просто не смогут выйти в Сеть. Причина тому — ограничение Tails на подключение к сетевым хостам только через Tor. Поэтому тебе придется менять правила брандмауэра и несколько других конфигов, чтобы направить пакеты виртуальной машины в Tor. Причем делать это придется после каждой перезагрузки.
В общем, все сложно. Но мы все-таки решим все эти проблемы.
Шаг 1. Подключаем Persistent-раздел
Для выполнения следующих шагов нам понадобится так называемый Persistent-раздел. Это специальный раздел с файловой системой ext4, который можно создать на флешке рядом с основным. Его задача — хранение пользовательских данных, конфигов приложений и кеша пакетов, который нужен для быстрой установки «сохраненных» пакетов при следующей загрузке.
Чтобы создать Persistent-раздел, необходимо установить Tails, то есть не просто записать ISO-файл на флешку, а загрузиться с этой флешки и установить Tails на другую флешку с помощью инсталлятора: Меню → Tails → Tails Installer. После этого необходимо загрузиться с этой флешки и создать раздел: Меню → Tails → Configure persistent volume. Когда Tails предложит выбрать, что следует хранить на этом разделе, смело выбирай все пункты.
После завершения операции ты увидишь в каталоге /home/amnesia/
подкаталог Persistent
, в который сможешь копировать любые данные с целью сохранить их между перезагрузками.
На самом деле для установки Tails необязательно использовать две флешки. То же самое можно сделать, если запустить ISO-образ Tails внутри виртуалки, а затем прокинуть в нее USB-флешку.
Шаг 2. Устанавливаем 64-битную VirtualBox в chroot
64-битная версия VirtualBox не может работать в 32-битном окружении исполнения, однако специально для VirtualBox мы можем создать 64-битное окружение, которое будет отделено от основной системы и располагаться в разделе Persistent. Для этого в Debian (и, как следствие, Tails) есть инструмент debootstrap, позволяющий развернуть полноценный дистрибутив Debian в выделенном каталоге.
Создаем 64-битное окружение исполнения
Итак, загружаемся в Tails. В окне приветствия (More options?) нажимаем Yes и устанавливаем пароль root (любой). Далее открываем терминал и переходим в каталог Persistent:
$ cd ~/Persistent
Устанавливаем debootstrap:
$ sudo apt-get update
$ sudo apt-get install debootstrap
Отключаем брандмауэр, чтобы он не заворачивал весь трафик в Tor и не мешал нам в дальнейшей работе:
$ sudo iptables -F
$ sudo iptables -I INPUT -j ACCEPT
$ sudo iptables -I OUTPUT -j ACCEPT
$ sudo iptables -I FORWARD -j ACCEPT
Создаем каталог vbox для нашего 64-битного окружения и разворачиваем его:
$ sudo mkdir vbox
$ sudo debootstrap --arch amd64 jessie vbox http://ftp.ru.debian.org/debian/
Так мы получим скелет 64-битного Debian, в котором пока, кроме базовой системы, нет ничего. Следующий шаг — установка VirtualBox, но сначала нам нужно закинуть в окружение необходимые модули ядра.
Устанавливаем модули ядра для VirtualBox
Ядерные модули VirtualBox распространяются в форме исходников, которые собираются под конкретное ядро на этапе установки. Самый простой способ установить их внутрь виртуального окружения — это инсталлировать официальную версию VirtualBox в сам Tails, а затем скопировать скомпилированные модули в 64-битное окружение.
Для начала установим компилятор и хидеры ядра, необходимые для сборки модулей:
$ sudo apt-get install linux-headers-4.8.0-0.bpo.2-common linux-kbuild-4.8 linux-compiler-gcc-4.9-x86 gcc make
Также нам понадобятся хидеры ядра для архитектуры AMD64. Apt-get их не найдет, поэтому скачаем их с сервера Debian, а затем установим с помощью dpkg
:
$ wget http://ftp.us.debian.org/debian/pool/main/l/linux/linux-headers-4.8.0-0.bpo.2-amd64_4.8.15-2~bpo8+2_amd64.deb
$ sudo dpkg -i linux-headers-4.8.0-0.bpo.2-amd64_4.8.15-2~bpo8+2_amd64.deb
В ходе установки появится ошибка конфигурации пакета linux-headers-4.8.0-0.bpo.2-amd64
. Она же будет возникать при следующих вызовах apt-get
. Не беспокойся и смело продолжай работу, на самом деле пакет установлен.
WARNING
Пакет linux-headers-4.8.0 уже удален из официальных репозиториев Debian. Воспользуйся альтернативной ссылкой или попробуй установить из репозитория более новую версию (к примеру, 4.9.0 или выше).
Приступаем к установке VirtualBox. Добавим нужный репозиторий в /etc/apt/sources.list
:
$ deb tor+http://download.virtualbox.org/virtualbox/debian jessie contrib
Импортируем ключи Oracle:
$ wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
$ wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
Опять же не обращаем внимания на ошибки Wget. Наконец устанавливаем VirtualBox:
$ sudo apt-get update
$ sudo apt-get install virtualbox-5.1
Эта команда установит 32-битную VirtualBox, но соберет модули для 64-битного ядра. Работать такая связка в основной системе, как я уже говорил ранее, не будет. Но нам это и не нужно, нам необходимы модули. Скопируем их в 64-битное окружение:
$ sudo cp -R /lib/modules ~/Persistent/vbox/lib/
После этого VirtualBox можно удалить. Или не делать ничего, после перезагрузки она исчезнет.
Устанавливаем VirtualBox в 64-битное окружение
Чтобы установить VirtualBox в полученное окружение, надо сделать chroot (сменить корневой каталог) в каталог /Persistent/vbox
и проделать те же шаги установки. Но сначала нужно прокинуть в окружение необходимые для его работы виртуальные (и не очень) файловые системы. Для этого создадим в каталоге /Persistent
файл vbox-fstab
следующего содержания:
/sys /home/amnesia/Persistent/vbox/sys none bind 0 0
/proc /home/amnesia/Persistent/vbox/proc none bind 0 0
/dev /home/amnesia/Persistent/vbox/dev none bind 0 0
/home /home/amnesia/Persistent/vbox/home none bind 0 0
/tmp /home/amnesia/Persistent/vbox/tmp none bind 0 0
/var/tmp /home/amnesia/Persistent/vbox/var/tmp none bind 0 0
/usr/src /home/amnesia/Persistent/vbox/usr/src none bind 0 0
И подключим все перечисленные в нем файловые системы с помощью такой команды:
$ sudo mount -T ~/Persistent/vbox-fstab -a
Переключаемся в окружение с помощью chroot:
$ sudo chroot vbox /bin/bash
Настраиваем DNS и устанавливаем корневые сертификаты для корректной работы Wget и apt-get:
# echo nameserver 8.8.8.8 > /etc/resolv.conf
# apt-get install ca-certificates
Добавляем репозиторий VirtualBox в /etc/apt/sources.list
:
# echo 'deb http://download.virtualbox.org/virtualbox/debian jessie contrib' >> /etc/apt/sources.list
Импортируем ключи Oracle:
# wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | apt-key add -
# wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | apt-key add -
Устанавливаем VirtualBox:
# apt-get update
# apt-get install virtualbox-5.1
И наконец запускаем ее:
# modprobe vboxdrv
# modprobe vboxnetflt
# modprobe vboxnetadp
# modprobe vboxpci
# virtualbox
Поздравляю, у тебя есть рабочая 64-битная VirtualBox в Tails. Но это еще не все, теперь необходимо сделать так, чтобы виртуалки могли выйти в Сеть через Tor. Сейчас Сеть должна быть доступна виртуалкам благодаря отключенному брандмауэру, но после перезагрузки Tails снова его переконфигурирует, и выход в Сеть будет закрыт.
Шаг 3. Организуем выход в Сеть через Tor
Чтобы дать виртуалкам возможность подключаться к хостам через Tor, мы можем воспользоваться функцией прозрачного проксирования трафика Tor в сочетании с правилами брандмауэра, перенаправляющими трафик виртуалок на адрес 127.0.0.1 и порт прозрачного прокси (9040).
Но что значит трафик виртуалок? Как мы поймем, какой трафик принадлежит виртуалкам, а какой — самой системе? Очень просто: мы поднимем виртуальный сетевой мост, который будет иметь фиксированный IP-адрес и заранее заданное имя. Поднять такой мост довольно несложно:
$ sudo chroot vbox /usr/bin/vboxmanage hostonlyif create
$ sudo chroot vbox /usr/bin/vboxmanage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0
Но не спеши выполнять эту команду. Дело в том, что в Tails есть специальный скрипт, который активируется в момент появления в системе нового сетевого интерфейса (например, при втыкании USB Wi-Fi адаптера) и рандомизирует его MAC-адрес.
А самое интересное здесь в том, что, если рандомизировать MAC не получится, Tails полностью отключит доступ в Сеть вообще всем приложениям. Этого мы допустить не можем, поэтому придется модифицировать скрипт таким образом, чтобы в случае обнаружения нашего сетевого моста он завершался.
К счастью, сделать это несложно. Достаточно добавить всего одну строку в начало скрипта /usr/local/lib/tails-spoof-mac
:
if [ "$1" = "vboxnet0" ]; then exit; fi
Теперь надо заставить систему прозрачного проксирования Tor слушать на адресе сетевого моста. Сам прозрачный прокси уже активен в настройках Tor (Tails использует его, чтобы перенаправлять в Tor обращения к доменам .onion), поэтому нужно всего лишь добавить в конфиг Tor (/etc/tor/torrc
) две строки:
DNSListenAddress 192.168.56.1
TransListenAddress 192.168.56.1
Остается только завернуть трафик сетевого моста в Tor. Для этого можно использовать iptables:
$ sudo iptables -A INPUT -i vboxnet0 -j ACCEPT
$ sudo iptables -A FORWARD -i vboxnet0 -j ACCEPT
$ sudo iptables -t nat -A PREROUTING -i vboxnet0 -p udp --dport 53 -j REDIRECT --to-ports 5353
$ sudo iptables -t nat -A PREROUTING -i vboxnet0 -p tcp --syn -j REDIRECT --to-ports 9040
$ sudo iptables -t nat -I POSTROUTING -s 192.168.56.0/24 -j MASQUERADE
Однако, так как при обнаружении нового сетевого устройства Tails сбрасывает настройки iptables, надежнее добавить правила в файл /etc/ferm/ferm.conf
, который как раз и используется для сброса правил.
Сам конфиг ferm.conf принадлежит утилите ferm, эдакой надстройке над iptables, которая позволяет задавать правила в более читаемой и удобной форме, чем сам iptables. Его формат интуитивно понятен, поэтому я не буду о нем рассказывать, а вместо этого скажу, какие строки в какую секцию добавить.
Секция chain INPUT
. Строка:
interface vboxnet0 ACCEPT;
Секция chain FORWARD
. Строка:
interface vboxnet0 ACCEPT;
Секция chain PREROUTING
. Строки:
interface vboxnet0 proto udp dport 53 REDIRECT to-ports 5353;
interface vboxnet0 proto tcp syn REDIRECT to-ports 9040;
Секция chain POSTROUTING
. Строка:
saddr 192.168.56.0/24 MASQUERADE;
Все. Теперь мы готовы создать виртуальный сетевой интерфейс и перезапустить Tor:
$ sudo chroot vbox /usr/bin/vboxmanage hostonlyif create
$ sudo chroot vbox /usr/bin/vboxmanage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0
$ sudo systemctl restart tor
В результате создания сетевого интерфейса Tails перечитает правила ferm и сам применит наши настройки редиректа. Но это еще не все. Чтобы запущенные в VirtualBox машины могли автоматически настроить сеть (то есть получить информацию о своем IP и адресах DNS-серверов), нам нужен локальный DNS-сервер.
Самый простой вариант получить DNS-сервер на локальной машине — это dnsmasq. Установим его:
$ sudo apt-get install dnsmasq
Внесем в конфиг /etc/dnsmasq.conf
необходимые правки:
port=53
interface=vboxnet0
bind-interfaces
dhcp-range=192.168.56.2,192.168.56.254,1h
Перезапустим:
$ sudo systemctl restart dnsmasq
Теперь точно все. Можно запускать VirtualBox:
$ sudo chroot vbox /usr/bin/virtualbox
Но имей в виду, что каждую виртуалку придется перенастраивать на выход в Сеть через интерфейс vboxnet0. Для этого необходимо открыть настройки виртуалки и на вкладке Network первого адаптера выбрать Host-only Adapter, Name: vboxnet0.
Сами виртуалки и ISO-образы следует кидать в каталог /Persistent/vbox/root
, иначе VirtualBox их не увидит.
Шаг 4. Автоматизируем запуск VirtualBox
Мы получили корректно работающую VirtualBox с прозрачным проксированием трафика виртуалок в Tor. Но проблема Tails, как я уже говорил выше, в том, что после перезагрузки все наши настройки слетят. Сама песочница с установленной VirtualBox и модулями ядра останется на месте, а вот правки спуфера MAC-адресов, ferm и прочее будут утрачены. Да и запускать, честно говоря, не очень удобно.
Поэтому мы напишем скрипт, который будет изменять настройки системы автоматически:
#!/bin/bash
copy_spoofer() {
cp tails-spoof-mac /usr/local/lib/tails-spoof-mac
chown root:root /usr/local/lib/tails-spoof-mac
}
copy_ferm() {
cp ferm.conf /etc/ferm/ferm.conf
chown root:root /etc/ferm/ferm.conf
}
setup_chroot() {
mount | grep vbox > /dev/null && return
mount -T vbox-fstab -a
chroot vbox /sbin/modprobe vboxdrv
chroot vbox /sbin/modprobe vboxnetflt
chroot vbox /sbin/modprobe vboxnetadp
chroot vbox /sbin/modprobe vboxpci
}
setup_bridge() {
ifconfig | grep vboxnet0 > /dev/null && return
chroot vbox /usr/bin/vboxmanage hostonlyif create
chroot vbox /usr/bin/vboxmanage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0
}
configure_tor() {
cat /etc/tor/torrc | grep 192.168.56.1 > /dev/null && return
echo DNSListenAddress 192.168.56.1 >> /etc/tor/torrc
echo TransListenAddress 192.168.56.1 >> /etc/tor/torrc
systemctl restart tor
}
configure_dhcpd() {
cat /etc/dnsmasq.conf | grep vboxnet0 > /dev/null 2>&1 && return
apt-get -y install dnsmasq
echo >> /etc/dnsmasq.conf
echo port=53 >> /etc/dnsmasq.conf
echo interface=vboxnet0 >> /etc/dnsmasq.conf
echo bind-interfaces >> /etc/dnsmasq.conf
echo dhcp-range=192.168.56.2,192.168.56.254,1h >> /etc/dnsmasq.conf
systemctl restart dnsmasq
}
copy_spoofer
copy_ferm
setup_chroot
setup_bridge
configure_tor
configure_dhcpd
chroot vbox /usr/bin/virtualbox
Назови этот скрипт start.sh
, размести в каталоге /Persistent
рядом с каталогом vbox и дай права на исполнение:
$ chmod +x ~/Persistent/start.sh
Плюс скопируй уже исправленные версии /usr/local/lib/tails-spoof-mac
и /etc/ferm/ferm.conf
в каталог /Persistent
:
$ sudo cp /usr/local/lib/tails-spoof-mac ~/Persistent
$ sudo cp /etc/ferm/ferm.conf ~/Persistent
Теперь можешь перезагрузить машину, а затем сразу после загрузки запустить VirtualBox такой командой:
$ cd ~/Persistent
$ sudo ./start.sh
Система должна работать как часы.
Заключение
Запустить VirtualBox в Tails хоть и сложно, но можно. Да, это довольно извращенная конфигурация, но она позволит тебе иметь флешку, с помощью которой ты сможешь запустить практически любую ОС в полностью анонимизирующей среде, которую обеспечивает Tails.
Более того, ты сможешь установить Whonix внутрь Tails и получить две анонимизирующие системы, работающие одна в другой. И весь трафик в таком случае будет заворачиваться в Tor два раза: туннель Tor внутри туннеля Tor. Правда, здорово?