Destinado a todos os que deseja utilizar alguma espécie de software Open Source

quarta-feira, 24 de setembro de 2008

Virtualização - Xen ou não

Introdução
Virtualização é um recurso que existe há muito tempo e seu principal uso era nos mainframes. Mas por que a virtualização está em alta agora?

Com a evolução da arquitetura x86 usada nos computadores domésticos, com o poder de processamento cada vez melhor e mais barato, podemos “rodar “ mais de um sistema operacional ao mesmo tempo, independentemente da plataforma. Isso é proporcionado por processadores mult-core e hardwere mais rápidos com o custo baixo, que não eram realidade antigamente.

O que muita gente não sabe é que existem vários tipos de virtualização. A mais conhecida é a Modell Hosted Virtualization, que nada mais é do que uma virtualização completa executada a partir de um sistema hospedeiro (Windows, Linux ou Mac OS). O software mais conhecido para este tipo de virtualização é o VMware (www.vmware.com), que emula uma ISA (Instruction Ser Architecture) no sistema operacional hospedeiro onde pode ser aberto um novo host (máquina virtual) a partir do mesmo.

O outro modo de virtualização é o modo clássico denominado de hypervisor, que obteve uma grande preferência pois precisa de hardware específico para rodar mas máquinas virtuais (são gerenciadas pelo hardware). Com o hypervisor podemos ter dois tipos de virtualização. Elas são:

Paravirtualização: os hóspedes sabem perfeitamente que rodam em um ambiente virtual. Para isso o kernel do hóspede precisa ser modificado, sendo perfeito para sistemas operacionais que possuem seu código aberto, como o Linux.

Virtualização completa: este modo de virtualização tem um desempenho superior, pois é feita por uma interface que controla diretamente o hardware e não por um sistema hospedeiro.
Xen

O Xen foi desenvolvido por um grupo de pesquisadores da Universidade de Cambridge, como parte do projeto XenoServers. Este projeto tem como objetivo criar uma “infra-estrutura global para a computação distribuída”. O Xen possui esta função chave.

O modo de virtualização utilizada neste sistema é um pouco diferente daquele usado pelos softwares VMware ou VirtualBox que utilizam o conceito de hóspede e hospedeiro.

O Xen utiliza um outro conceito mais aprimorado que permite um ganho de desempenho. O Xen carrega um componente chamado de hypervisor antes de carregar o sistema operacional, onde o hypervisor é responsável por controlar os recursos de comunicação, memória e processamento das maquinas virtuais; é como se estivesse executando direto no hardware. As máquinas virtuais no Xen são chamadas de domínios ou simplesmente dom, por isso, precisam ter um sistema operacional inicial invocado pelo hypervisor que é chamado de domínio0 ou simplesmente dom0.

O hypervisor não possui drivers e controladores de hardware por isso precisa do dom0 para esta comunicação. O dom0 é o responsável por controlar as demais máquinas que se chamam Domínio Uniprivileged ou domU; todas as máquinas virtuais são gerenciadas pelo dom0.

Para que se tenha uma virtualização completa com o Xen é preciso que o processador suporte o recurso para isso. Por exemplo, os processadores Vanderpool da Intel e o Pacifica da AMD, para que consigam ter uma virtualização, um Pentium 4 com 512 mb de RAM já é o suficiente, porém só pode ser uma paravirtualização.


Instalando o Xen no Centos

Para instalar o Xen no Centos é preciso ter os pacotes:

Citando:

Kernel-xen
Xen
Xen-libs


O ideal é que seu sistema possua o sistema de arquivos todo montado sobre LVM para que, em caso de algum problema de espaço em disco, o mesmo possa ser mudado sem precisar fazer "gambiarras" ou reinstalar todo o sistema.

Após a instalação desses componentes é preciso dar um boot na máquina e entrar no Linux utilizando o kernel-Xen. Muitas implementações já optam por instalar o Xen durante a instalação do sistema operacional.
Temos que iniciar o serviço xend para iniciar a criação da máquina virtual.

Citando:

#service xend start


Abra o virtual machine manage em aplicações, ferramentas do sistema, virtual machine manager.

Photobucket

Clique em novo

Photobucket

