Mostrando postagens com marcador debian. Mostrar todas as postagens
Mostrando postagens com marcador debian. Mostrar todas as postagens

sexta-feira, 27 de junho de 2008

Instalando o Debian via rede com boot remoto

Artigo escrito por Alisson Baracho - alisson@usinet.com.br
*O sofreu pequenas modificações permitidas pelo autor.

A fim de resolver o problema de instalação do linux através de medias removíveis, ou mesmo agilizar a instalação em múltiplas máquinas, surge necessidade de instalação por meios alternativos, e a instalação via rede com boot remoto se torna uma excelente solução.

O artigo foi feito baseado na distribuição Debian, mas com as modificações apropriadas se aplica a qualquer distribuição.

Alguns conceitos antes de iniciar o artigo.

PXE (Ambiente de execução Pré-Boot)
Permite o boot usando a interface de rede independente de dispositivo de armazenamento disponível (como por exemplo, disco rígido) ou sistemas operacionais instalados.

DHCPd (Protocolo de configuração dinamica de host)
Daemon para o Protocolo de serviço TCP/IP que oferece configuração dinâmica de terminais, com concessão de endereços IP de host e outros parâmetros de configuração para clientes de rede.

TFTP (Protocolo Trival de Transferencia de Arquivos)
Protocolo simples para transferencia de arquivos, com funcionalidades básicas de FTP.


Para começar, instala-se os daemons requeridos.

#apt-get install pxe atftpd dhcp3-server

Edite o /etc/dhcp3/dhcpd.conf alterando os endereços ips para os da sua rede

#----------------BOF---------------------
allow booting;
allow bootp;
ddns-update-style none;
#Seu dominio
option domain-name "linuxadm.com.br";
# Mascara da Rede
option subnet-mask 255.255.255.0;
# Endereço de broadcast da rede
option broadcast-address 192.168.0.255;
# Endereço do gateway padrao para os hosts
option routers 192.168.0.1;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 12.168.0.100 192.168.0.150;
}
group {
filename "pxelinux.0";
host pxemachine {
#Endereço MAC da maquina cliente
hardware ethernet 00:e0:4c:92:fd:51;
#Endereço do servior tftpd e diretório de boot)
option root-path "192.168.0.1:/tftpboot/";
}
}
#----------------EOF---------------------

Agora edite o /etc/pxe.conf

#----------------BOF---------------------
#Interface a ser usada no servidor
interface=eth0
#Endereço do servidor
default_address=192.168.0.1
#Endereço de multicast a escutar
multicast_address=192.168.0.255

# mtftp info
mtftp_address=192.168.0.1
mtftp_client_port=1758
mtftp_server_port=1759

#Porta de escuta
listen_port=4011
#Habiliar Multicast
use_multicast=1
#Habilitar Broadcast
use_broadcast=1
#Mensagem de boot
prompt=Press F8 to view menu.
#Tempo de espera da mensagem
prompt_timeout=10

# Quais serviços serão disponibilizados, e ordem de prioridade
service=X86PC,0,0,local,Local boot
service=X86PC,0,0,pxelinux,PXELinux

#Diretório Base do tftpd
tftpdbase=/tftpboot
#Nome do domínio
domain=linuxadm.com.br
#----------------EOF---------------------

Lembre-se que o diretório /tftpboot deve ter permissao de leitura e execucao.

Por fim, edite o arquivo /etc/default/atftpd

#----------------BOF---------------------
USE_INETD=false
OPTIONS="--daemon --port 69 --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 192.168.0.0-255 --mcast-ttl 1 --maxthread 100 -- verbose=5 /tftpboot"
#----------------EOF---------------------

obs. Verifique se a linha não está quebrada, o parametro options deve estar em uma única linha.

A configuração dos daemons terminou, baixe os arquivos da distribuição (No nosso caso, Debian Etch)

# mkdir -p /tftpboot
# cd /tftpboot
# wget http.us.debian.org/debian/dists/etch/main/installer-i386/current/images/netboot/mini.iso
# wget http.us.debian.org/debian/dists/etch/main/installer-i386/current/images/netboot/netboot.tar.gz
# wget http.us.debian.org/debian/dists/etch/main/installer-i386/current/images/netboot/pxelinux.0


Descompacte o boot do Debian Netinstall na pasta /tftpboot

# tar zxvf netboot.tar.gz
# chmod 755 /tftpboot -R


Pronto, agora reiniciando os daemons.

# invoke-rc.d atftpd restart
# invoke-rc.d dhcp3-server restart
# invoke-rc.d pxe restart


