Зайчатки разума
Это репост статьи от новогодней ночи 31 декабря 2008г. — 1 января 2009г.
Доброго времени суток. Вечер. 31 декабря 2008 года. Чем заняться человеку в такое время? Правильно! Начать писать статью на permlug, чтобы поделиться опытом. 🙂
Часть 1. Нелюбимый windows или с чего всё начиналось.
Сейчас братья-линуксоиды будут бить меня ногами и говорить, что мануалы по настройке чего-либо под win здесь не к месту. Сразу объяснюсь — пишу это для того, чтобы человек, которому приходится на работе пользоваться win, мог настроить виртуализацию и там и спокойно пользоваться одними и теми же образами виртуальных машин под различными платформами.
Преамбула: на работе стоял в стойке двухюнитовый сервер HP ML380 с четырнадцатью гигабайтами памяти и восемью скази дисками общим объёмом чуть менее терабайта (надо же, скоро эта единица измерения объёма информации станет совсем привычной, а ведь на полке где-то пылится с давних времён Seagate на 40 мегабайт :)). На этом сервере предыдущие админы догадались разместить расшаренные папки всей организации и внушительное количество всяческого барахла — дистрибутивы, драйвера и т.д.. И конечно же, на сервере стоит w2k3. Поставил snmp, подключил сервер к мониторингу и забыл о нём на какое-то время, поскольку дел было невпроворот. А потом внезапно вспомнил и решил посмотреть результаты. Результаты впечатляли. Средняя загрузка памяти — 1,6%, загрузка процессоров не поднималась выше трёх процентов. Причём гигабитным портом сервер был подключен к стомегабитному порту коммутатора, ибо больше некуда, а на гигабитный управляемый коммутатор, который можно было бы сделать центральным, начальство разоряться не хочет. В то же время, мне постоянно не хватало на работе машин, на которых можно что-то потестировать, опробовать и проверить, поэтому я решил устроить серверу размножение личности, благо, вычислительных ресурсов у него на это хватает с лихвой. Был проведён разговор с начальством и получено «добро» на использование сервера в своих целях при условии, что это не помешает пользователям работать с расшаренными документами, ибо перенести этот объём информации просто некуда. При помощи нехитрой утилитки SequoiaView (аналог встроенной в Konqueror FSView), я пошарился по папкам пользователей и конечно же, обнаружил там среди документов музыку, фильмы, игры и прочую чепуху, которая к делу не относится. Проведя разъяснительную беседу с рядом пользователей и пригрозив им введением квот, я освободил себе около 200 гигабайт места. В принципе, вполне достаточно.
Итак, приступаем к боевым действиям. Задача: получить средство быстрого создания и дублирования виртуальных хостов, которые могли бы находиться в той же сети.
Какой эмулятор выбрать? Все вокруг пользуются VmWare или на худой конец, VirtualBox’ом, но я всеми силами поддерживаю GPL и предпочитаю открытый софт, нежели просто Freeware, даже если работа с ним окажется несколько сложнее. Поэтому для меня вопрос был решён изначально. Я выбрал qemu. Но пользоваться qemu из командной строки не всегда возможно. Скажем, если на виртуальный хост поставлена w2k3, то для того, чтобы авторизоваться в системе, надо послать ей Ctrl+Alt+Del, но это сочетание клавиш перехватывает хост-система. Поэтому нам необходима некая оболочка, которая будет выполнять эти и ряд других функций, например, возможность поставить систему на «паузу» или сохранить её состояние. Под windows выбор был не так велик и в конце-концов, я остановился на Qemu Manager (http://www.davereyn.co.uk/). Простенько и со вкусом. Есть вариант для установки и есть в zip архиве, который можно распаковать и носить с собой на флешке, например. При установке или первом запуске лучше включить инсталляцию kqemu, это позволит несколько ускорить работу эмулятора.
На возможностях программы я особо останавливаться не буду, всё просто и понятно. Главный вопрос, с которым мне пришлось столкнуться — как вывести машины в сеть. Дело в том, что для *nix систем этой информации в сети было море, а для win — нет.
Общий принцип — для того, чтобы виртуальная машина могла общаться по сети с хост машиной, нужен так называемый tap интерфейс (Traffic Accounting Protocol). Но глупая w2k3 в своём составе не имеет средств для создания tap интерфейсов и придётся поставить эти средства отдельно. Для этого нам понадобится дистрибутив OpenVPN, который можно найти тут: http://openvpn.net/index.php/downloads.html. OpenVPN так же является свободной разработкой, о чём гласит надпись на их сайте «OpenVPN is Free Software released under the GNU/GPL License.» При установке мы должны выбрать только TAP-Win32 Virtual Ethernet Adapter, убрав все остальные галочки. На вопросы о совместимости оборудования отвечаем «Всё равно продолжить». После окончания установки у нас появится новый сетевой интерфейс. Если windows русская, то она его назовёт «Подключение по локальной сети» + какой-то номер. Заходим в Панель управления > Сеть и подключения к Интернету > Сетевые подключения. Там видим ещё одно подключение (сетевой кабель не подключен). Подводим к нему мышь и во всплывающей подсказке мы должны увидеть что-то вроде TAP-Win32 Adapter V8. Нажимаем правой кнопкой мыши и выбираем пункт «Переименовать», после чего даём нашему тап интерфейсу для определённости имя tap0. Затем в Qemu Manager нажимаем на иконку с красным плюсом, вводим имя машины, задаём количество памяти и размер жётского диска. После чего нажимаем кнопку с надписью Create, переходим на вкадку Networking в правой части окна, дважды кликаем на строку VLAN0 User Networking и в выпадающем меню Network Type выбираем пункт Tap Networking. В появившейся строке VLAN0 Tap ID вводим имя нашего tap интерфейса. В данном случае tap0. Теперь необходимо объёдинить его с физическим интерфейсом. Заходим в Сетевые подключения, одиночным щелчком выделяем наш tap интерфейс и удерживая Ctrl выделяем физический интерфейс, потом на одном из них нажимаем правой кнопкой мыши и выбираем пункт «Подключение типа мост». Всё, наша виртуальная машина будет использовать нашу реальную сетевую карту для общения с сетью. В отличие от юникса нам понадобится две сетевых карты. Одна — для хост системы, другая для виртуальных машин. Так же, нам надо заранее создать столько tap интерфейсов, сколько виртуальных машин предполагается держать включенными одновременно. Добавить новый tap интерфейс можно запустив скрипт C:\Program Files\OpenVPN\bin\addtap.bat, после чего его нужно будет по аналогии переименовать в tap1. Привязать его к мосту можно в свойствах моста, просто отметив галочкой.
Часть 2. Любимый linux. Или чем всё закончилось.
Придя к выводу, что виртуальные машины — это часто очень удобно, я решил сделать дома себе ещё одну «платформу виртуализации». Так как память и жёсткие диски сейчас довольно дёшевы, я сделал себе новогодний подарок — 8Гб оперативной памяти и 2 жёстких диска по 640Гб с кешем 32Мб. Зачем так много? Я знаю, что хватило бы и меньшего, но это на «вырост». Итак, что нам необходимо — возможность запускать виртуальные машины, используя те же образы жёстких дисков, что и под win, которые находились бы в той же сети, что и наша машина, другими словами, реализовать то же самое, что мы уже рассмотрели выше, только средствами linux.
Сейчас моя машина работает под 64-х битной Ubuntu 8.10. Для начала нужно установить два пакета — quemu и qemuctl, которые есть практически в любом дистрибутиве. Под дистрибутивами, основанными на debian это можно сделать, дав комманду sudo apt-get install qemu qemuctl. Первый из пакетов — это собственно сам эмулятор, второй — средство для управления им, которое потребуется нам например в случае необходимости послать эмулятору Ctrl+Alt+Del. Синтаксис параметров запуска qemuctl полностью совпадает с таковым для qemu.
Предположим, образ жёсткого диска для виртуальной машины называется disk.dsk и лежит в директории, из которой происходит запуск и мы хотим выделить машине 256 мегабайт оперативной памяти. Команда будет выглядеть так:
qemuctl -hda disk.dsk -m 256
Этого будет вполне достаточно. Теперь мы сможем передавать нашей виртуальной машине различные нажатия сочетаний клавиш, делать скришноты, останавливать работу машины и т.д..
Теперь вернёмся к вопросам работы с сетью. Сразу оговорюсь, что мой способ несколько отличается от тех, что я видел в сети.
Нам нужно создать так называемый мост (объединение интерфейсов на канальном уровне), после чего для каждой виртуальной машины создавать виртуальный tap интерфейс и объединять его с мостом. В отличие от windows, где нам приходилось создавать для каждой виртуальной машины новый tap интерфейс от имени администратора, в linux есть возможность этот процесс автоматизировать и создавать tap интерфейсы автоматически для каждой новой виртуальной машины, а после завершения её работы удалять соответствующий интерфейс. Конечно, для этих действий так же необходимы права супер пользователя, но мы решим эту проблему при помощи sudo. Далее необходимо будет произвести ряд действий от имени суперпользователя, поэтому можно воспользоваться командами sudo -s либо su -.
Сначала установим пакет bridge-utils, который позволит нам работать с соединениями типа мост.
apt-get install bridge-utils
Ещё в нашей системе должны иметься средства для работы с tun/tap интерфейсами. Обычно это tunctl, но в моей системе (ubuntu 8.10) он почему-то назывался vde_tunctl. Вы можете это проверить следующим образом:
locate tunctl /usr/bin/vde_tunctl /usr/share/man/man8/vde_tunctl.8.gz
В случае, если у Вас этот исполняемый файл называется tunctl, укажите его в скриптах вместо vde_tunctl.
Далее нам необходимо создать мост. Делается это примерно следующим образом:
Сначала наш физический интерфейс должен быть поднят без адреса
ifconfig eth0 down ifconfig eth0 0.0.0.0 up
Затем мы должны создать новый мост, добавить физический интерфейс к созданному мосту и поднять мост с теми же настройками, какие имел физический интерфейс, всё довольно просто
brctl addbr br0 brctl addif br0 eth0 ifconfig br0 192.168.1.1 up
либо если машина получает адрес через DHCP
ifconfig br0 up dhclient br0
В debian-based дистрибутивах настройки интерфейсов находятся в файле /etc/network/interfaces. Если мы рассчитываем работать с виртуальными машинами постоянно, то будет целесообразно внести настройки в него, чтобы они остались после перезагрузки системы.
Для определённости возьмём тот же пример, когда интерфейс сетевой карты называется eth0 и имеет адрес 192.168.1.1 или получает его посредством обращения к DHCP. Тогда содержимое файла /etc/network/interfaces будет примерно следующим:
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.1.1 netmask 255.255.255.0
в случае, если ip адрес был задан статически или
auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp
если адрес был получен посредством DHCP.
Вот на что мы должны заменить содержимое:
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 0.0.0.0 auto br0 iface br0 inet static address 192.168.1.1 netmask 255.255.255.0 bridge_ports eth0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off
либо в случае с DHCP
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 0.0.0.0 auto br0 iface br0 inet dhcp bridge_ports eth0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off
Теперь у нас есть мост, к которому мы можем добавлять любые интерфейсы в нашей системе. Для добавления и удаления tap интерфейсов мы напишем пару скриптов, которые будут выполняться до старта виртуальной машины и после окончания её работы.
Я обычно использую в своей работе vim, Вы можете воспользоваться тем, что привычнее Вам, скажем, nano или mcedit. Следующая комманда откроет текстовый редактор и после сохранения создаст файл /usr/sbin/tapup:
vim /usr/sbin/tapup
Ниже содержимое скрипта:
#!/bin/sh #Script for creating new tap interface and appending it to the existing bridge #Usage: tapup [ UID_of_interface_owner ] #(c) Evgeniy Shumilov (corpse@permlug.org) if [ -n "$1" ]; then if [ -n "$2" ]; then iface=$( vde_tunctl -b -u $2 ) else iface=$( vde_tunctl -b ) fi chown root:qemu /dev/net/tun /sbin/ifconfig $iface 0.0.0.0 promisc up brctl addif $1 $iface echo $iface sleep 2 fi
Скрипт вызывается с двумя параметрами, первый из которых — имя интерфейса нашего моста, в нашем случае, это br0, а второй — имя пользователя, который будет владельцем созданного интерфейса и сможет впоследствии с ним работать. Например вызов /usr/sbin/tapup br0 user создаст tap интерфейс tap0, владельцем которого будет user и привяжет его к мосту br0. При повторном вызове будет создан интерфейс с именем tap1, при следующем — tap2 и т.д.. Первый параметр является обязательным, а второй можно опустить. При этом владельцем интерфейса будет root. C испоьзованием этого скрипта можно будет привязывать tap интерфейсы к различным мостам, что довольно удобно, если наша машина имеет несколько сетевых карт или несколько vlan интерфейсов, естесственно, для этой возможности каждый из них должен входить в состав какого-нибудь моста. При успешном выполнении скрипт выдаёт имя созданного интерфейса, нам это будет нужно.
Движемся далее. Создадим скрипт для удаления существующего интерфейса.
vim /usr/sbin/tapdown
#!/bin/sh #Script to negate tap interface #Usage: tapdown if [ -n "$1" ]; then vde_tunctl -d $1 fi
Здесь всё просто. tap интерфейс удаляется по имени, имя — это единственный и обязательный параметр. Не забудьте изменить vde_tunctl на tunctl, если он называется так в Вашей системе.
Теперь создадим группу, которая будет иметь право работать с qemu.
addgroup qemu
Перейдём в папку /usr/sbin и изменим владельца и права на наши скрипты:
cd /usr/sbin/ chown root:qemu tapup tapdown chmod 750 tapup tapdown chmod +s tapup tapdown
Проверяем, что получилось
ll tap* -rwxr-x--- 1 root qemu 125 2009-01-01 16:00 tapdown -rwxr-x--- 1 root qemu 403 2009-01-01 15:45 tapup
Редактируем файл /etc/sudoers и добавляем в него следующие строки:
%qemu ALL=NOPASSWD:/usr/sbin/tapup * %qemu ALL=NOPASSWD:/usr/sbin/tapdown *
Теперь добавляем пользователя, которому нужно будет работать с виртуальными машинами в группу qemu:
adduser user qemu
Теперь, если Вы внесли изменения в /etc/network/interfaces, необходимо перезапустить службу
/etc/init.d/networking restart
Проверяем, что получилось:
ifconfig br0 Link encap:Ethernet HWaddr 00:11:22:33:44:55 inet addr:192.168.1.8 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::21b:fcff:fe8c:a2a6/64 Диапазон:Ссылка ВВЕРХ BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:134759 errors:0 dropped:0 overruns:0 frame:0 TX packets:72278 errors:0 dropped:0 overruns:0 carrier:0 коллизии:0 txqueuelen:0 RX bytes:174331133 (174.3 MB) TX bytes:6743605 (6.7 MB) eth0 Link encap:Ethernet HWaddr 00:11:22:33:44:55 inet6 addr: fe80::21b:fcff:fe8c:a2a6/64 Диапазон:Ссылка ВВЕРХ BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:134763 errors:0 dropped:0 overruns:0 frame:0 TX packets:72284 errors:0 dropped:0 overruns:0 carrier:0 коллизии:0 txqueuelen:1000 RX bytes:176221131 (176.2 MB) TX bytes:7036251 (7.0 MB) Прервано:252 Base address:0x2000 lo Link encap:Локальная петля (Loopback) inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Диапазон:Узел ВВЕРХ LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:37 errors:0 dropped:0 overruns:0 frame:0 TX packets:37 errors:0 dropped:0 overruns:0 carrier:0 коллизии:0 txqueuelen:0 RX bytes:2876 (2.8 KB) TX bytes:2876 (2.8 KB)
Затем входим под логином пользователя user, желательно это сделать не в иксах, а в одной из консолей, которые доступны по сочетанию клавиш Ctrl+Alt+F1 — Ctrl+Alt+F6 и проверяем, как работают наши скрипты:
sudo /usr/sbin/tapup br0 user tap0 sudo /usr/sbin/tapdown tap0 Set 'tap0' nonpersistent
Всё замечательно. Пользователи, входящие в группу qemu ограничены в правах для работы с tunctl (vde_tunctl) и brctl напрямую, но имеют возможность работать с мостами и tap интерфейсами в той мере, в которой это необходимо для вывода в сеть виртуальных машин.
Теперь нам нужно ещё два скрипта. qemu, во всяком случае тот, что находится в репозитории ubuntu 8.10 при старте сети с поддеркой tap интерфейса выполняет скрипт /etc/qemu-ifup, без которого виртуальная машина просто не запустится. Поэтому на его место мы выложим заглушку — скрипт, который ничего не делает.
echo "#!/bin/sh" > /etc/qemu-ifup
При завершении работы тоже должен исполняться скрипт — /etc/qemu-ifdown, но при его отсутствии в поток ошибок, который при старте скрипта запуска не из консоли Вы просто не увидите, может выдаваться ошибка. Думаю, это не существенно.
Теперь всё готово. Пишем последний скрипт, который будет запускать нашу виртуальную машину.
#!/bin/bash IFACE=$(sudo /usr/sbin/tapup br0 user ) qemuctl -m 256 -net nic -net tap,ifname=$IFACE -hda disk.dsk sudo /usr/sbin/tapdown $IFACE
Теперь если на стороне виртуальной машины при настройке сети указать ip адрес из того же диапазона, что и на хост-машине, то они смогут друг-друга видеть.
Примечание: так как по умолчанию qemu эмулирует хоть и довольно распространённую в своё время, но уже довольно старую сетевую карту Realtek на базе чипа rtl8029, которую Windows 2003 уже не знает и драйвера на которую для этой операционной системы я так и не смог поставить, как ни бился, то для корректной работы с сетью стоит указывать другой тип сетевого адаптера. Например, rtl8139. Тогда строка запуска будет выглядеть следующим образом:
qemuctl -m 256 -net nic,model=rtl8139 -net tap,ifname=$IFACE -hda disk.dsk
Evgeniy Shumilov — evgeniy.shumilov@gmail.com
Generated with bashblog, a single bash script to easily create blogs like this one
Виртуальная лаборатория для подготовки к сертификации Cisco на базе Linux
Многие при подготовке к сдаче экзаменов Cisco или просто изучения сетей для практических занятий предпочитают собрать и использовать лабораторию из реального железа.
В таком случае одним из выходов является покупка подержанного цисковского железа на Ebay, но это вам обойдется не в одну сотню долларов.
Другие довольствуются использованием симулятора сети — Cisco Packet Tracer. Для подготовки к CCNA я использовал именно его. Он прост в использовании, удобен, не требует сильного железа и идеально подходит для начинающих. Но из-за ограниченности в функциях для более серьезного изучения он непригоден.
Если же вы не хотите тратить свои кровные $$ и получить устройства с реальными IOS-ами, то нужно смотреть в сторону использования эмулятора сети GNS3 на базе Dynamips. Введение в его использование уже есть на Хабре.
Я же расскажу как его можно соединить с хостовой ОС Linux (на котором он запущен) и серверами в VirtualBox-е. Это значительно расширяет наши возможности по созданию сложных топологий с использованием роутеров Cisco, серверов с различными сервисами в VirtualBox и выходом в Интернет через хостовую ОС Linux.
Описание топологии
В данном примере я использовал сеть из трех соединенных между собой роутеров R1, R2 и R3, модели роутеров — Cisco 2651XM. R1 через облако C1 подсоединен к родному хосту Gentoo Linux (на котором запущен GNS3). Пусть его имя будет gbox. Через этот хост проводится синхронизация времени по ntp, закачка на роутеры дополнительных файлов по tftp и доступ в Интернет. Через облако С2 сеть подключена к виртуальной машине в VirtualBox. В данном случае это Debian с установленным FreeRADIUS для аутентификации и авторизации на роутерах и Syslog сервером для логов. Еще очень хорошо можно тестировать ACL-ы и настройки фаерволлов сканируя nmap-ом Debian из хостового Linux и наоборот. К слову, пакеты Debian-a прекрасно устанавливаются из репозитариев в Интернете через всю эту цепочку.
Настройка Linux-а с GNS3
Для того, чтобы это все это сельское хозяйство заработало, нам необходимо произвести следующие действия. Я использую Gentoo Linux, в котором командой для установки пакетов является emerge. У пользователей других дистрибутивов названия пакетов должны быть такие же.
Устанавливаем утилиту tunctl для создания и управления TUN/TAP виртуальными сетевыми интерфейсами:
gbox$ sudo emerge usermode-utilities
Устанавливаем утилиту brctl для создания и настройки сетевых мостов:
gbox$ sudo emerge bridge-utils
Создаем и конфигурируем виртуальные сетевые интерфейсы:
gbox$ sudo tunctl -t tap0 -u username
gbox$ sudo tunctl -t tap1 -u username
gbox$ sudo ifconfig tap0 192.168.1.3 netmask 255.255.255.0 up
tap0 — для связи с Linux-ом, на котором и запущен GNS3.
tap1 — для связи через мост с гостевыми машинами VirtualBox-а.
Привязываем их к облаку:
Связь с VirtualBox-ом осуществляется через мост br0, который состоит из виртуального Host-only интерфейса vboxnet0 и уже созданного tap1.
gbox$ sudo ifconfig tap1 0.0.0.0
gbox$ sudo ifconfig vboxnet0 0.0.0.0
gbox$ sudo brctl addbr br0
gbox$ sudo brctl addif br0 tap1
gbox$ sudo brctl addif br0 vboxnet0
gbox$ sudo ifconfig br0 192.168.3.4 netmask 255.255.255.0 up
Для связи всего этого хозяйства c хостовым Linux-ом на нем необходимо прописать маршрутизацию в используемые подсети:
gbox$ sudo route add -net 10.1.1.0/24 gw 192.168.1.1
gbox$ sudo route add -net 10.2.2.0/24 gw 192.168.1.1
gbox$ sudo route add -net 192.168.3.0/24 gw 192.168.1.1
Настройка роутеров
На всех роутерах тоже нужно прописать роутинг на подсети, ну или использовать протоколы динамической маршрутизации. Я использовал проприетарный цисковский протокол динамической маршрутизации EIGRP. Вот так выглядит настройка.
R1# conf t
R1(config)# router eigrp 1
R1(config-router)# passive-interface FastEthernet0/0
R1(config-router)# network 10.1.1.0 0.0.0.3
R1(config-router)# network 192.168.1.0
R1(config-router)# no auto-summary
R1(config-router)# exit
R1(config)# ip route 0.0.0.0 0.0.0.0 FastEthernet0/0
R2# conf t
R2(config)# router eigrp 1
R2(config-router)# network 10.1.1.0 0.0.0.3
R2(config-router)# network 10.2.2.0 0.0.0.3
R2(config-router)# no auto-summary
R2(config-router)# exit
R2(config)# ip route 0.0.0.0 0.0.0.0 Serial0/0
R3# conf t
R3(config)# router eigrp 1
R3(config-router)# passive-interface FastEthernet0/0
R3(config-router)# network 10.2.2.0 0.0.0.3
R3(config-router)# network 192.168.3.0
R3(config-router)# no auto-summary
R3(config-router)# exit
R3(config)# ip route 0.0.0.0 0.0.0.0 Serial0/0
Настройка Debian в VirtualBox
На Debian-е устанавливается сетевой адрес и шлюз по умолчанию:
debianbox$ ifconfig eth0 192.168.3.3 netmask 255.255.255.0 up
debianbox$ route add default gw 192.168.3.1
Финал
Вроде бы ничего не забыл. Теперь все должно прекрасно работать и связываться друг с другом. На базе данного примера можно строить сетевые топологии еще больше и сложнее. GNS3 позволяет эмулировать ASA, PIX, IPS, JunOS; простые Ethernet, ATM и Frame Relay комутаторы; позволяет перехватывать пакеты с помощью Wireshark. С помощью указанного ПО без лишних затрат можно подготовиться хоть к CCIE, можно изучать сетевые технологии в реальных условиях, обкатывать конфиги перед использованием в продакшн и много чего еще. Данную конфигурацию я использовал для самостоятельной подготовки к CCNA Security, который был успешно сдан. Требования к железу гуманные, к примеру, рассмотренная топология прекрасно работает на моем ноуте с Core2Duo и 2GB памяти.
Бонус
Для того, чтобы работал Интернет через хостовый Linux (wlan0 — внешний интерфейс).
echo 1 > /proc/sys/net/ipv4/ip_forward
gbox$ sudo /sbin/iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
gbox$ sudo /sbin/iptables -t nat -A POSTROUTING -o wlan0 -j LOG
gbox$ sudo /sbin/iptables -A FORWARD -i wlan0 -o tap0 -m state —state RELATED,ESTABLISHED -j ACCEPT
gbox$ sudo /sbin/iptables -A FORWARD -i tap0 -o wlan0 -j ACCEPT
И еще, в процессе экспериментов было выяснено, что startup-config в маршрутизаторах Cisco 3745 не сохраняется. Это известная проблема, так что будьте осторожны.
Сетевая Академия Cisco проводит авторизированные тренинги, практикумы Cisco, компьютерные курсы Cisco Киев (курсы ИТ Киев), ИТ тренинги — курсы Cisco (Cisco курсы), занимается подготовкой специалистов для реализации высокоинтеллектуальных проектов в области инфокоммуникационных технологий. У нас вы можете пройти курсы Cisco Москва, курсы Cisco СПб (Санкт-Петербург), курсы Linux, курсы Linux Киев, курсы Linux Москва, Linux курсы СПб.
Tunctl что это такое
Нам, мышёвым гуевозилам с libvirt + virt-manager, этого не помять.
> Потом делаем detach (^D) и закрываем окно терминала.
v-m из пакета или самосборный? libvirt? qemu-kvm.
У меня из пакета (Debian 5.0 и на сервере, и на клиенте, пакеты — бэкпорты) создаются именно tap интерфейсы, добавляются в мост с физ.интерфейсом, смотрящим в локалку. Типа, «сами». В пакете, насколько я понимаю, в дистрибутивном пакете это «подпёрто» скриптами (kvm-if{up,down}), которых при самосборе может-типа и не быть.
# dpkg -S qemu-ifup
qemu: /etc/qemu-ifup
# dpkg -S kvm/kvm-if
qemu-kvm: /etc/kvm/kvm-ifdown
qemu-kvm: /etc/kvm/kvm-ifup
# dpkg -l libvirt-bin qemu-kvm
[. ]
||/ Имя Версия Описание
+++-========================-========================-================================================================
ii libvirt-bin 0.8.3-5+squeeze2~abm0 the programs for the libvirt library
ii qemu-kvm 0.12.5+dfsg-5+squeeze4~b Full virtualization on x86 hardware
# _
Блог радиста
Что есть: Linux Slackware 12, QEMU 0.9.1, live-cd с Линуксом (я взял Gentoo install-x86-minimal-2007.0 — загружается быстро, X-ов нет, links имеется (он мне понадобился для тестирования)), реальный (физически существующий) интерфейс с подключением к Интернет (у меня сетевая карта eth0, подключенная к Спарку).
Настрока ядра реальной системы
Нам нужны следующие опции:
Networking Options -> Network packet filtering framework — поддержка iptables (конкретно — ветка IP: Netfilter configuration — Netfilter для IPv4, обратите внимание на поддержку NAT)
Device Drivers->Network device support->Universal TUN/TAP device driver — эмуляция сетевых интерфейсов (отметьте как M).
После компиляции мы получим несколько модулей (если, конечно, все предлагаемые опции мы отмечали как M). Модули для iptables подгружаются самой iptables. Модуль для TUN/TAP называется tun, его подгружать мы будем сами.
Установка UML Utilites (User-mode Linux Utilites) и Iptables
UML Utilites предоставляет программку под названием «tunctl», которая, собственно, и создает виртуальный сетевой интерфейс.
Проверьте, есть ли эта программка у вас («tunctl BLAH BLAH BLAH» выведет краткую справку). Если tunctl у вас не наблюдается — прошу на сайт проекта. Загрузить исходники можно отсюда (нас интересует подкатегория «tools»). (сайт у UML . довольно not user-friendly!)
Iptables — суть есть firewall. Для тех, кто не в танке — прост как дифференциальное уравнение. Страница программы. Я использую iptables v1.3.8.
$real_ip — ip адрес нашего реального интерфейса (в моем случае — eth0). Это адрес реальной системы во внешней сети.
$host_ip — ip адрес виртуального интерфейса в реальной системе.
$virt_ip — ip адрес виртуального интерфейса в виртуальной системе (загруженной на сэмулированном с помощью QEMU компьютере).
$broadcast — широковещательный адрес для сети, содержащей $host_ip и $virt_ip.
Между виртуальным и реальным интерфейсом в реальной системе необходимо будет настроить переброску (форвадинг) пакетов.
Создаем виртуальный интерфейс:
ic=`su -c ‘modprobe tun && tunctl -b -u $NAME && chmod 666 /dev/net/tun’`
Где $NAME — имя пользователя, который выполнил данную команду.
В ic будет записано имя созданного интерфейса. Скорее всего это будет «tap0».
(Кстати, вам необходимо знать пароль к учетной записи root’а 😉 )
Поднимаем виртуальный интерфейс в реальной системе:
su -c «ifconfig $ic up $host_ip netmask 255.255.255.0 broadcast $broadcast && echo 1 > /proc/sys/net/ipv4/ip_forward»
Файл /proc/sys/net/ipv4/ip_forward содержит одну единственную цифру. 0 — переброска пакетов между интерфейсами запрещена, 1 — разрешена.
su -c «iptables -t nat -L && iptables -t nat -A POSTROUTING -s $virt_ip -j MASQUERADE»
Устанавливаем маскарадинг для всех пакетов, пришедших с $virt_ip (с виртуальной системы). Команда «iptables -t nat -L» выводит текущее состояние таблицы nat.
mac=$(echo -n EE:AE:B0:BF; for i in `seq 1 2`; do echo -n `echo «:$RANDOM$RANDOM» | cut -n -c -3`; done)
qemu $OPTIONS -net nic,vlan=0,macaddr=$mac,model=rtl8139 -net tap,vlan=0,ifname=$ic,script=no
Первой строчкой мы генерируем mac-адрес для виртуального интерфейса в виртуальной системе. Вторая строчка — непосредственно запуск qemu. Замените $OPTIONS на другие, нужные вам, опции (к примеру, у меня: OPTIONS=’-boot d -cdrom install-x86-minimal-2007.0.iso’ — загрузится с cd-образа Gentoo, воспринимая его как полноценный cd-диск).
Настройка виртуальной системы
Итак, мы загрузились. Теперь необходимо настроить полученную систему. Общая идея: создать сетефой интерфейс, настроить гейт по умолчанию, настроить DNS.
Реализация (для unix-open_source-like системы — будь то Linux или FreeBSD):
host_ip=’192.168.0.2′
virt_ip=’192.168.0.3′
broadcast=’192.168.0.1′
ifconfig eth0 up $virt_ip netmask 255.255.255.0 broadcast $broadcast
route add default gw $host_ip
echo «nameserver $DNS» > /etc/resolv.conf
Где $DNS — адрес вашего DNS сервера (чтобы узнать его, сделайте «cat /etc/resolv.conf» в реальной системе и внимательно посмотрите на строки, начинающиеся с «nameserver» — это именно ваши сервера DNS).
* Разумеется, учитывайте, что данные команды нужно выполнить от имени пользователя root (посмотрите, как вас зовут: «whoami», и если в вашем паспорте не указано «root» — сделайте «sudo su -» — обычно это работает).
Пользуйтесь на здоровья. Обе ваши системы — реальная и виртуальная — имеют выход в сеть. Следующими командами можно проверить корректность работы 😉 :
ping 192.168.0.2
ping www.blogger.com
Уничтожение виртуального интерфейса и очистка таблицы firewall’а NAT
После завершения выполнения QEMU сделайте:
su -c ‘rmmod tun && iptables -t nat —flush’
При удалении модуля tun уничтожаться все виртуальные интерфейсы, а действие «flush» очистит таблицу firewall’а NAT.
Замечу, что в некоторых руководствах рекомендуют перед всем этим выполнить (на тот случай, если модуль tun выгружать не нужно или выгрузить не возможно):
su -c «tunctl -d $i &> /dev/null»
Примечание (к вопросу о DNS — пункт 8)
echo «nameserver $DNS» > /etc/resolv.conf
Довольно неудобна в том случае, если вы используете DHCP для определения $host_ip. К примеру, следуя unix-way, я написал скрипт для поднятия сетевого интерфейса на виртуальном компьютере. Скрипт записан на образ флоппи-дискеты, а образ подключается непосредственно к виртуальной машине. Так вот. Куда удобнее (а для моего скрипта — единственный выход) делать:
echo «nameserver $host_ip» > /etc/resolv.conf
Запросы DNS будут, в таком случае, следовать в реальную систему. В реальной системе можно, конечно, поднять BIND (для домашней сети, кстати, очень удобно — вы сможете иметь доступ ко всем компьютерам с помощью символьных имен), но можно воспользоваться средствами iptables. Просто сделайте в пункте 6 еще и:
iptables -t nat -A PREROUTING -p udp —dport 53 -j DNAT —to-destination $DNS
Т.е. пакеты, пришедшие на порт 53 в формате udp (DNS-запросы), перенаправлять на хост $DNS — являющийся внешним DNS-сервером. Если вы решите написать скрипт для запуска QEMU с поддержкой сети, распарсить /etc/resolv.conf и присвоить DNS ip-адрес одного из серверов DNS не составит труда.
Вся последовательность действий по выводу виртуальной машины в сеть автоматизируется с помощью скрипта. Если вы используете в качестве виртуальной системы unix-like систему — вы сможете автоматизировать настройку сети и в ней — просто напишите скрипт, его поместите на образ флоппи-дискетки — и пользуйтесь!