Avance, digite o nome da máquina virtual e avance novamente.

Agora você poderá escolher qual o modo de virtualização; se o seu processador não suportar a virtualização completa, esta opção não estará disponível.

Photobucket

Após avançar ele vai pedir um kernel modificado para a paravirtualização.

Clique em virtualização completa e clique em avançar.


Agora você irá escolher a origem da instalação do sistema operacional que pode ser por uma imagem ISO ou pela unidade de CD-ROM. Também é possível escolher qual o tipo de sistema operacional como no VMware (Windows, Linux, Unix ou genérico). Após avançar você poderá definir o tamanho do disco rígido e se deseja alocar o espaço agora ou se crescerá à medida que forem sendo gravados dados na máquina virtual.

Após avançar irá escolher o dispositivo da rede que pode ser uma rede virtual interna entre os domínios ou se a máquina virtualizada estará na rede física como no modo bridge do VMware e clique em avançar. Agora iremos escolher a memória RAM disponível para este novo domínio que está sendo criado e podemos avançar para concluir.

Agora a instalação do novo sistema operacional em uma máquina totalmente virtualizada pode ocorrer de forma muito parecida como o que fazemos com o VMware.

No modo de para virtualização não é tão simples não é nenhum bicho de sete cabeças. Para isso precisando ter uma imagem de um kernel-xen no /boot do dom0

Conclusão

Após esta implementação conclui que não é tão viável utilizar o Xen quando não se tem o hardware adequado pois se tem um exigência maior. Sendo assim é melhor partir pra soluções infantis como a da Vmware, mas se o seu hardware suportar, nem pense duas vezes, pois a escolha mais correta é o Xen para sistemas profissionais.

Noções de DNS

Servidor DNS (BIND)

O DNS (Domain Name System) é o sistema responsável pela resolução de nomes em endereços IP, deixando a navegação na internet mais simples. Quando é digitado um endereço web em um browser ou um endereço ftp em um cliente ftp ou em qualquer outra aplicação, esta aplicação pergunta ao DNS quem é este endereço. O papel do DNS é resolver este nome em um endereço IP e retornar para quem o perguntou. Deste modo torna-se possível a navegação através de nomes.

DOMÍNIOS

O DNS é uma estrutura hierárquica onde sua origem se tem a partir de um ponto (.) e a partir daí temos os domínios e os subdomínios.

Todo host tem um nome e seu nome completo é chamdo FQDN (Full Qualified Domain Name), que é composto de duas partes, a parte que identifica o host dentro do domínio e a parte que identifica o domínio, por exemplo, em www.centosbr.org, o www significa o nome do host dentro do domínio centosbr.org, por isso que quando colocamos no browser apenas o centosbr.org a página é exibida normalmente. Nestes casos, a busca do DNS será realizada pelo domínio e não pelo host . A parte .org é chamado de TLD (Top Level Domain) e informa o tipo de domínio que se esta acessando. Os TLDs mais comuns são:

.com - Comercial
.edu - Educacional
.org - Organizacional
.gov - Governamental
.mil - Militar
.arts - Cultural

Os TDLs também identificam o país de origem dos hosts.

.br - Brasil
.jp - Japão
.nz - Nova Zelândia
.ca - Canadá

O DNS dentro da internet faz parte de uma complexa hierarquia dentro de um banco de dados, onde cada servidor DNS tem autorização de responder as requisições sobre os nomes de domínio de uma quantidade limitada de hosts.

DNS SERVER

O DNS pode ser conceitualmente dividido em três partes:

Espaço de nome de domínio
É a listagem das informações de todos os hosts da rede.

Resolvers
São programas ou rotinas de bibliotecas que extraem as informações solicitadas aos servidores DNS.

Servidores DNS
São os programas capazes de resolver uma requisição de nomes. Eles mantém os dados localizados nos espaços de nome de domínio.

Existem alguns servidores DNS espalhados pelo mundo, chamados de rootservers da internic que são os grandes servidores DNS dividindo as tarefas de resolução de nomes. Estes servidores são dispostos hierarquicamente, tendo como pai o servidor raiz. O papel destes servidores é interligar todos os servidores DNS do mundo.