Agora, basta entrar no setup da maquina que será instalada e definir o boot pela lan, reinicie o computador e a tela da instalação do debian aparecerá.

Agradeço ao Alisson que gentilmente ofereceu esse excelente tutorial para ser publicado em nosso blog.

Fonte: http://en.wikipedia.org/wiki/Preboot_Execution_Environment
Fonte: http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol

Fonte: http://pt.wikipedia.org/wiki/DHCP

*Outras fontes foram consultadas mas não foram referenciadas pelo autor.

segunda-feira, 16 de junho de 2008

DNS Robusto e fácil com PowerDNS e MySQL

O PowerDNS é um dos muitos softwares de DNS, ele é muito poderoso, pode fazer milhares de resoluções por segundo, e o que mais me chamou atenção, pode-se comunicar com vários backends, includindo MySQL, PostgreSQL, LDAP, Oracle e outros.

Para se ter uma idéia, existem grandes implementações feitas com ele, incluindo register.com e tucows.com, e, segundo o site oficial, existem aproximadamente 4000 servidores em serviços secundários ativos na internet, que servem aproximadamente 10 milhões de zonas e um imenso núumero de domínios. Testes no primeiro nível do domínios .EU demonstraram que o PowerDNs pode prover 50.000 resoluções por segundo num único servidor, com um hardware simples. No GOOGLE encontrei relatos de testes feitos inclusive pelo registro.br para utilização do mesmo.

A única desvantagem evidente é que o PowerDNS ainda não prevê uma implementação completa do DNSSEC. (O que pra muitos é irrelevante, visto que poucos são aqueles que implementaram DNSSEC em seus servidores)

Utilizar o PowerDNS inclusive como cache de DNS é uma ótima pedida devido a sua excelente performance.

Já tenho usado o PowerDNS há pelo menos 2 anos como servidor secundário e a pouco menos de 1 ano como servidor primário. Utilizo-o bastante também como caching de DNS, ele é extremamente rápido.

Estarei descrevendo abaixo os passos para instalação do PowerDNS no Debian, mas com um pouco de conhecimento pode ser instalado em qualquer distribuição através do código fonte.

---------------------------------------------------------------------------

1º Ambiente - Somente recursão de nomes (DNS cache, caching)

#apt-get install pdns-recursor

Edite o arquivo /etc/powerdns/recursor.conf:

Descomente a linha allow-from e insira os endereços ou classes ips autorizadas a fazer a recursão de nomes.

allow-from=127.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, ::1/128, fe80::/10

Para evitar que vejam a exibição da versão do PowerDNS.

version-string=DENIED

Edite o arquivo /etc/resolv.conf e altere a linha nameserver para 127.0.0.1 (Isso fará com que a pesquisa de DNS seja feita no servidor local)

Pronto, você já está apto a fazer consultas de dns através do seu dns caching.

---------------------------------------------------------------------------

2º Ambiente - Servidor de nomes e recursão

Considerando que o mysql já está instalado no servidor.

Instale o PowerDNS com suporte a Mysql

#apt-get install pdns-backend-mysql

Entre no MySQL e execute os comandos abaixo para criar o usuário, senha, banco e setar as permissões pertinentes.

#mysql

#------- Recortar Aqui
CREATE USER 'pdns'@ '%' IDENTIFIED BY 'sua-senha';
GRANT USAGE ON * . * TO 'pdns'@ '%' IDENTIFIED BY 'sua-senha' WITH \
MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 \ MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
CREATE DATABASE `pdns` ;
GRANT ALL PRIVILEGES ON `pdns` . * TO 'pdns'@ '%';
#-------
Agora vamos criar as tabelas conforme o modelo do PowerDNS.

#mysql -u pdns -psua-senha -D pdns < /usr/share/doc/pdns-backend-mysql/mysql.sql
Então vamos copiar o arquivo padrão de configurações do backend para o diretório de configuração.

#cp /usr/share/doc/pdns-backend-mysql/examples/pdns.local.gmysql /etc/powerdns/pdns.d/

Edite o arquivo /etc/powerdns/pdns.d/pdns.local.gmysql

Altere o arquivo conforme suas preferencias.

gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=sua-senha

Como seu servidor de DNS também fará a recursão de nomes, é importante limitar a recursividade do seu servidor de nomes aos IP's de sua(s) rede(s), isso impede o conhecido OPEN DNS.

Edite o arquivo /etc/powerdns/pdns.conf.

Descomente a linha allow-recursion e insira os endereços dos quais os servidor de nomes vai servir.

allow-recursion=127.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, ::1/128, fe80::/10

Descomente a linha launch e insira os backends a serem carregados

launch=bind,gmysql

