quarta-feira, 27 de abril de 2016

Qemu NAT WiFi Interface

O Qemu é definitivamente minha ferramenta favorita para virtualização. Com ele eu consigo debutar mini-distros embarcadas que costumo criar para arm's além de boot's em sdcard's e pendrives.

Resolvi postar aqui como costumo usar o QEMU com NAT em meu notebook.

Estou partindo do príncipio que você ja tenha o qemu instalado em seu Linux. Eu estou usando Arch Linux mas voce pode utlizar estes mesmos paços para outras distribuiçoes de Linux, como fedora, centos, slackware e debian likes.

Costumo usar wifi na maioria dos casos então estou descrevendo aqui como mascarar sua interface wifi para uma interface bridge para o qemu.

1º Criando uma Bridge com uma interface TAP

Para o NAT funcionar devemos habilitar a interface tap para o qemu

Carregando modulo tun/tap
#modprobe tap

Criando interface tap0
#ip tuntap add dev tap0 mode tap user fulano group kvm

Criando a bridge
#brctl addbr br0
#brctl addif br0 tap0

Subindo a bridge
#ip link set dev br0 up
#ip link set dev tap0 up
#ip addr addr 10.10.200.1/27 dev br0

Ok... agora temos a bridge rodando e com um ip que escolhemos definir para funcionar nosso nat, nesse caso o 10.10.10.200.1

2º Habilitando as regras no firewall

Como vamos usar NAT precisamos mascarar o trafego de nossa interface wireless para que nossa br0 tenha acesso a internet através dela.

#echo "1" > /proc/sys/net/ipv4/ip_forward
#iptables -A FORWARD -i br0 -o wlan0 -j ACCEPT
#iptables -t nat -A PREROTING -i wlan0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
#iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Pronto nosso firewall ja esta ok... lembre que iptables roda em tempo de execucao entao pode ser interessande montar um script de firewall.

3º Subindo o QEMU com DHCP

Para facilitar é interessante termos um dhcp rodando na nossa bridge a menos que prefira configurar na mao com endereçoes estaticos...

Subindo dhcp
#dnsmasq --interface=br0 --bind-interfaces --dhcp-range=10.10.200,15,10.10.200,20
Pronto agora só subir o qemu...

Subindo o qemu como usuário comum
#qemu-system-x86-64 -enable-kvm -m 1024 -netdev tap,id=t0,ifname=tap0,script=no,downscript=no -device e1000,netdev=t0,id=nic0 system.img

repare que para subir como usuário comum foi preciso inibir os scripts com o qemu-ifup etc...

All done... Com isso já temos nosso qemu guest rodando com NAT em uma bridge feita para uma interface tap.

Aqui seria o fim se eu nao preferisse facilitar mais as coisas... Bom continue lendo para tornar as coisas ainda mais simples...

O qemu tem um script chamado qemu-ifup que deve ser colocar no diretório /etc com permissão 755.
Este script é basicamente uma sequencia de comandos para subirmos a rede no qemu.

Nos passos acima usamos o bridge-utils e o iproute para setarmos as interfaces, bom resolvi no script fazer tudo somente com o iproute.

1 set -x
2
3 IFACE="br0"
4 ERRO=
5 WAN=`ip route|grep default|awk '{print $5}'`
6 IP=`which iptables`
7 MASQPID="/var/run/qemu-dnsmasq-"$IFACE".pid"
8 DHCP_RANGE="192.168.53.2,192.168.53.11"
9 ADDR="192.168.53.1/27"
10
11 if [ ! -n "$1" ]
12 then
13 echo "Ups... interface argument missing"
14 ERRO=1000
15 exit $ERRO
16 fi
17
18 TAP="$1"
19
20 netup(){
21 #load tun tap kernel module
22 #create a bridge br0 with ip seted on ADDR var. Create a tap interface used with qemu -net tap
23 if ! ip link show $IFACE 2>/dev/null 1>/dev/null
24 then
25 ip link add $IFACE type bridge
26 ip link set $IFACE up
27 fi
28
29 modprobe tun 2>&1 >>/dev/null
30 ip tuntap add dev "$TAP" mode tap
31 ip link set "$TAP" up
32 ip link set "$TAP" master "$IFACE"
33
34 IPBR=`ip addr show dev $IFACE|grep inet|head -1|awk '{print $2}'`
35 if [ ! $IPBR == $ADDR ]
36 then
37 ip addr add dev $IFACE "$ADDR"
38 fi
39 }
40
41 masquerade(){
42 #make a masquerade interface betewen default route local iface and br0
43
44 echo "1" > /proc/sys/net/ipv4/ip_forward
45 $IP -D FORWARD -i $IFACE -o $WAN -j ACCEPT 2>>/dev/null
46 $IP -t nat -D PREROUTING -i $WAN -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>>/dev/null
47 $IP -t nat -D POSTROUTING -o $WAN -j MASQUERADE 2>>/dev/null
48
49 $IP -A FORWARD -i $IFACE -o $WAN -j ACCEPT
50 $IP -t nat -A PREROUTING -i $WAN -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
51 $IP -t nat -A POSTROUTING -o $WAN -j MASQUERADE
52
53 }
54
55 dhcp(){
56 #run dnsmasq dhcp on IFACE with binding and custom pidfile
57 #the example above is the same as runing just with options in long form
58 #dnsmasq --interface=$IFACE --bind-interfaces --pid-file=$MASQPID --dhcp-range=$DHCP_RANGE
59
60 if [ ! -e $MASQPID ]
61 then
62 dnsmasq -i $IFACE -z -x $MASQPID -F $DHCP_RANGE
63 fi
64 }
65
66 netup
67 masquerade
68 dhcp
69 exit $ERRO


Esse script esta também no meu github.

4º Exemplos de inicializaçoes do  Qemu:

Inicialização simples com qemu-ifup
#qemu-system-i386 -enable-kvm -net tap -nic system.img

Para rodar um segundo guest ao mesmo tempo lembre de mudar a interface tap e o macaddress

Inciando um segundo guest simultaneo
#qemu-system-i386 -enable-kvm -netdev tap,id=t1,ifname=tap1 -device e1000,mac=50:20:10:aa:bb:cc system.img

Enjoy.