Firewall-dmz-net
De Xen-BR wiki
Cenário
Vamos considerar o seguinte cenário:
--------------------------------------
| Internet | LAN | DMZ |
--------------------------------------
| | |
eth0 eth1 dummy0
| | |
--------------------------------------
|pciback.hide| Bridge0 | Bridge1 |
--------------------------------------
| | |
Firewall | |
| | | |
| |_________| |
|_________________________|
O firewall será a única VM que estará diretamente na internet. para aumentar o nível de isolamento desta VM, sugiro que o barramento PCI que estará voltada para a internet seja 'escondida' do Dom0 e entregue para a VM firewall. Assim podemos alcancar um isolamento fisico, já que somente a VM firewall poderá se comunicar com o dispositívo PCI.
Além deste dispositivo de rede, a VM firewall terá mais duas interfaces. Ambas interfaces serão virtualizadas pelo Dom0. Então o firewall ficaria com as seguintes intefaces:
Interface da internet - eth0 - usando pciback.hide (a interface física em sí) Interface da LAN - eth1 - Interface virutal ligada à bridge0 que fisicamente é ligada à rede local pela eth1 do Dom0. Interface da DMZ - eth0 - Interface virtual ligada à bridge1 que 'virtualmente' é ligada à rede dos servidores virtuais pela dummy0 do Dom0.
Hardware
Processador: Opteron AMD64 Dual Core Memoria: 2GB Interfaces de rede: 2 10/100Mbit Disco: SCSI 146.8 GB
Passos para instalacão do Dom0
Instale a partir do cd de instalacão do Debian Etch para AMD64 o Sistema Operacional configurando as particões ao seu modo. No meu caso deixei-a assim:
/dev/sda1 - 100MB - /boot - ext3 /dev/sda2 - 10GB - / - ext3 /dev/sda3 - 1GB - swap - Área de troca /dev/sda4 - restante - LVM - LVM
Após instalado e reiniciado o sistema básico, entre com o usuário root e edita o sources.list do apt:
# nano /etc/apt/sources.list
deb http://ftp.debian.org/debian/ etch main contrib non-free
Atualize o apt:
# apt-get update
Precisamos agora instalar um conjunto de pacotes para podermos viabilizar uma estrutura de virtualizacão.
Instale os seguintes pacotes do repositório Etch:
# apt-get -t etch install xen-hypervisor-3.0-amd64 xen-utils-3.0 iproute \ sysfsutils initramfs-tools bridge-utils linux-image-2.6.16-2-xen-vserver-amd64-k8 \ linux-modules-2.6.16-2-xen-vserver-amd64-k8
Precisamos agora criar o initramfs para o Dom0:
# mkinitramfs-kpkg -o /boot/initrd.img-2.6.16-2-xen-vserver-amd64-k8 2.6.16-2-xen-vserver-amd64-k8
Configure o grub considerando que a nova entrada deverá ser adicionada em conformidade com os padrões de configuração do boot loader:
# nano /boot/grub/menu.lst
# Entrada para o kernel xen title Debian GNU/Linux, kernel 2.6.16-2-xen-vserver-amd64-k8 root (hd0,0) kernel /xen-3.0-amd64.gz dom0_mem=128M console=vga pciback.hide=(0000:06:09.0) module /vmlinuz-2.6.16-2-xen-vserver-amd64-k8 root=/dev/sda2 ro max_loop=32 console=tty0 vga=768 module /initrd.img-2.6.16-2-xen-vserver-amd64-k8 boot
Importante!
Na linha do kernel, na flag 'pciback.hide', verifique qual o endereco do barramento da PCI da eth0 e coloque-o no lugar do endereco declarado na variável.
Configuramos agora os scripts para criar as bridges:
cd /etc/xen/
Edite o arquivo de configuração global do Xen:
nano xend-config.sxp
Comente as linha abaixo caso estejam descomentadas:
# (network-script network-dummy) # (network-script network-bridge)
Acrecente a linha abaixo à configuração:
(network-script custom-network-bridge)
Salve o arquivo.
Vá para o diretório de scripts do xen:
# cd /etc/xen/scripts/
Copie o script network-bridge conforme abaixo:
for ((i=1;i<=2;i++)); do cp network-bridge network-bridge-$i; done
O arquivo network-bridge-0 e relativo a bridge0, o network-bridge-1 a bridge 1 e assim por diante.
Edite cada um destes arquivos. Demonstrarei como fazer com o network-bridge-0:
# vi network-bridge-1
Ao editer este arquivo, você encontrara as seguintes linhas que veem por padrão (Linhas Default) em todos os arquivos de configuração das Bridge (network-bridge-1 e network-bridge-2) e será necessário altera-los para os modelos descritos para cada uma das Bridges Seguintes:
(Linhas Default)
vifnum=${vifnum:-0}
bridge=${bridge:-xenbr${vifnum}}
netdev=${netdev:-$(ip route list default scope global| awk '{ print $NF }')}
netdev=${netdev:-eth${vifnum}}
antispoof=${antispoof:-no}
(Alteração para network-bridge-1):
vifnum=1
bridge=${bridge:-xenbr${vifnum}}
# netdev=${netdev:-$(ip route list default scope global| awk '{ print $NF }')}
netdev=eth1
antispoof=${antispoof:-no}
(Alteração para network-bridge-2):
vifnum=2
bridge=${bridge:-xenbr${vifnum}}
# netdev=${netdev:-$(ip route list default scope global| awk '{ print $NF }')}
netdev=dummy0
antispoof=${antispoof:-no}
Feito isso, crie um novo script para multiplas bridges:
# nano /etc/xen/scripts/custom-network-bridge
#!/bin/bash XENDIR="/etc/xen/scripts" $XENDIR/network-bridge-1 "$@" $XENDIR/network-bridge-2 "$@"
Altere as permições do script:
# chmod 755 /etc/xen/scripts/custom-network-bridge
Precisamos agora configurar o comportamento do deamon xendomains quando Dom0 for reiniciado ou desligado. desejamos que, as Maquinas Virtuais também sejam desligadas caso uma das acões ocorra:
# nano /etc/default/xendomains
Comente a linha abaixo no arquivo de configuracão:
XENDOMAINS_SAVE=/var/lib/xen/save
Reinicie o servidor para validar todas as alterações:
# reboot
Quando o servidor estiver ligado novamente, verifique se o servico xen já esta disponível:
# xm list
Este comando deverá retornar a seuinte saida:
Name ID Mem(MiB) VCPUs State Time(s) Domain-0 0 123 1 r----- 28.6
Caso abaixo do campo Name seja mostrado Domain-0 o servidor está configurado.
Criando um esqueleto como base para as DomUs
Instale o pacote debootstrap para podermos criar um esqueleto Debian AMD64:
# apt-get install debootstrap
Escolha um diretório para criacão do esquelelo, no meu caso escolhi /usr/src/debian-amd64:
# mkdir /usr/src/debian-amd64
Inicie a criacão do esqueleto com o comando a baixo:
# debootstrap etch /usr/src/debian-amd64 http://ftp.debian.org/debian
Esse processo deverá levar alguns minutos. Após p termino, copie os modulos do kernel para o diretório:
# cp -rf /lib/modules/2.6.16-2-xen-vserver-amd64-k8/ /usr/src/debian-amd64/lib/modules/
Agora configure o esqueleto da imagem:
# chroot /usr/src/debian-amd64 su -
Execute depmod para criacão do modules.dep:
# depmod -a
Edite o arquivo /etc/fstab deixando-o da seguinte maneira:
# nano /etc/fstab
proc /proc proc defaults 0 0 /dev/sda1 / ext3 defaults,errors=remount-ro 0 1 /dev/sda2 none swap sw 0 0
Salve o arquivo e monte a particão /proc e /sys:
# mount /proc # mount /sys
Atualize o apt:
# apt-get update
Instale os seguintes pacotes:
# apt-get install udev ssh less ethtool
Edite o arquivo /etc/inittab e comente as seguintes linhas:
1:2345:respawn:/sbin/getty 38400 tty1 # 2:23:respawn:/sbin/getty 38400 tty2 # 3:23:respawn:/sbin/getty 38400 tty3 # 4:23:respawn:/sbin/getty 38400 tty4 # 5:23:respawn:/sbin/getty 38400 tty5 # 6:23:respawn:/sbin/getty 38400 tty6
Desmonte o /proc e /sys:
# umount /proc # umount /sys
Pare o servico udev:
# /etc/init.d/udev stop
Saia do chroot:
# exit
O esqueleto da imagem está configurado e pronto para replicacão.
Criando um DomU para ser o firewall
Crie um LV (Volume Lógico) para o VBD (Virtual Block Device) para a Maquina Virtual Firewall (chamaremos de vm-fw) seguindo a seguinte sintaxe:
Para o firewall, estou considerando o VBD em cima do LVM de 1,5GB para o raiz e 128MB de RAM: disk-vm-fw - 1500MB swap-vm-fw - 256MB
Usando o lvcreate para a criacão dos LV's:
# pvcreate -L15G -n disk-vm-fw xendisks # pvcreate -L256M -n swap-vm-fw xendisks
Formate os LV's:
# mkfs.ext3 /dev/xendisks/disk-vm-fw # mkswap /dev/xendisks/swap-vm-fw
Monte o LV /dev/cb/disk-vm-fw em /mnt:
# mount /dev/xendisks/disk-vm-fw /mnt
Copie os arquivos do esqueleto preservando as suas propriedades dos arquivos:
# cp -a /usr/src/debian-amd64/* /mnt
Ao termino da cópia inicie a configuracão do firewall com chroot:
# chroot /mnt su -
Monte o /proc e o /sys:
# mount /proc
Altere a senha do root:
# passwd Enter new UNIX password: ************* Retype new UNIX password: *************
Edite o arquivo /etc/hostname:
# nano /etc/hostname
Configure o hostname correto para a VM:
vm-fw
Vamos considerar que teremos 3 interfaces de rede nesta VM. Considere o seguinte:
eth0 - link com a internet. eth1 - LAN interna. eth2 - DMZ de servidores Xen.
Configure a rede:
# nano /etc/network/interfaces
auto lo eth0 eth1 eth2
iface lo inet loopback
iface eth0 inet static
address 200.201.1.50
netmask 255.255.255.0
gateway 200.201.1.1
iface eth1 inet static
address 172.16.0.1
netmask 255.255.255.0
iface eth2 inet static
address 10.5.0.1
netmask 255.255.0.0
Saia do chroot:
# exit
Desmonte o LV:
# umount /mnt
Crie o arquivo de configuracão para o firewall:
# nano /etc/xen/auto/vm-fw.conf
Este conteúdo deverá estar no arquivo que estamos editando:
kernel = '/boot/vmlinuz-2.6.16-2-xen-vserver-amd64-k8'
ramdisk = '/boot/initrd.img-2.6.16-2-xen-vserver-amd64-k8-domU'
memory = 128
name = "vm-fw"
vcpus = "2"
pci = [ '06:09.0' ]
vif = [ 'mac=00:16:3E:56:37:01, bridge=xenbr0' \
mac=00:16:3E:56:37:02, bridge=xenbr1 \
mac=00:16:3E:56:37:02, bridge=xenbr2 ]
disk = [ 'phy:cb/disk-vm-fw,sda1,w','phy:cb/swap-vm-fw,sda2,w' ]
root = "/dev/sda1 ro"
on_reboot = 'restart'
Inicie a nova maquina virtual:
# xm create /etc/xen/auto/vm-fw.conf -c
Entre com o usuário root para verificar se tudo ocorreu bem:
vm-fw login: root Password: ****************** vm-fw:~# _
Maquina virtual do Firewall criada com sucesso.
Configuração do firewall (a ser documentado)