Firewall-dmz-net

De Xen-BR wiki

Xen-BR 
Firewall Xen

Xenlogo.png




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)



Ferramentas pessoais