O desenho abaixo, mostra como fica a disposição destes servidores, se uma solicitação é enviada para um domínio .com.br e este servidor não souber resolver este nome, a requisição será enviada para o servidor raiz que encaminha para o o servidor autorizado a responder esta requisição.

Photo Sharing and Video Hosting at Photobucket

Com esta divisão fica mais fácil gerenciar os domínios artavés de entidades responsáveis, como é o Comitê Gestor da Internet do Brasil que é responsável por controlar a terminação .br.

Então, para uma resolução de nome de um domínio .com.br, o host envia uma requisição para o servidor raiz que o encaminha para o servidor que controla a TLD .com que novamente redireciona para o servidor responsável pela terminação .br o qual tem autorização para responder com o endereço IP referente ao nome, porém como a estrutura é hierárquica o .br nada sabe sobre o .com.

Para melhorar a performance de um serviço DNS configurado em um servidor local, é recomendável a distribuição deste serviço em outros servidores, nós podemos ter servidores do tipo:

Primary Master Server
Servidor primário do domínio, Possui autorização para resolução de nomes dentro de todo o domínio.

Secondary Master Server
Servidor secundário do domínio. Pode ser chamado de backup do servidor primário. Também possui autorização de resolução dentro do domínio, porém o servidor secundário faz downloads da lista de registros do servidor primário, em vez de guardar localmente.

Slave Server
Servidor escravo. Este servidor encaminho as requisições para uma lista conhecida de servidores de encaminhamento, porém não guarda nenhuma informação.

Forwarder Server
Servidores de encaminhamento. Encaminha requisições para servidores remotos

Caching Server
Respondem às requisições através do registro de cache que são coletados das requisições anteriores.

O servidor primário é o servidor que tem autorização para resolução de nomes dentro do domínio, com isso, todas as requisições dos hosts do domínio passarão por este servidor, por este motivo, quando o DNS server realiza uma pesquisa pela primeira vez, ele guarda a resposta em um cache interno, para que quando uma segunda requisição sobre este mesmo nome seja feita, o servidor possa responder de forma mais rápida, e sem a necessidade de realizar uma nova consulta, diminuindo o tráfego e consequentemente aumentando a performance.

Porém, se um servidor guarda uma informação por um longo período, esta informação ficará desatualizada e obsoleta, diminuindo a credibilidade do serviço. Para resolver esta questão foi implementado no DNS server um campo chamado TTL (Time to Live) que informa por quanto tempo uma informação ficará guardada no cache.

No LINUX, o servidor DNS que utilizaremos é o BIND (Berkeley Internet Name Domain) que oferece soluções tanto de DNS server quanto de DNS resolver library. Vamos mostrar como instalar e configurar o BIND 9.x.

INSTALAÇÃO

A instalação do BIND pode ser feita por

Citando:

#yum install bind


CONFIGURAÇÃO

Para iniciar, vamos configurar o resolver, esta configuração é necessária mesmo que não ser pretenda executar um servidor DNS. Para configurar o resolver, vamos primeiro editar o arquivo /etc/host.conf

Citando:

#vi /etc/host.conf


Neste arquivo podemos informar ao resolver, quais serviços usar e em que ordem. Segue algumas opções do arquivo host.conf.

Order
Especifica a ordem em que os mecanismos de resolução de nomes serão tentados. Estes mecanismos podem ser:
Ex.: order hosts,bind

hosts
Tenta resolver o nome localmente através do arquivo /etc/hosts

bind
Solicita a resolução de nomes a um servidor BIND

nis
Tenta a resolução de nomes através do protocolo NIS (Network Information Service).

Alert
Alerta se houve alguma tentativa de “fingir” um endereço IP, esta tentativa ficará registrada através do recurso syslog.
Ex.: alert on

NoSpoof
Se for usada a resolução reversa para corresponder o nome de um host a seu endereço, esta opção resolve o nome de host retornado para verificar se realmente pertence ao host solicitado.
Ex.: nospoof off

Obs.: Muita atenção ao habilitar esta opção, pois pode aumentar significativamente o tráfego no servidor.

Trim
Nesta opção é passado o nome do domínio, que é resolvido antes de realizar a procura no arquivo /etc/hosts. Desta forma não será necessário especificar o nome de domínio no arquivo, apenas os hosts básicos.
Ex.: trim centosbr.org