Se você irá replicar as Zonas, precisa inserir os endereços ips dos servidores dos quais irá fazer transferência de Zonas.

allow-axfr-ips=200.200.200.200
(onde 200.200.200.200 é o endereço ip do seu servidor de dns que será replicado)

Precisa também permitir as transferências de zonas.

disable-axfr=no

Altere a porta do recursor para uma porta diferente do servidor de nomes, para isso edite o arquivo /etc/powerdns/recursor.conf

local-port=2525

Agora vamos inserir o recursor no servidor de nomes, para quem ele faça recursão caso não encontre no servidor de nomes local. Para isso edite o arquivo edite o arquivo /etc/powerdns/pdns.conf.

recursor=127.0.0.1:2525

É isso, seu servidor de nomes já está ativo e com suporte a recursão.
Para testar o servidor de nomes local, vamos inserir um registro de exemplo.

# mysql

#------- Recortar Aqui
insert into domains (name,type) values ('teste.com.br','NATIVE');
insert into records (content,type,domain_id,name) values ('127.0.0.1','A','1','www.teste.com.br')
#-------

Teste o a resolução de seu domínio.
Lembre-se que para fazer o teste, vc deve ter o endereço local de seu servidor no arquivo /etc/resolv.conf

Aproveite! =)

---------------------------------------------------------------------------

3º Ambiente - Servidor de nomes e sem recursão

Repita o procedimento do ambiente 2, apenas não instalando o Recursor.

---------------------------------------------------------------------------

Abaixo três interfaces gráficas para gerenciamento do PowerDNS

PowerAdmin - http://www.poweradmin.org/ (O Mais completo)
proFTPd Administrator - proftpd-adm.sourceforge.net
ZoneAdmin - http://open.megabit.net/index.php?section=pro_home&project=ZoneAdmin

Fonte: http://www.powerdns.com/

terça-feira, 18 de março de 2008

Controlando a banda do tráfego P2P com Layer7 - Versão 2008

Como sempre, o principal vilão hoje de qualquer Administrador de Redes, Provedores e outros são os programas P2P, e clientes que reclamam que não tem a banda total garantida devido aos medidores de tráfego do tipo RJNET entre outros.

Aqui então vamos nós para uma aventura de marcação de pacotes e priorização dos mesmos, juntamente com a integração da marcação destes pacotes com o TC ( Traffic Control ) do GNU/Linux.

O sistema foi testado em um Debian GNU/Linux, com kernel 2.6.22.15, iptables versão 1.3.8, patch-o-matic, layer7 versão 2.17, protocolos versão 2008-02-10, imq para o kernel.

Não vou entrar nos detalhes de como compilar kernel, iptables entre outros, vamos por a mão na massa.

Primeiro, redirecionamos o trafego de download e upload para as interfaces virtuais:

iptables -v -t mangle -A PREROUTING -m comment --comment "Trafego Upload" -i eth+ -j IMQ --todev 0
iptables -v -t mangle -A POSTROUTING -m comment --comment "Trafego Download" -o eth+ -j IMQ --todev 1

usamos o eth+ por termos várias interfaces de rede.

Logo após, criamos a CHAIN chamada P2P e adicionamos o que queremos

iptables -t mangle -N P2P
iptables -t mangle -A P2P -m layer7 --l7proto ares -j MARK --set-mark 0x7
iptables -t mangle -A P2P -m layer7 --l7proto ares -j CLASSIFY --set-class 1:7
iptables -t mangle -A P2P -m layer7 --l7proto ares -j RETURN

iptables -t mangle -A P2P -m layer7 --l7proto edonkey -j MARK --set-mark 0x7
iptables -t mangle -A P2P -m layer7 --l7proto edonkey -j CLASSIFY --set-class 1:7
iptables -t mangle -A P2P -m layer7 --l7proto edonkey -j RETURN

iptables -t mangle -A P2P -m layer7 --l7proto bittorrent -j MARK --set-mark 0x7
iptables -t mangle -A P2P -m layer7 --l7proto bittorrent -j CLASSIFY --set-class 1:7
iptables -t mangle -A P2P -m layer7 --l7proto bittorrent -j RETURN

iptables -t mangle -A FORWARD -j P2P
iptables -t mangle -A POSTROUTING -j P2P

Criamos a chain P2P e adicionamos nela a marcação de pacotes e setando a classe para o qual vai ser direcionado o P2P ares, edonkey e bittorrent. O Return funciona para caso ele encontre algo antes, tipo, alguem usando ares, ele nao desça ate o final da chain procurando mais coisas.

Após marcar e setar a classe, vamos criar as classes usando o TC

