Capítulo 15 – Receitas de Bolo
Essa seção contém entradas de ‘receitas de bolo’ que podem lhe ajudar a resolver problemas. Um livro de receita de bolo, contudo, não substitui o conhecimento, portanto tente e compreenda o que você está fazendo.
15.1. Rodando múltiplos sites com diferentes SLAs
Você pode fazer isso de várias formas. O Apache possui algum suporte para isso com um módulo, mas nós mostraremos como o Linux pode fazer isso pra você, e assim faz para outros serviços também. Esses comandos são roubados de uma apresentação do Jamal Hadi que é referenciado abaixo.
Digamos que nós temos dois clientes, com http, ftp e streaming de áudio, e desejamos vendê-los uma quantidade limitada de banda. Nós executamos, portanto, no servidor em si.
O cliente A deve ter no máximo 2 Megabits, o cliente B tem pago por 5 Megabits. Nós separamos nossos clientes criando endereços IP virtuais em nosso servidor.
# ip address add 188.177.166.1 dev eth0
# ip address add 188.177.166.2 dev eth0
Isso incumbe você a vincular aos diferentes servidores os endereços IP corretos. Todos os daemons populares têm suporte para isso.
Primeiro nós associamos uma qdisc CBQ a eth0:
# tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit \
cell 8 avpkt 1000 mpu 64
Nós então criamos classes para nossos clientes:
# tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit \
rate 2MBit avpkt 1000 prio 5 bounded isolated allot 1514 weight 1 maxburst 21
# tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth 10Mbit \
rate 5Mbit avpkt 1000 prio 5 bounded isolated allot 1514 weight 1 maxburst 21
Então adicionamos filtros as nossas duas classes:
##FIXME: Why this line, what does it do?, what is a divisor?:
##FIXME: A divisor has something to do with a hash table, and the number of
## buckets - ahu
# tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 1: u32 divisor 1
# tc filter add dev eth0 parent 1:0 prio 5 u32 match ip src 188.177.166.1
flowid 1:1
# tc filter add dev eth0 parent 1:0 prio 5 u32 match ip src 188.177.166.2
flowid 1:2
E pronto.
CORRIJAM-ME: por que nenhum filtro token bucket? Existe em algum lugar um pfifo_fast de fallback?
15.2. Protegendo seu host de SYN floods
Da documentação iproute do Alexey, adaptado para o netfilter e com mais caminhos plausíveis. Se você usa isso, cuide de ajustar os números para valores razoáveis para seu sistema.
Se você deseja proteger uma rede inteira, pule esse script, que é mais bem ajustada para um host único.
Parece que você precisa da versão mais recente das ferramentas iproute2 para conseguir que isso funcione com o kernel 2.4.0.
#! /bin/sh -x
#
# sample script on using the ingress capabilities
# this script shows how one can rate limit incoming SYNs
# Useful for TCP-SYN attack protection. You can use
# IPchains to have more powerful additions to the SYN (eg
# in addition the subnet)
#
#path to various utilities;
#change to reflect yours.
#
TC=/sbin/tc
IP=/sbin/ip
IPTABLES=/sbin/iptables
INDEV=eth2
#
# tag all incoming SYN packets through $INDEV as mark value 1
############################################################
$iptables -A PREROUTING -i $INDEV -t mangle -p tcp --syn \
-j MARK --set-mark 1
############################################################
#
# install the ingress qdisc on the ingress interface
############################################################
$TC qdisc add dev $INDEV handle ffff: ingress
############################################################
#
#
# SYN packets are 40 bytes (320 bits) so three SYNs equals
# 960 bits (approximately 1kbit); so we rate limit below
# the incoming SYNs to 3/sec (not very useful really; but
#serves to show the point - JHS
############################################################
$TC filter add dev $INDEV parent ffff: protocol ip prio 50 handle 1 fw \
police rate 1kbit burst 40 mtu 9k drop flowid :1
############################################################
#
echo "---- qdisc parameters Ingress ----------"
$TC qdisc ls dev $INDEV
echo "---- Class parameters Ingress ----------"
$TC class ls dev $INDEV
echo "---- filter parameters Ingress ----------"
$TC filter ls dev $INDEV parent ffff:
#deleting the ingress qdisc
#$TC qdisc del $INDEV ingress
15.3. Limitação de Taxa ICMP pra evitar dDoS
Recentemente, ataques de negação de serviço distribuído tem se tornado uma praga importante. Pela filtragem apropriada e pela limitação da taxa de sua rede, você pode tanto evitar ser uma vitima quanto a origem desses ataques.
Você deve filtrar suas redes de sorte que não permita que pacotes endereçados com IP origem não local deixe sua rede. Isso evita as pessoas de enviar anonimamente lixo para a Internet.
Limitação de taxa parte muito como mostrado antes. Para atualizar sua memória, nosso ASCIIgram novamente:
[The Internet] ---<E3, T3, whatever>--- [Linux router] --- [Office+ISP]
eth1 eth0
Primeiro configuramos as partes pré-requisitos:
# tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000
# tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate \
10Mbit allot 1514 prio 5 maxburst 20 avpkt 1000
Se você tiver interface 100 Mbit, ou mais, ajuste esses números. Agora você precisa determinar quanto de tráfego ICMP você deseja permitir. Você pode executar medições com o tcpdump, tendo que gravar essas medidas em um arquivo por enquanto, e ver quanto de tráfego ICMP passa em sua rede. Não esqueça de levantar o tamanho dos instantâneos!
Se medidas forem inexeqüíveis, você pode desejar escolher 5% de sua largura de banda disponível. Definamos nossa classe:
# tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 10Mbit rate \
100Kbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 250 \
bounded
Isso limita em 100kbit. Agora precisamos de um filtro para atribuir tráfego ICMP a essa classe:
# tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip \
protocol 1 0xFF flowid 10:100
Bert Hubert (Netherlabs BV)
bert.hubert@netherlabs.nl
Thomas Graf (Autor de Seção)
tgraf@suug.ch
Gregory Maxwell (Autor de Seção)
greg@linuxpower.cx
Remco van Mook (Autor de Seção)
remco@virtu.nl
Martijn van Oosterhout (Autor de Seção)
kleptog@cupid.suninternet.com
Paul B Schroeder (Autor de Seção)
paulsch@us.ibm.com
Jasper Spaans (Autor de Seção)
jasper@spaans.ds9a.nl
Pedro Larroy (Autor de Seção)
piotr@member.fsf.org