Multi
Esta opção terá efeito apenas na consulta hosts e especifica se um host poderá ter mais de um endereço IP no arquivo /etc/hosts
Ex.: multi off

Entendido com funciona cada opção do arquivo, segue um exemplo de um arquivo configurado:

Citando:

# Arquivo /etc/host.conf
#
# Tentará resolver os nomes localmente para depois solicitar a resolução ao BIND
order hosts,bind
#
# Não aceitará mais de um endereço IP no arquivo /etc/hosts
multi off
#
# Não será realizada a checagem de IP spoofing
nospoof off
#
# Serão regisrtadas as tentativas de “fingir IP”
alert on
#
# O domínio centosbr.org será resolvido antes de realizar a consulta no hosts
trim centosbr.org


Após editar o arquivo /etc/host.conf vamos configurar um arquivo chamado /etc/resolv.conf que especifica os servidores DNS para requisição de resolução de nomes e em que ordem devem ser contactados.

Podem ser usados três opções neste arquivo:

Domain
Especifica o nome de domínio local. Caso esta opção não esteja configurada, o resolver tenta obter este nome através da chamada de sistema getdomainname().
Ex.:
domain centosbr

NameServer
Especifica o endereço IP do servidor DNS. Esta opção pode ser usada três vezes, para especificar três servidores de nomes diferentes.
Ex.:
nameserver 192.168.0.1
nameserver 192.168.0.2
nameserver 192.168.0.3

Search
Quando se realiza uma consulta para resolução de nomes normalmente se coloca o nome do host.domínio, se o domínio não for especificado, esta opção lista os domínios a serem procurados. Caso esta opção não seja especificada no arquivo, a busca será realizada no domínio local e nos domínios pai.
Ex.:
search centosbr

Segue um arquivo /etc/resolv.conf configurado.

Citando:

#
# Arquivo /etc/resolv.conf
#
# Especifica o domínio local
domain centosbr
#
# Especifica o primeiro servidor a realizar a consulta
nameserver 192.168.0.1
#
# Especifica o segundo servidor a realizar a consulta
nameserver 192.168.0.2
#
# Especifica o terceiro servidor a realizar a consulta
nameserver 192.168.0.3


No exemplo acima não foi utilizada a opção search. Se for solicitada a consulta para um host cent01 primeiramente será realizada a consulta para cent01 depois para cent01.centosbr.

Com esta este arquivo configurado, finalizamos a configuração do resolver. Veremos agora como configurar o servidor de resolução de nomes, DNS Server, através do daemon named.

Antes de configurar o servidor DNS, precisamos entender a estrutura dele. Quando finalizamos a instalação do BIND no servidor, podemos verificar que os seguintes arquivos foram criados na pasta /var/named:

named.ca
Este arquivo possui todas as informações dos rootservers, espalhados pelo mundo. Estes rootservers são os grandes servidores de DNS do mundo, se seu servidor não sabe resolver uma solicitação de nome, encaminha para um desses servidores que realizará a resolução.

named.local
Neste arquivo esta a informação da zona local da máquina (localhost).

localhost.zone
Este é o arquivo de zona reversa, resolve endereço IP para nome.

Estes arquivos são padrões e não precisam ser editados.

Os hosts dentro de um domínio, tornam-se desatualizados e precisam ser alterados, ou inseridos novos hosts, ou até removidos, para este serviço é necessário um host com autoridade. Como nem todos os hosts podem der autoridade para tal processo, foram criadas zonas para delegar autoridade a alguns hosts.

Nas zonas são inseridas informações de hosts e dos subdomínios que fazem parte dela. As zonas de domínio são os arquivos responsáveis por informar ao DNS Server qual o servidor irá responder pelos diversos serviços de uma rede (ftp, e-mail, web, etc.)

Vamos ver como criar um arquivo de zona chamado centosbr.org.hosts:

Citando:

#vi /var/named/centosbr.org.hosts


Citando:

$ TTL 3600

@ IN SOA dns.centosbr.org. root.centosbr.org. (
2007061201 ; serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ; Minimun )
IN NS dns.centosbr.org