ip link set dev imq0 up
ip link set dev imq1 up

tc qdisc add dev imq0 root handle 1: htb default 1
tc qdisc add dev imq1 root handle 1: htb default 1

tc class add dev imq0 parent 1: classid 1:1 htb rate 100Mbit
tc class add dev imq1 parent 1: classid 1:1 htb rate 100Mbit

#P2P
tc class add dev imq0 parent 1:1 classid 1:7 htb rate 512kbit prio 7
tc class add dev imq1 parent 1:1 classid 1:7 htb rate 512kbit prio 7

# Aqui setamos a classe do P2P 1:7 para 512kbit com a prioridade 7

Logo após, adicionamos o filtro à classe

tc filter add dev imq0 parent 1: prio 7 protocol ip handle 7 fw flowid 1:7
tc filter add dev imq1 parent 1: prio 7 protocol ip handle 7 fw flowid 1:7

Ou seja, estamos agora controlando a banda de trafego P2P.

Vamos agora adicionar um "feature" a essas regras. Marcando por ex.: tudo que vai para rjnet.com.br sair com a banda de 2mbit.

iptables -t mangle -N WEB
iptables -t mangle -A WEB -m string --algo bm --string "rjnet.com.br" -j MARK --set-mark 0x6
iptables -t mangle -A WEB -m string --algo bm --string "rjnet.com.br" -j CLASSIFY --set-class 1:6
iptables -t mangle -A WEB -j CONNMARK --save-mark

iptables -t mangle -A FORWARD -j WEB
iptables -t mangle -A POSTROUTING -j WEB

tc class add dev imq0 parent 1:1 classid 1:6 htb rate 2048kbit prio 0
tc class add dev imq1 parent 1:1 classid 1:6 htb rate 2048kbit prio 0

tc filter add dev imq0 parent 1: prio 0 protocol ip handle 6 fw flowid 1:6
tc filter add dev imq1 parent 1: prio 0 protocol ip handle 6 fw flowid 1:6
tc filter add dev imq1 parent 1: protocol ip match ip dst 200.159.128.189 flowid 1:6

Sendo assim, teremos marcado tudo que conter rjnet.com.br com uma banda de 2mbit.

Esse cenário foi montado em testes e esta funcionando normalmente.

Abraços!

quarta-feira, 2 de maio de 2007

Limitando o tráfego P2P com Layer7 e Connlimit

Data de criação: 20/04/2007
Artigo pode sofrer alterações devido novas funcionalidades encontradas.


Trabalho em um provedor de internet, e como todo administrador de redes, controlar efetivamente o tráfego de P2P é um desafio.
Mais do que o tráfego por ele gerado, o número de conexões ativas, assim como o número de pacotes por segundo, pode gerar muitos transtornos devido uma sobrecarga no Access Point.

Pesquisando na internet, encontrei um artigo interessante, sobre o uso de "connlimit no controle de portas¹", mas, em alguns casos não é interessante limitar todas as portas, principalmente se parte de seus clientes são empresas e precisam de acesso full, o que é necessário então é limitar somente o P2P.
A idéia então seria usar um classificador de protocolos, então pensei então em combinar essa idéia com o filtro de protocolo (Layer7)
Existe também o IPP2P, entretanto, como os clientes P2P estão usando técnicas de criptografia, e o IPP2P não é atualizado a quase um ano, prefiro manter no Layer7 que tem atualizações constantes de sua base de protocolos e no core do software.

Referência.
¹- http://under-linux.org/wiki/index.php/Tutoriais/Seguranca/Usando_o_Connlimit


Mãos a obra,
(Levando em consideração que sabe o que faz e tem conhecimento de compilar programas e do próprio kernel)

Requerimentos

Patch Connlimit - ftp://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20070414.tar.bz2
Patch Layer7 - http://ufpr.dl.sourceforge.net/sourceforge/l7-filter/netfilter-layer7-v2.9.tar.gz
Protocolos Layer7 - http://ufpr.dl.sourceforge.net/sourceforge/l7-filter/l7-protocols-2007-01-14.tar.gz
Kernel 2.6.19.7 - http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.19.7.tar.gz
Iptables 1.3.37 - ftp://ftp.netfilter.org/pub/iptables/iptables-1.3.7.tar.bz2

Decompacte o Kernel
#tar xzpvf linux-2.6.19.7.tar.gz

Descompacte o patch do Layer7
#tar xzpvf netfilter-layer7-v2.9.tar.gz

Descompacte o Connlimit
#tar xjpvf patch-o-matic-ng-20070414.tar.bz2

Descompacte o Iptables 1.3.37
#tar xjpvf iptables-1.3.7.tar.bz2

