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
# _
Может кому пригодиться описание как запустить TUN/TAP
Описание как сделать tun\tap. перерыл весь инет везде только спрашивают и нифига нет ответов. —— если нету tunctl то нужно скачать uml_utilities_20040114.tar gcc -g -Wall -o tunctl tunctl.c strip tunctl sudo install -o root -g root -m 755 tunctl /usr/local/sbin/tunctl
mknod c 10 200 /dev/net/tun cd /dev ./MAKEDEV tap tunctl -t tap0 Теперь tap существует Потом стандартный ifconfig tap. addr. up — testtun.cpp самописная программа для load balance. Потом можно скомпилить gcc testtun.cpp -o testtun и использовать ./testtun tap0 6791 192.168.3.81 192.168.112.2 Здесь tap0 понятно девайс, 6791 — порт на котором ведется обмен данными — должен быть одинаков для обоих сторон ип-адреса — это алиасы удаленного сервера. — заодно вопрос ? кто как делает лоад балансинг ? или вот vrrp чем реализуете обычно ?
anonymous
04.07.04 10:37:23 MSD
Блог радиста
Что есть: 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 систему — вы сможете автоматизировать настройку сети и в ней — просто напишите скрипт, его поместите на образ флоппи-дискетки — и пользуйтесь!
Dmitryz
TUN и TAP — виртуальные сетевые драйверы ядра системы. Они представляют собой программные сетевые устройства, которые отличаются от обычных аппаратных сетевых карт.
TAP эмулирует Ethernet устройство и работает на канальном уровне модели OSI, оперируя кадрами Ethernet.
TUN (сетевой туннель) работает на сетевом уровне модели OSI, оперируя IP пакетами. TAP используется для создания сетевого моста, тогда как TUN для маршрутизации.
Пакет, посылаемый операционной системой через TUN/TAP устройство, обрабатывается программой, которая контролирует это устройство. Сама программа также может отправлять пакеты через TUN/TAP устройство. В таком случае TUN/TAP устройство доставляет (или «внедряет») такой пакет в сетевой стек операционной системы, эмулируя таким образом доставку пакета с внешнего устройства.
apt-get install uml-utilities
с помощью tunctl:
tunctl -t eth0
С помощью ip:
ip tuntap add dev eth0 mode tap Затем:
ifconfig eth0 192.168.8.8 up