dns IN A 192.168.1.1
www IN A 192.168.1.3
ftp IN A 192.168.1.3
smtp IN A 192.168.1.8
pop3 IN A 192.168.1.8
mail IN A 192.168.1.9


Os registros gravados em um arquivo zone são chamados SRR (Standard Resource Records) e todos possuem o mesmo formato básico.

[nome] [ttl]

Onde os campos nome e TTL não são obrigatórios.

O campo classe pode possuir os seguintes valores:

IN
Servidor Internet
HS
Servidores hesiod
CH
Servidores chaosnet

No campo tipo poderão ser usados os seguintes valores:

SOA
Start Of Authority – Indica a autoridade para os dados do domínio em questão
@ (AT)
Define a localização do domínio
Serial
Serve para manter os dados com o servidor escravo sincronizados. Toda vez que o servidor escravo se conectar com o servidor mestre e o serial estiver com um número menor, este copia as informações do servidor primário, caso contrário as informações ficam as mesmas.
Refresh
Este é o intervalo de tempo para a sincronização do servidor escravo com o primário, em segundos
Retry
Caso o servidor primário pare seu funcionamento pelo tempo estipulado nesta opção, o servidor escravo tentará reativar a comunicação repentinamente.
Expire
Tempo em que uma informação poderá passar no servidor escravo sem conexão com o servidor primário. Caso este tempo seja expirado, as informações do servidor escravo são consideradas desatualizadas, em certos casos, o servidor DNS pode parar de resolver nomes.
Minimum
Indica o tempo mínimo de resposta de um servidor de uma requisição de resolução de nomes.
NS
Lista o servidor de nomes para o domónio.
A
Mapeamento de nome para endereço
PTR
Mapeamento de endereço para nome
CNAME
Nome Canônico, serve como um aliases para um hostame já existente.
TXT
Informações
WKS
Well Known Services – Servidores conhecidos
HINFO
Host Information – Informações sobre o host.
MX
Mail Exchange – Servidor de e-mail, esta opção é seguida de um número, entre 0-65535, que determina a prioridade do serviço, quanto menor o número, maior a sua prioridade.


Com nossa zona criada, vamos configurar o arquivo de configuração geral do BIND, o /etc/named.conf, neste arquivo vamos encontrar a configuração do host que deverá ter a porta 53 aberta, por da serviços de DNS, e tanbém informações do servidor de DNS externo, onde o DNS server irá realizar as buscas.

Neste arquivo iremos inserir todas as zonas, criadas anteriormente e também vamos fazer a configuração global do DNS, na seção options.

Nesta seção existem várias opções configuráveis e todas elas podem ser encontradas em http://www.zytrax.com/books/dns/ch7/statements.html.

Citando:

#vi /etc/named.conf


Citando:

options {
directory “/var/named”;
listen-on {127.0.0.1; 192.168.0.1;};
forwarders {200.202.193.75; 200.202.193.76;};
};


Neste início configuramos três opções:

Directory
Indica qual diretório estão os arquivos de zona.

Listen-On
Nesta opção irão ser colocados os endereços IP das interfaces em que o DNS server irá responder, incluindo a interface de loopback. Lembrado que para usar o IPV6, a opção seria listen-on-v6.

Forwarders
Aqui irão ser colocados os endereços IP dos servidores externos, os servidores da provedora de internet, onde o servidor DNS irá realizar a busca para resolução de nomes. Neste exemplo o endereço IP é o servidor DNS da Velox.

Lembrando que para realizar a resolução de nomes, é necessária uma autenticação, que poderá ser encontrada no arquivo /etc/rndc.key, se não for inserido a chave de identificação neste arquivo, temos que inserir a opção apontando para este arquivo logo após às configurações globais:

Citando:

include “/etc/rndc.key”;


Depois de configuradas as opções globais, vamos configurar as zonas:

Citando:

zone “.” {
type hint;
file “named.ca”;
}

zone “0.0.127.in-addr.arpa” {
type master;
file “named.local”;
}

zone “centosbr.org” {
type master;
file “centosbr.org.hosts”
}


Nas zonas, definimos o nome da zona, seguido do tipo e do arquivo.

Os valores para a opção type são:

master
Indica que é um servidor mestre.

hint
Indica um servidor de cache.

slave
Indica um servidor escravo.

A zona “.”, definida inicialmente, faz referência ao arquivo named.ca que tem a lista dos principais servidores DNS espalhados no mundo.

A zona 0.0.127.in-addr.arpa é referente ao arquivo named.local, que contém a informação de resolução reversa.

E a última zona, centosbr.org é referente ao arquivo criado anteriormente, referente a zona de nossa rede interna.

Com o arquivo configurado, podemos inicializar o nosso servidor DNS.

Citando:

#service named start


Para parar o serviço:

Citando:

#service named stop


E para reinicializar o serviço:

Citando:

#service named restart


Nós podemos aumentar a segurança do nosso DNS Server utilizando as seções de acl e view.

Na seção acl nós iremos criar listas de endereços IP que poderão ser citados posteriormente nas views ou dentro das zonas.

Existem acls “especiais” já criadas pelo BIND, são elas:

none
Indica: nenhum host.

any
Indica todos os hosts.

[localhost]
Indica os endereços IP de todas as interfaces do DNS server. Por exemplo, se o servidor tiver uma interface com o IP 192.168.0.1, esta acl irá indicar o IP 192.168.0.1 e o 127.0.0.1.

localnets
Indicará todos os hosts da rede em que pertence o DNS Server. Se o DNS Server tiver apenas uma interface com o endereço IP 192.168.0.1 e a máscara 255.255.255.0, ou 192.168.0.1/24, esta acl indicará os hosts de 192.168.0.0 até 192.168.0.255 e também o 127.0.0.1.

Com a seção view podemos realizar uma configuração para várias zonas de uma só vez.

Vamos imaginar que nossa rede seja dividida em várias Vlans diferentes, cada Vlan indica um departamento.

DNS Server – 192.168.0.1
Vlan1 – 192.168.1.0/24
Vlan2 – 192.168.2.0/24
Vlan3 – 192.168.3.0/24

E queremos aumentar a segurança e a performance na resolução de nomes para essas Vlans. Para isso vamos criar uma acl contendo estas redes e uma view que irá conter as configurações de resolução de nomes das zonas.

Citando:

acl “rede_interna” {
192.168.1.0/24;
192.168.2.0/24;
192.168.3.0/24;
}

view “interna” {
match-clients {
“rede_interna”;}
recursion yes;

zone “vlan01” {
type master;
file “vlan01.hosts”;
}

zone “vlan02” {
type master;
file “vlan02.hosts”;
}

zone “vlan03” {
type master;
file “vlan03.hosts”
}
}

view “externa” {
match-clients {
“any”;
!”rede_interna”;}
recursion no;

zone “.” {
type hint ;
file “named.ca” ;
}
}


Note que habilitamos a opção recursion apenas na rede interna, lembrando que uma pesquisa recursiva obriga ao servidor entregar uma resposta direta, diferente da pesquisa interativa, onde o servidor poderá indicar o caminho do próximo servidor, caso não possua a resposta. Na rede “externa” que significa, todas as redes exceto a rede interna, a opção recursion ficará desabilitada, evitando tráfego desnecessário e futuros problemas.

Então nosso arquivo de configuração final, seria do tipo:

Citando:
#
# Arquivo /etc/named.conf
#
#
option {
directory “/var/named”
listen-on { 127.0.0.1; 192.168.0.1; }
forwarders { 200.202.193.75; 200.202.193.76; }
}
include “/etc/rndc.key”

acl “rede_interna” {
192.168.1.0/24;
192.168.2.0/24;
192.168.3.0/24;
}

view “interna” {
match-clients {
“rede_interna”;}
recursion yes;

zone “vlan01” {
type master;
file “vlan01.hosts”;
}

zone “vlan02” {
type master;
file “vlan02.hosts”;
}

zone “vlan03” {
type master;
file “vlan03.hosts”
}
}

view “externa” {
match-clients {
“any”;
!”rede_interna”;}
recursion no;

zone “.” {
type hint ;
file “named.ca” ;
}
}

quarta-feira, 20 de agosto de 2008

Festa livre

Destinado a todos os que deseja utilizar alguma espécie de software Open Source