Aplique o patch do Layer7 ao Kernel
#patch -p1 < ../netfilter-layer7-v2.9/kernel-2.6.18-2.6.19-layer7-2.9.patch

Aplique o Patch do Connlimit
#cd patch-o-matic-ng-20070414
#KERNEL_DIR=../linux-2.6.19.7 IPTABLES_DIR=../iptables-1.3.7 ./runme connlimit -download (a opção -download é porque o connlimit não vem no snapshot padrao do patch-o-matic)

Agora que o kernel já está patcheado, vamos ativar os patch's

#cd linux-2.6.19.7
#make menuconfig
Ativar a opção - Connection tracking flow accounting (Requerido pelo Layer7) Networking->network options->network patcket filtering->IP: Netfilter Configuration->Connection tracking->Connection tracking flow accounting

Ativar a opção - Layer 7 match support
Networking->network options->network patcket filtering->IP: Netfilter Configuration->Layer 7 match support

Ativar a opção de Connlimit
networking->network options->network patcket filtering->IP: Netfilter Configuration->Connections/IP limit match support

Agora, configure o kernel a seu gosto, e compile-o.

Em Slackware
#make all
#make install
#lilo

Em Debian
#make-kpkg --initrd kernel_image
#dpkg -i ../linux-image-2.6.19.7_2.6.19.7-10.00.Custom_i386.deb

Agora, ainda falta compilar o iptables com suporte a layer7 e connlimit

Primeiro aplicamos os patch's

#cd iptables-1.3.7

Aplique o patch do filtro Layer7 ao iptables
#patch -p1 < ../netfilter-layer7-v2.9/iptables-layer7-2.9.patch

(O patch-o-matic já aplicou o patch ao iptables, visto que definimos o caminho do source do iptables)

Dê permissões para o iptables compilar suas extensões

#chmod +x extensions/.*

Compile o iptables
#KERNEL_DIR=../linux-2.6.19.7 PREFIX=/usr make

Instale o iptables
#make install

Atualize o cache de bibliotecas
#ldconfig

Reinicie o kernel, para ativar as compilações feitas
# shutdown -r now

Agora, insira em seu arquivo de firewall as seguintes linhas.

Crio uma nova chain na tabela mangle para o limite de conexões (CONNLIMIT)
#iptables -v -t mangle -N CONNLIMIT

Classifico cada protocolo de P2P nessa nova chain
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto edonkey -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto ares -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto gnutella -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto fasttrack -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto imesh -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto directconnect -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto napster -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto soulseek -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto bittorrent -j CONNLIMIT

Aplico o limite de conexões 15 conexões de P2P por IP (O connlimit só é aplicável em pacotes tcp)
#iptables -v -t mangle -A CONNLIMIT -p tcp -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP

Como o connlimit só limita as conexões TCP, as regras acima só se aplicam a esse protocolo, se desejar fazer o controle também de UDP terá q ser feito com cbq,htb,hfsq + layer7 ou então dropando qualquer pacote p2p em UDP, conforma abaixo.

#iptables -v -t mangle -A PREROUTING -p UDP -m layer7 --l7proto edonkey -j DROP

Se você deseja um filtro ainda mais competente e ache que o controle de portas pode ser combinado sem complicações, sugiro as seguintes regras.

#iptables -v -t mangle -N CONNLIMIT
#iptables -v -A FORWARD -p TCP -d 0/0 --dport 4300:4672 -j CONNLIMIT
#iptables -v -A FORWARD -p TCP -d 0/0 --sport 4660:4672 -j CONNLIMIT
#iptables -v -A FORWARD -p TCP -d 0/0 --dport 6881:65000 -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto edonkey -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto ares -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto gnutella -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto bittorrent -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto fasttrack -j CONNLIMIT
#iptables -v -t mangle -A CONNLIMIT -p tcp -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP

Então o iptables aplica o connlimit nas portas conhecidas do emule (source e destination), e nas portas altas de destino, e qualquer P2P que esteja fora desse range de portas, se identificado com o layer7 também entra no connlimit.
Ultimamente nos servidores que possuem controle de banda essas regras estão ativas no controle de p2p em meus servidores, as regras anteriores só com layer7 só as aplico em servidores onde não posso fazer o limite de portas (roteadores por exemplo).

Esteja ciente que alguns protocolos do layer7 são lentos, portanto se o tempo de resposta de sua rede subir, ou apresentar perda de pacotes, tente evitar protocolos lentos como o bittorrent, prefira manter os mais ativos e mais rapidos, como emule e ares.

Espero que seja de alguma ajuda, abraços.
Wagner Assis