RMU-2012-1
Redes Multimidia: Diário de Aula 2012-1
Professor: Marcelo Maia Sobral (msobral@gmail.com)
Lista de email (forum): rmu-ifsc@googlegroups.com
Encontros: 4a feira/9:40, 5a feira/7:30
Atendimento paralelo: 2a de 8 às 11:30 h, 4a de 13:30 às 16:30 h, 6a de 9:40 às 11:30 h.
Bibliografia
- Livros sobre Redes de Computadores (por ordem de preferência):
- KUROSE, James F. e ROSS, Keith W. Redes de computadores e a Internet, Uma abordagem Top-Down. 5a edição. Editora Addison Wesley SP, 2010.
- Sérgio Colcher, Antônio Tadeu Azevedo Gomes, e Anderson Oliveira da Silva. VoIP: Voz sobre IP. Campus, 1a edição, 2005.
- STALLINGS, W. Redes e sistemas de comunicação de dados. Editora Elsevier RJ, 2005.
- TANENBAUM, Andrew S. Redes de Computadores, tradução da quarta edição. Editora Campus RJ, 2003
- FOROUZAN, Behrouz. Comunicação de Dados e Redes de Computadores, 3a/4a edicão. Editora Bookman, 2004.
Curiosidades
Listas de exercícios
Avaliações
Softwares
29/02: Apresentação
Apresentação da disciplina: conteúdo, bibliografia e avaliação, laboratório.
Redes multimidia
Uso de redes de dados para transmitir conteúdo de diferentes midias:
- Video streaming (ex: Netflix, Youtube)
- Internet radio (ex: Icecast)
- VoIP e telefonia IP (SIP com Asterisk ou FreePBX, Skype)
- Video e áudio conferência
- Telemedicina
- Jogos
- ... outros ?
Algumas questões sobre essas aplicações:
- Como funcionam esses serviços ? Como os conteúdos são acessados ?
- Como os dados são representados ?
- Como os dados são transportados através da rede ? Quais os protocolos envolvidos e como os dados são encapsulados em suas PDUs ?
- Que requisitos quanto à transmissão pela rede possuem para um bom funcionamento ?
Exemplo 1: video streaming
Video streaming é a transmissão de video por uma rede de dados, com sua visualização ocorrendo à medida que for sendo recebido pelo cliente. Um exemplo muito conhecido de serviço de video streaming é fornecido pelo YouTube. Outros exemplos de video streaming são Netflix, que possibilita assistir filmes via Internet mediante o pagamento de uma assinatura, e a transmissão de jogos de futebol via Internet por algumas emissoras de TV aberta. Apesar de a experiência dos usuários parecer a mesma (ou quase ...) para esses serviços, existem diferenças na forma como são implementados.
Experimente visualizar os videos abaixo. Em todos eles observe quanto tempo demora para iniciar a tocar o video e sua continuidade (se ele interrompe ou degrada a imagem). Experimente também avançar o video, como por exemplo para perto de seu final.
- Video 1: execute mplayer rtsp://172.18.200.251:8000/teste.sdp ou vlc rtsp://172.18.200.251:8000/teste.sdp
- Video 2: usando um tocador Flash.
- Video 3: usando HTML5
- Video 4: execute vlc http://tele.sj.ifsc.edu.br/~msobral/rmu/videos/x.mp4
- Video 5: execute vlc http://mmsobral.no-ip.org:8080/armacao/coisas/sr.mp4
- Video 6: execute vlc http://mmsobral.no-ip.org:8080/armacao/coisas/sr3.mp4
Como é feito o acesso a esses videos, e como eles são transportados pela rede ?
- Execute o wireshark e repita o acesso aos videos. Enquanto a captura acontece, faça um reposicionamento do video - i.e. avance-o para perto de seu final. Observe as mensagens trocadas entre sua aplicação cliente e o servidor do video.
- Você conseguiria descrever como funcionam seus acessos e tranmsmissões ?
- Você pode notar alguma diferença entre as diferentes formas de transmissão do video ?
Exemplo 2: Internet radio
Atualmente muitas estações de rádio transmitem suas programações também pela Internet. Existem inclusive muitas estações cujas transmissões são feitas somente pela rede - i.e. a rigor, não fazem transmissão por rádio. Com isso, pessoas conseguem escutar a programação de uma estação de rádio de outro país. Um atrativo dessas estações via Internet é informarem o gênero de música transmitida, além de apresentarem uma boa qualidade sonora. Esse tipo de serviço se popularizou tanto que existem diretórios de estações, que podem ser acessados por aplicativos e assim possibilitar que os usuários escolham que tipo de música desejam escutar.
Um aplicativo do Linux que oferece fácil acesso a Internet radio é o Rhytmbox. Ele pode ser executado no menu Aplicativos->Som e video. Execute o Rhytmbox em seu computador, e escolha uma estação de radio. Observe quanto tempo demora para que a música comece a tocar, a qualidade do som, e sua continuidade.
Como é feito o acesso às estações de rádio, e como as músicas são transportadas pela rede ?
- Execute o wireshark e repita o acesso à estação. Enquanto a captura acontece, observe os protocolos envolvidos e as mensagens que fluem entre seu computador e o servidor da estação. Observe também onde a estação se localiza (país/cidade).
- Você conseguiria descrever como funcionam seus acessos e transmissões ?
01/03: Caracterização de midias
Compressão de video
Técnicas usadas para compressão de video:
- Remoção de redundância espacial - codificação intraquadros (ex: JPEG)
- Remoção de redundância espacial e temporal - codificação intraquadros e interquadros (H.261, MPEG)
Remoção de redundância temporal: iniciando com um intraquadro (quadro I), quadros sucessivos contém atualizações relativas a quadros anteriores (quadros P) ou a quadros anteriores e posteriores (quadros B). O conjunto de quadros entre quadros I se chama GOP (Group of Pictures):
Exemplos de codecs de video
- MPEG-2
- H-264
- XVID
- Theora
Atividade
1) Copie este video para seu computador. Visualize-o com mplayer ou vlc, observando sua qualidade de imagem. Veja também o tamanho desse arquivo de video, que está codificado com MJPG.
2) Codifique esse video para outros formatos de compressão:
- MPEG-2: mencoder -o sr-mpeg2.mpg -of mpeg -ovc lavc -lavcopts vcodec=mpeg2video:vbitrate=250 -oac copy sr.mjpg
- XVID: mencoder -o sr-xvid.avi -ovc xvid -xvidencopts bitrate=250 -oac copy sr.mjpg
- H-264:
mencoder -o sr-h264.mp4 -ovc x264 -x264encopts pass=1:turbo -oac mp3lame sr.mjpg
mencoder -o sr-h264.mp4 -ovc x264 -x264encopts bitrate=250:pass=2 -oac mp3lame sr.mjpg - Theora:
mencoder -o sr-theora.mp4 -of mpeg -ovc lavc -lavcopts vcodec=libtheora:vpass=1:turbo -oac mp3lame sr.mjpg
mencoder -o sr-theora.mp4 -of mpeg -ovc lavc -lavcopts vcodec=libtheora:vpass=2 -oac mp3lame sr.mjpg
3) Compare os tamanhos dos arquivos de video resultantes das codificações. Toque-os e veja se há diferença de qualidade de imagem entre eles.
TAREFA: mecanismos de distribuição de midia
Faça uma breve descrição de um mecanismo de distribuição de midia, que pode estar armazenada ou ser ao vivo. Explique como os dados são codificados, que protocolos são usados e que mensagens são trocadas para que o acesso a midia se realize. Inclua diagramas para ajudar a explicar seu funcionamento, e forneça exemplos de sua aplicação.
Algumas sugestões de mecanismos:
- HTTP Live streaming
- HTTP Pseudo-streaming
- HTTP Dynamic-streaming
- RTSP streaming
- P2P streaming
- ... outros ?
IMPORTANTE: Na próxima aula (07/03) sortearei dois alunos para que apresentem seus trabalhos. Se fizerem uma boa apresentação ficarão com crédito (que poderá melhorar seu conceito final). Se não apresentarem ou não trouxerem um bom material, ficarão com um ponto negativo (i.e. conceito final pode ser arredondado pra baixo).
07/03: Caracterização de midias
Compressão de audio
Técnicas usadas:
- Remoção de silêncio
- Uso de psicoacústica
- Remoção de redundância
Exemplo de codificação:
Atividade
1) Copie este arquivo de audio para seu computador. Escute-o e confira sua qualidade sonora. Veja também o tamanho do arquivo.
2) Codifique esse arquivo com os seguintes codecs:
- PCM: time mplayer -vc dummy -vo null -af format=s8,resample=8000:0:0,channels=1,volume=0 -ao pcm:waveheader:file="musica2.wav" musica.wav
- MP3: time lame musica.wav musica.mp3
- Ogg: time oggenc -o musica.ogg musica.wav
- Flac: time flac musica.wav -o musica.flac
- Speex: time speexenc --bitrate 8 musica.wav musica.spx
3) Toque os arquivos de audio codificados, comparando suas qualidades sonoras. Compare também os tamanhos dos arquivos.
Transmissão de dados multimidia
- Atrasos devido a transmissão
- O tráfego de midia pode variar o uso de banda dependendo da codificação:
Estratégias para tratar a variação de atraso
Mecanismos para compensar atraso e variação de atraso da rede:
- Numerar cada mensagem com um número de sequência.
- Registrar o instante em que cada mensagem foi gerada (i.e. registrar seu timestamp).
- Atrasar a reprodução do conteúdo no receptor, para compensar variações de atraso.
Esses mecanismos são combinados nas seguintes estratégias para compensar variação de atraso:
Atraso de reprodução fixo
Compensa atrasos de mensagens com a imposição de um atraso fixo q no reprodutor de midia. Mensagens recebidas após seu instante de reprodução (i.e. chegam após timestamp + q) são descartados.
Atraso de reprodução: midia será tocada somente no instante , sendo que . O atraso q corresponde ao atraso de reprodução imposto do lado do cliente, para compensar variações de atraso das mensagens.
Por exemplo, uma sequência de mensagens pode ser reproduzida da seguinte forma se for imposto um atraso fixo:
Atraso de reprodução adaptativo
Procura minimizar o atraso de reprodução, estimando o atraso da rede e sua variação. O atraso de reprodução assim calculado é imposto no receptor antes de cada rajada de mensagens (isso faz mais sentido em transmissão de voz).
Por exemplo, uma sequência de mensagens pode ser reproduzida da seguinte forma se for imposto um atraso adaptativo:
Se uma determinada mensagem se atrasar além do tolerável, será descartada (não reproduzida):
Atividade
Quais devem ser o atraso e variação de atraso do streaming de video que fizemos na aula de 29/02 ? Poderíamos estimar essas características de transmissão para o video que estava em um servidor dentro do IF-SC São José, e para aquele outro que estava em um computador fora da escola.
- Qual deveria ser o atraso de reprodução mínimo, em cada caso, para que o video pudesse ser reproduzido sem perdas ?
- Qual seria o valor desse atraso mínimo, se fosse calculado segundo o procedimento para determinar o atraso de reprodução adaptativo ?
Estratégias para abrandar a perda de mensagens
Reprodução de mensagens perdidas inadequada para aplicações interativas
- Mensagens que realmente não chegaram
- Mensagens que chegaram após instante de reprodução
Técnicas para abrandar a perda de mensagens e preservar uma boa (?!) qualidade de áudio
- Correção antecipada de erros (FEC - Forward Error Correction)
- Intercalação
Correção antecipada de erros
Emissor envia dados redundantes em suas mensagens, também conhecidos como um código de correção de erro.
Exemplo 1: envio de uma mensagem redundante para cada grupo de n mensagens. A mensagem redundante é calculada fazendo XOR das demais mensagens do grupo.
- Tolera a perda de 1 mensagem
- Aumento de banda de 1/n
Uso de mensagem redundante com XOR
Exemplo 2: envio de fluxos redundantes de diferentes qualidades.
- Pode-se enviar um fluxo de qualidade inferior junto com o fluxo principal.
Intercalação
Consiste no resequenciamento das unidades de áudio antes de transmiti-las, de forma que unidades que estavam originalmente próximas sejam separadas por uma certa distância no fluxo a ser transmitido.
No exemplo abaixo, cada unidade de áudio tem 5 ms, e cada mensagem contém quatro unidades (totalizando 20 ms).
Exercícios
Resolver os exercícios contidos no final das transparências.
08/03: Introdução à qualidade de serviço (Qos)
Como medir a qualidade de serviço de uma rede ?
- Disponibilidade ?
- Largura de banda
- Latência (atraso fim-a-fim)
- Variação de atraso (jitter)
- Perda de pacotes
Um comparativo de requisitos de QoS de algumas aplicações
Sumário:
- Classes de serviços
- Escalonamento de filas: FIFO, Prioridades, Round-robin, WFQ
- Condicionamento de tráfego: balde furado, balde furado com fichas
Uma pequena experiência
Nessa experiência, todos vão realizar um download simultâneo de um grande arquivo. Enquanto isso, um dos alunos vai visualizar um video via streaming.
- Para fazer o download: execute wget http://tele.sj.ifsc.edu.br/~msobral/ubuntu.iso
- Para ver o video: execute vlc http://172.18.200.251/~msobral/video.mkv
- Qual a taxa de download que foi obtida ?
- Como se desempenhou a reprodução do video ?
A reprodução do video poderia ser preservada se a rede priorizasse seu tráfego. Assim, uma forma de priorização será definida no gateway do laboratório. Após essa modificação, repitam os downloads do arquivo e reprodução do video.
- Qual a nova taxa de download obtida ?
- Como se desempenhou a reprodução do video desta vez ?
TAREFA: leitura de um texto
Leiam este texto sobre um problema relacionado aos atrasos de transmissão percebidos na Internet:
Na aula de 4a feira (14/03) sortearei um aluno para explicar o conteúdo desse artigo.
Bom fim de semana !
14/03: Simulação com Opnet
Hoje serão feitos experimentos com o simulador de redes Opnet. Esses experimentos mostrarão os descartes de pacotes, além de atrasos de entrega e variação de atraso, para diferentes disciplinas de enfileiramento nos roteadores.
15/03: Simulação com Opnet
Continuação da aula anterior.
Obs: deve-se usar o Crossover para rodar o simulador no Ubuntu 10.04. Para facilitar iniciar o simulador, salve este script na sua área de trabalho. Use-o para excutar o simulador.
Os modelos de simulação criados na aula passada (pasta op_models) devem ser restaurados em:
.cxoffice/Unsupported/drive_c/windows/temp/op_models
TAREFA: leitura da semana ...
Leiam este textos:
As regras são as mesmas: dois alunos serão sorteados para apresentarem explanações sobre esses textos.
21/03: IntServ: Serviços Integrados na Internet
IntServ: serviços integrados para provimento de QoS fim-a-fim. Nesse modelo, fluxos de pacotes entre um transmissor e um receptor têm seus requisitos de QoS atendidos pela infraestrutura de rede. Para isso, são efetuadas reservas de recursos (largura de banda, priorização) em todos os roteadores ao longo do caminho entre transmissor e um receptor.
IntServ é introduzido pela RFC 1633.
Elementos da arquitetura IntServ:
- Especificação de fluxo: define as características de um fluxo e os recursos que ele precisa da rede:
- TSpec (Traffic Specification): especificação de características de um fluxo (gerada pelo transmissor): TokenBucketRate, TokeBucketSize, PeakRate, MinimumPolicedUnit, MaximumPacketSize
- RSpec (Reservation Specification): especificação de características de uma reserva de recursos (gerada pelo receptor). Contém os mesmos parâmetros que TSpec, além de uma classe de serviço (garantida, carga controlada ou melhor-esforço) e um filtro que descreve o fluxo (endereços IP dos pares, ports TCP ou UDP).
- RSVP (Resource Reservation Protocol): protocolo de sinalização para negociar reservas de recursos ao longo do caminho a ser usado pelo fluxo.
A sinalização RSVP ocorre em duas etapas:
- O transmissor do fluxo envia mensagens PATH para o receptor. Essas mensagens contém a descrição do fluxo (TSpec).
- Se aceitar a especificação de fluxo contida na mensagem PATH, o receptor responde com uma mensagem RESV. Essa mensagem especifica a reserva a ser feita ao longo do caminho entre transmissor e receptor (i.e. contém um RSpec) . Cada roteador ao longo do caminho testa se a reserva pode ser satisfeita, e em caso afirmativo propaga a mensagem RESV ao próximo roteador.
Obs: o pedido de reserva feito pelo transmissor (mensagens PATH) deve ocorrer periodicamente. Caso os roteadores ou o receptor fiquem um certo tempo sem receber uma mensagem PATH, as reservas correspondentes são canceladas.
Obs 2: fluxos são unidirecionais, portanto as reservas são feitas também de forma unidirecional.
Segundo um artigo da Cisco, IntServ possui como pontos fortes:
- Um tipo de serviço garantido que limita o atraso fim-a-fim e proporciona uma largura de banda para o tráfego que se adequade às especificações da reserva de recursos.
- Um tipo de serviço de carga controlada, o qual provê um desempenho superior a melhor esforço, além de um atraso fim-a-fim baixo sob cargas leves ou moderadas na rede.
- Possibilidade de proporcionar a qualidade de serviço pedida para cada fluxo na rede, contanto que tenha sido sinalizado usando RSVP e existam recursos disponíveis.
... mas tem também pontos fracos:
- Cada equipamento ao longo do caminho de um pacote, incluindo os sistemas finais (ex: PCs e servidores), precisam entender e usar RSVP e serem capazes de sinalizar a QoS pedida.
- Reservas de recursos em cada equipamento ao longo do caminho são "brandas", o que significa que precisam ser renovadas periodicamente. Com isso, há um tráfego de sinalização adicional que contribui para o aumento da carga na rede, o qual aumenta a chance de que a reserva expire se os pacotes de renovação forem perdidos.
- A manutenção de estados sobre as reservas de reccursos em cada roteador, combinada com controle de admissão e uma maior quantidade de memória necessária para suportar um grande número de reservas, aumenta a complexidade de cada nó da rede ao longo do caminho.
- Como informação sobre estados para cada reserva precisa ser mantida em todos os roteadores ao longo do caminho, torna-se um desafio manter centenas de milhares de fluxos que passem pelo núcleo da rede.
Atividade
Para visualizar o efeito de usar IntServ, iremos utilizar o simulador Opnet.
- Execute o simulador e abra o modelo RSVP.
- Leia a descrição do modelo, que explica o que ele pretende mostrar.
- No menu Scenarios->Switch scenario selecione configuration. Em seguida, execute o modelo.
- Selecione o menu Results-Compare results para visualizar os resultados, observando os atrasos fim-a-fim nos sistemas finais e nos roteadores.
- Veja os atributos relativos ao RSVP nos sistemas finais e nos roteadores. Veja também no perfil da aplicação (abra o pop-up menu de Application Definition e selecione Edit Attributes->Application Definitions->VoIP RSVP used->Description). Além disso, observe as especificações de fluxos RSVP contidas em Qos Attribute Config: abra o pop-up menu, selecione Edit Attributes e visualize RSVP Flow Specification->row 0.
- O que acontece se for modificada a especificação de fluxo RSVP ? Experimente aumentar a largura de banda (TokenBucketRate) ou tolerância a rajada (TokenBucketSize). Isso pode ser feito em Qos Attribute Config: abra o pop-up menu, selecione Edit Attributes e visualize RSVP Flow Specification->row 0.
- Execute o modelo com a nova especificação de fluxo.
- Visualize os resultados. O que mudou em relação à primeira execução ?
- Qual o efeito de haver um roteador sem suporte a RSVP no meio do caminho ?
- Duplique o cenário, salvando-o com o nome RSVP 2.
- Adicione um roteador entre Router 1 e Router 2. Conecte-o a esses outros roteadores com links PP DS0.
- Refaça a simulação, e observe os resultados. O que mudou em relação ao atraso fim-a-fim ?
- Ainda sobre o roteador sem RSVP que foi adicionado, faça a seguinte modificação:
- Conecte o computador client_no_RSVP ao novo roteador (e desconecte-o de Router 1). Use um link PP DS0'.
- Execute a simulação.
- Visualize os resultados. O que mudou em relação à simulação anterior (e em relação à primeira simulação) ? Observe especialmente o atraso fim-a-fim.
O modelo RSVP com mais um roteador.
22/03: DiffServ: Serviços Diferenciados na Internet
Modelo para provimento de QoS para Internet, em que fluxos são classificados e então tratados de forma diferenciada dentro da rede. A proposta, contida na RFC 2475, visa definir um modelo flexível e escalável para atendimento de requisitos de QoS.
- Flexibilidade: o tratamento de cada classe de tráfego é uma decisão da gerência da rede, e assim não é especificada na proposta.
- Escalabilidade: a priorização e condicionamento de tráfego a serem feitos nos roteadores se basearão nas classes de tráfego, e não nos fluxos individuais que passam pela rede (compare com IntServ). Isso proporciona a agregação dos fluxos, que são rotulados com as classes de serviço, facilitando a tarefa dos roteadores no núcleo da rede.
Obs: as figuras abaixo foram obtidas em um artigo da Cisco
Uma visão geral da arquitetura DiffServ pode ser vista na figura abaixo:
Diversos elementos compõem a arquitetura:
- Domínios DiffServ: conjuntos de roteadores onde se aplicam uma determinada classificação e diferenciação de tráfego, definidas pela gerência da rede.
- Roteadores de borda: roteadores que classificam fluxos que entram num domínio DiffServ. Essa tarefa de classificação e condicionamento de fluxos de entrada pode ser complexa. Por esses roteadores também passam fluxos que saem do domínio, para serem entregues a sistemas finais.
- Roteadores de núcleo: roteadores internos de um domínio DiffServ, que encaminham fluxos já classificados. Esses roteadores verificam a conformidade desses fluxos às regras definidas pela gerência da rede para as classes de serviço. Assim, pacotes desses fluxos estão sujeitos a priorizações, enfileiramentos, e mesmo descartes, dependendo das restrições de QoS que foram definidas. Essas regras compõem o que se chama de Comportamento por Salto (PHB - Per-Hop Behaviour), representada no diagrama contido na figura abaixo.
A classificação feita nos roteadores de borda mapeia características dos fluxos para um número de 6 bits. Assim, podem haver até 64 classes de serviço em um domínio DiffServ. Esse número, chamado de DSCP - DiffServ Code Point, é inscrito no campo ToS dos datagramas IPv4 (ou no campo Traffic Class de datagramas IPv6), como mostrado abaixo:
Os comportamentos por salto podem ser:
- Default PHB: pacotes com DSCP de valor 000000 (zero) são tratados com melhor esforço. Isso também deve ser aplicado para pacotes cujos DSCP tenham valores não reconhecidos pelo roteador. Ver maiores detalhes na RFC 2474.
- Class-selector PHB: pacotes com DSCP xxx000 são tratados de acordo com uma política tradicional de precedência IP (i.e. classes de tráfego descritas no campo ToS). Também descrito na RFC 2474
- Expedited Forwarding PHB (EF): semelhante ao serviço garantido do IntServ. Desenhado para prover um serviço com baixas taxas de perda, baixa latência e jitter, e uma largura de banda garantida. Deve ser usado somente por aplicações críticas. O valor do DSCP deve ser 10110 (ver RFC 2598
- Assured Forwarding PHB (AF): semelhante ao serviço de carga controlada do IntServ. Define quatro classes de serviço, sendo que cada uma tem três níveis de precedência de descarte.
Classes de serviço e precedências de descarte em AF PHB
Atividade
- Vamos fazer a marcação de pacotes que entram na rede do laboratório, de forma que:
- Pacotes vindos de servidores da escola devem ter DSCP corresponde à classe AF41.
- Pacotes vindos de fora da escola devem ter DSCP AF31.
iptables -t mangle -I PREROUTING 1 -i eth1 -j DSCP --set-dscp-class af31 iptables -t mangle -A PREROUTING -i eth1 -s 172.18.0.0/16 -j DSCP \ --set-dscp-class af41 iptables -t mangle -A PREROUTING -i eth1 -s 200.135.37.64/26 -j DSCP \ --set-dscp-class af41
- Execute o wireshark em seu computador, e observe o valor do DSCP. Ele realmente varia dependendo da origem do pacote ?
- O que poderia ser feito para usar esse valor para prover QoS na rede do laboratório ?
TAREFA: RSVP-TE
Leia este artigo da Cisco sobre engenharia de tráfego em redes MPLS. Em particular, estude a seção que trata de RSVP-TE, uma versão do protocolo RSVP adaptada para o uso em MPLS.
28/03: Laboratório: roteador Linux
Nesta 2a parte da disciplina pretende-se implantar uma rede com suporte a QoS. Para isso deve-se seguir o modelo Diffserv, usando-se roteadores Linux como roteadores de borda e núcleo - i.e. como classificadores e condicionadores de tráfego. No entanto, essa plataforma possui diversas peculiaridades quanto aos mecanismos a serem usados para implantar Diffserv. Para que todos se familiarizem com esses mecanismos e entendam como utilizá-los, além de eles serem apresentados em aula serão feitos exercícios para ilustrá-los.
Nesta aula será feita uma revisão sobre roteadores Linux. Boa parte do que será visto não deve ser novidade para quem fez Redes 3, mas sempre há algum detalhe novo. Serão mostrados comandos e utilitários necessários para configurar interfaces de rede e rotas. Além disso, serão apresentados alguns utilitários para mostrar informações sobre o tráfego nas interfaces de rede, ou para descobrir a capacidade da rede entre dois nós. As atividades a serem desenvolvidas devem fornecer a base para a implantação de mecanismos de Qos nas próximas aulas.
29/03: Laboratório sobre roteador Linux
... continuação.
04/04: Firewall
Uma introdução ao iptables
O filtro IP do Linux se chama NetFilter, e suas regras são configuradas por meio do utilitário iptables (ver também seu manual). Com iptables se podem adicionar ou remover regras do Netfilter, além de consultar estatísticas sobre essas regras (ex: contadores dos pacotes e bytes que selecionaram cada regra). As regras são agrupadas em conjuntos denominados chains ("cadeias"), as quais estão relacionadas com o contexto que cada pacote está sendo analisado. Existem três chains predefinidas:
- INPUT: contém as regras a serem aplicadas aos pacotes destinados ao próprio firewall.
- OUTPUT: contém as regras a serem aplicadas aos pacotes transmitidos pelo próprio firewall.
- FORWARD: contém as regras a serem aplicadas aos pacotes em trânsito pelo firewall (isto é, pacotes recebidos de uma interface e sendo encaminhados através de outra interface).
Assim, usando-se o iptables podem ser adicionadas regras a cada uma dessas chains, dependendo do policiamento de tráfego a ser implantado no firewall.
Uma regra deve especificar basicamente três coisas:
- Chain: em que chain deve ser adicionada.
- Seletor: informações a serem usadas para selecionar os pacotes a que ela deve ser aplicada.
- Alvo (target): ação a ser executada sobre o pacote que ativar a regra.
Por exemplo, a regra abaixo permite o encaminhamento de todos os segmentos TCP destinados a porta 80:
Desta forma, a escrita das regras depende de conhecer as opções para definição de seletores, e os possíveis alvos. Algumas opções de uso comum para composição de seletores são listadas abaixo, sendo que o que está entre colchetes ([]) é opcional. Um seletor pode ser composto por uma combinação dessas opções. Para mais detalhes leia o manual.
Opção | Descrição | Exemplo |
---|---|---|
-s IP[/Mascara] | endereço IP de origem | -s 200.135.37.64/26 |
-d IP[/Mascara] | endereço IP de destino | -d 8.8.8.8 |
-p Protocolo | protocolo de transporte (tcp ou udp) | -p tcp |
--dport numero | Port de destino | --dport 80 |
--sport numero | Port de origem | --sport 53 |
--syn | Se flag SYN está acesa (somente TCP) | |
--tcp-flags Flags1 Flags2 | Se somente as flags listadas em Flags1 estão acesas dentre as Flags2 | --tcp-flags SYN,ACK,RST,FIN SYN |
-i interface | Se pacote foi recebido pela interface | -i eth0 |
-o interface | Se pacote vai sair pela interface | -o eth1 |
-m state --state ESTADO | Identifica o estado do fluxo, o qual pode ser: NEW: início de um fluxo ESTABLISHED: parte de um fluxo estabelecido RELATED: inicia um novo fluxo, porém relacionado com um fluxo existente |
-m state --state NEW,RELATED |
Os alvos definem o que fazer com um pacote selecionado por uma regra. As ações possíveis estão listadas abaixo:
Alvo | Descrição | Exemplo |
---|---|---|
ACCEPT | aceita o pacote | -j ACCEPT |
DROP | descarta o pacocte | -j DROP |
REJECT | rejeita o pacote, devolvendo um código de erro ICMP para seu remetente | -j REJECT |
LOG | registra o pacote no log do sistema | -j LOG |
uma_chain | passa o pacote para ser processado pela chain uma_chain | -j rede_interna |
Salvando e restaurando regras do iptables
Uma vez obtido um conjunto de regras que funcione como desejado, deve-se poder salvá-lo para que possa ser reativado sempre que desejado (ex: no boot). Existem dois utilitários que auxiliam nessa tarefa, sendo eles:
- iptables-save: escreve as regras atuais na saída padrão, que normalmente é redirecionada para um arquivo:
iptables-save > minhas_regras
- iptables-restore: instala as regras lidas da entrada padrão, normalmente redirecionada de um arquivo:
iptables-restore < minhas_regras
Atividade
Cada aluno deve implantar a seguinte rede virtual em seu computador:
O firewall e o Pc devem ser máquinas virtuais. Você pode usar o Virtualbox ou o Netkit. Se optar pelo segundo, use a seguinte configuração de rede (grave-a em um arquivo chamado Lab.conf):
# Obs: substitua X pelo número do seu computador
pc[type]=generic
firewall[type]=gateway
pc[eth0]=link:ip=10.1.X.1/24
firewall[eth1]=link:ip=10.1.X.254/24
firewall[eth0]=uplink:bridge=eth0:ip=192.168.2.100+X/24
pc[default_gateway]=10.1.X.254
firewall[default_gateway]=192.168.2.1
No caso do Netkit, execute o programa gnome-netkit para executar a rede virtual. Selecione o menu File->Load and run e carregue o arquivo Lab.conf.
Se for usado o Virtualbox, use a máquina virtual Rmu-server para ser o firewall, e Rmu-cliente para ser o Pc. Inicie-as, certificando-se de que suas interfaces de rede estejam em modo bridge. Configure os endereços IP de suas interfaces e também suas rotas default.
Cenário 1: Uma rede pequena sem servidores
Em uma rede pequena e que não oferece serviços, todos os fluxos se originam internamente. Assim, o firewall deve impor que somente fluxos internos possam passar. Com base nisso, configure seu firewall das seguintes formas:
- Caso 1: os computadores internos podem acessar qualquer serviço externo.
- Com filtro stateless:
# As regras são inseridas na chain FORWARD, pois tratam de pacotes em trânsito pelo firewall # Libera todos pacotes TCP que entrarem pela interface eth1 iptables -A FORWARD -i eth1 -p tcp -j ACCEPT # Libera pacotes UDP destinados a porta 53 (DNS), contanto que tenham entrado pela interface eth1 iptables -A FORWARD -i eth1 -p udp --dport 53 -j ACCEPT # Libera pacotes UDP com port de origem 53 (resposta do DNS), contanto que tenham entrado pela interface eth0 iptables -A FORWARD -i eth0 -p udp --sport 53 -j ACCEPT # Libera segmentos TCP vindos pela interface eth0 e que tenham as flags SYN e ACK acesas (respsta de pedido de conexão TCP) iptables -A FORWARD -i eth0 -p tcp --tcp-flags SYN,ACK SYN,ACK -j ACCEPT # Libera segmentos TCP vindos pela interface eth0 e que não tenham a flags SYN acesa (pertencem a cconexões estabelecidas) iptables -A FORWARD -i eth0 -p tcp ! --syn -j ACCEPT # Descarta segmentos TCP vindos de fora iptables -A FORWARD -i eth0 -p tcp -j DROP
- Com filtro stateful:
# As regras são inseridas na chain FORWARD, pois tratam de pacotes em trânsito pelo firewall # Libera todos pacotes de fluxos estabelecidos iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT # Libera pacotes UDP destinados a porta 53 (DNS), contanto que tenham entrado pela interface eth1 iptables -A FORWARD -i eth1 -p udp --dport 53 -m state --state NEW -j ACCEPT # Libera pacotes que iniciem novos fluxos, originados na rede interna (interface eth1) iptables -A FORWARD -i eth1 -m state --state NEW,RELATED -j ACCEPT # Descarta demais pacotes iptables -A FORWARD -j DROP
- Com filtro stateless:
- Caso 2: os computadores internos podem acessar somente serviços Web e DNS.
# As regras são inseridas na chain FORWARD, pois tratam de pacotes em trânsito pelo firewall # Libera todos pacotes de fluxos estabelecidos iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT # Libera datagramas UDP destinados a porta 53 (DNS), contanto que tenham se originado na rede interna iptables -A FORWARD -i eth1 -p udp --dport 53 -m state --state NEW -j ACCEPT # Libera segmentos TCP destinados as portas 80 (HTTP) e 443 (HTTPS), contanto que tenham se originado na rede interna iptables -A FORWARD -i eth1 -p tcp --dport 80 -m state --state NEW -j ACCEPT iptables -A FORWARD -i eth1 -p tcp --dport 443 -m state --state NEW -j ACCEPT # Descarta demais pacotes iptables -A FORWARD -j DROP
- Versão alternativa, usando o módulo multiport:
# As regras são inseridas na chain FORWARD, pois tratam de pacotes em trânsito pelo firewall # Libera todos pacotes de fluxos estabelecidos iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT # Libera datagramas UDP destinados a porta 53 (DNS), contanto que tenham se originado na rede interna iptables -A FORWARD -i eth1 -p udp --dport 53 -m state --state NEW -j ACCEPT # Libera segmentos TCP destinados as portas 80 (HTTP) e 443 (HTTPS), contanto que tenham se originado na rede interna iptables -A FORWARD -i eth1 -p tcp -m multiport --dports 80,443 -m state --state NEW -j ACCEPT # Descarta demais pacotes iptables -A FORWARD -j DROP
- Versão alternativa, usando o módulo multiport:
05/04: Firewall
... continuação da aula anterior: Caso 2 do cenário 1 em diante.
TAREFA: leitura da semana
Leia o seguinte texto sobre SLA (Service Level Agreement) e Diffserv, e se prepare para discutir seu conteúdo na aula de 12/04 (5a feira).
11/04: Firewall
- Projetos de firewalls (ver transparências)
- Estratégias de implantação de firewalls
- Perímetro de segurança
- Tradução de endereços (NAT)
Dicas para NAT
- Fazendo NAT de todo o tráfego que sai pela interface eth0:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
- Fazendo NAT estático, de forma a associar um determinado IP externo a um IP interno (obs: eth0 é a interface externa):
iptables -t nat -A POSTROUTING -o eth0 -s IP_interno -j SNAT --to-source IP_externo
- Redirecionando um pacote para outro IP e/ou port:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2200 -j DNAT --to-destination IP_interno:22
Ativando e desativando as regras do filtro IP (iptables)
O seguinte script, que deve ser salvo com o nome firewall.sh, pode ser usado para ativar e desativar as regras do filtro IP:
#!/bin/bash
# Variaveis
DEV_LAN=eth0
DEV_WAN=eth1
fw_start(){
# Adicionando regras
iptables -A INPUT -i $DEV_LAN -j ACCEPT
}
fw_stop(){
# Limpando as regras
iptables -P INPUT ACCEPT
iptables -t filter -F
}
fw_uso(){
# Mensagem de ajuda
echo "Sintaxe errada..."
echo "./$0 (start|stop)"
}
case $1 in
start)
fw_start
;;
stop)
fw_stop
;;
*)
fw_uso
;;
esac
- Iniciando o firewall:
./firewall.sh start
- Parando o firewall:
./firewall.sh stop
- Obtendo informações sobre seu uso:
./firewall.sh
Atividade 1: firewall/roteador para rede doméstica
Uma pequena rede possui um firewall com algumas regras básicas para protegê-la do mundo externo:
- Política padrão: negar tudo (entrada e roteamento)
- Usuários da rede local só podem navegar na web, acessar email (POP3, IMAP, SMTP)
- Firewall pode ser administrado remotamente via SSH, não importando a origem da conexão.
- Para dificultar ataques por varredura de portas, o servidor SSH deve atender conexões em uma porta diferente da 22.
- Registrar todas conexões oriundas da rede externa
Atividade 2: serviço SMTP rodando em rede com NAT
- Política padrão: negar tudo (entrada e roteamento)
- Permitir pings a uma taxa máxima de 10 pacotes por minuto
- Tráfego destinado à porta 25 deve ser encaminhado para a porta 25 do computador M1 da rede local
- Isso se destina impedir que máquinas da rede local gerem SPAM através de conexões diretas a servidores SMTP externos
- Tanto o firewall quanto a máquina M1 podem ser administradas remotamente via SSH.
Obs: para monitorar quantos pacotes estão casando com as regras:
watch iptables -t filter -L -v
Obs: para limitar a taxa de pacotes deve-se usar o módulo limit (ver maiores detalhes no manual). Por exemplo:
# limita as cconexões ao servidor web: no máximo 2 por segundo
iptables -A FORWARD -p tcp -m limit -m multiport -m state -d IP_servidor_web --dports 80,443
--state NEW --limit-rate 2/second -j ACCEPT
Exemplo de regras |
---|
#!/bin/bash
# Variaveis
DEV_LAN=eth1
DEV_WAN=eth0
SMTP_SERVER=192.168.2.1
PC=10.1.1.1
fw_start(){
# Adicionando regras
iptables -P INPUT DROP
iptables -P FORWARD DROP
# Libera fluxos estabelecidos
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $DEV_LAN -p icmp -m limit --limit 10/min -j ACCEPT
iptables -A FORWARD -i $DEV_LAN -m state --state NEW,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i $DEV_WAN -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -i $DEV_LAN -p tcp --dport 3128 -m state --state NEW -j ACCEPT
iptables -A INPUT -i $DEV_LAN -p tcp --dport 22 -m state --state NEW -j ACCEPT
#NAT
iptables -t nat -A POSTROUTING -o $DEV_WAN -j MASQUERADE
iptables -t nat -A PREROUTING -i $DEV_LAN -p tcp --dport 25 -j DNAT --to-destination $SMTP_SERVER
iptables -t nat -A PREROUTING -i $DEV_WAN -p tcp --dport 2200 -j DNAT --to-destination ${PC}:22
}
fw_stop(){
# Limpando as regras
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t filter -F
iptables -t nat -F
}
fw_uso(){
# Mensagem de ajuda
echo "Sintaxe errada..."
echo "./$0 (start|stop)"
}
case $1 in
start)
fw_start
;;
stop)
fw_stop
;;
*)
fw_uso
;;
esac
|
12/04: Lista de exercícios: Firewall
Nesta aula a turma se organizará em grupos, que devem resolver o seguinte problema:
A rede acima é composta de dois segmentos, ambos implantados com subredes IP com endereços não roteáveis:
- DMZ: contém servidores que podem sere acessados a partir da rede externa.
- Rede interna: contém computadores que não podem ser acessados de fora.
Crie as regras do filtro IP no firewall para que os serviços indicados nos servidores da DMZ possam ser acessados de fora. Essas regras devem também permitir o acesso irrestrito dos computadores da rede interna à Internet (ex: o Pc). Os servidores da DMZ, por sua vez, não podem iniciar conexões - seja para a rede interna ou externa. Além disso, o firewall deve poder ser administrado remotamente via SSH. Por fim, devem ser registrados todos os inícios de conexões e todos os pacotes recusados.
Obs: quem quiser fazer o exercício com o Netkit pode usar o seguinte modelo para a rede:
global[compact]=1
dmz1[type]=generic
dmz2[type]=generic
pc[type]=generic
firewall[type]=gateway
# Um computador pode ser usado para representar a Internet (!?!)
internet[type]=generic
dmz1[eth0]=dmz:ip=10.0.0.1/24
dmz2[eth0]=dmz:ip=10.0.0.2/24
firewall[eth1]=dmz:ip=10.0.0.254/24
pc[eth0]=lan-interna:ip=192.168.0.1/24
firewall[eth2]=lan-interna:ip=192.168.0.254/24
firewall[eth0]=link-internet:ip=172.18.0.100/16
# A "Internet" tem só o IP 172.18.0.1 ;-)
internet[eth0]=link-internet:ip=172.18.0.1/16
dmz1[default_gateway]=10.0.0.254
dmz2[default_gateway]=10.0.0.254
pc[default_gateway]=192.168.0.254
# Se o script firewall.sh ficar em /root, ele pode ser preservado para poder ser usado
# em proximas execucoes da rede virtual. Porém para isso deve-se exportar
firewall[preserve]=/root/firewall.sh
Documento a ser entregue
Apresentar um shell script (comentado) com as funções start, stop, restart e uso com as devidas regras para implementação do firewall e roteador. Faça uso de variáveis para os endereços IP, endereços de rede, interfaces de rede, etc. visando assim tornar o script mais genérico.
Lista de exercícios
Resolver os exercícios e problemas propostos no capítulo 7 do livro Redes de Computadores e a Internet, 5a edição, de James Kurose. Em particular, resolver:
- Exercícios de fixação: todos
- Problemas: 1, 3, 4, 5, 7, 9, 10, 11, 20, 21, 22, 23, 24, 25, 26, 27, 28
18/04: Lista de exercícios sobre firewall (continuação)
Concluir a resolução da lista.
Estendendo as regras do firewall
Na rede do exercício sobre firewall, algumas novas regras de policiamento de tráfego devem ser implantadas:
- DMZ:
- O servidor SMTP deve poder enviar mensagens para fora.
- O servidor WWW pode ser acessado via FTP. As portas a serem usadas no modo passivo vão de 30000 a 30200.
- Rede interna:
- Acesso a web deve ser feito obrigatoriamente por meio de um proxy que roda no firewall. Esse proxy atende na porta TCP 3128.
- Envio de email somente pode ser feito por meio do servidor SMTP que está na DMZ.
- Programas de chat devem ser bloqueados (ex: MSN, Jabber, Skype).
19/04: QoS em um roteador Linux
- Transparências
- Um bom tutorial sobre disciplinas de filas no Linux
- Linux Advanced Routing and Traffic Control Howto: quase tudo sobre disciplinas de filas (e mais outras coisas).
Disciplinas de filas (qdisc)
Disciplinas de filas são mecanismos para condicionar a saída de pacotes por uma interface de rede. Com elas se podem priorizar pacotes e limitar taxas de bits de fluxos de saída.
Visão geral do enfileiramento de pacotes em uma interface de saída
As filas contidas nas qdisc podem ser tratadas de diferentes formas. Isso vai determinar a ordem e o ritmo com que os pacotes são desenfileirados para serem transmitidos. Alguns exemplos de qdisc implementadas no Linux:
- FIFO: pacotes saem por ordem de chegada.
- PRIO: pacotes saem de acordo com prioridades.
- SFQ (Stochastic Fair Queueing): pacotes saem de forma que os fluxos a que pertencem recebam aproximadamente a mesma taxa de bits.
- TBF (Token Bucket Filter): pacotes saem limitados a uma certa taxa de bits.
- ... e outras (ver Differentiated Service on Linux HOWTO e Linux Advanced Routing and Traffic Control Howto)
Os diagramas abaixo ilustram algumas dessas qdisc:
Uma disciplina de filas baseada em prioridades. Fonte: Differentiated Service on Linux HOWTO
A qdisc TBF (combinada com PRIO), usada para limitar a taxa de saída. Fonte: Differentiated Service on Linux HOWTO
A qdisc DSMARK, usada em uma estrutura Diffserv com Linux. Fonte: Differentiated Service on Linux HOWTO
Atividade
Para realizar os exercícios abaixo, deve-se criar uma rede composta por um roteador e um computador.
1) Em uma rede deseja-se que os fluxos de entrada (que vem de fora da rede) sejam balanceados. Isso significa que nenhum dos fluxos deve poder monopolizar o link de saída dessa rede. Usando o utilitário tc implemente esse condicionamento de tráfego no seu roteador Linux.
# Cria uma qdisc SFQ, que balanceia os fluxos estatisticamente
# OBS: assume-se que a interface de saída seja eth0
tc qdisc add dev eth0 root handle 1:0 sfq
2) Nessa mesma rede, deseja-se modificar o condicionamento de tráfego para que fluxos vindos da rede 172.18.0.0/16 sejam priorizados. Implemente essa modificação no seu roteador.
# Cria uma qdisc PRIO, que usa três filas (bandas) para priorizar fluxos.
# -- a fila mais prioritária tem handle 1:1
# -- a próxima fila tem handle 1:2
# -- a fila menos prioritária tem handle 1:3
# OBS: assume-se que a interface de saída seja eth0
tc qdisc add dev eth0 root handle 1:0 prio
# Datagramas vindos da rede 172.18.0.0/16 vão pra fila mais prioritária.
tc filter add dev eth0 parent 1: prio 1 protocol ip u32 match ip src 172.18.0.0/16 flowid 1:1
# Demais datagramas vão para a fila intermediária.
tc filter add dev eth0 parent 1: prio 2 protocol ip u32 match ip src 0.0.0.0/0 flowid 1:2
3) Configure seu roteador de forma a combinar a priorização de fluxos e o balanceamento entre eles.
# Cria uma qdisc PRIO, que usa três filas (bandas) para priorizar fluxos.
# -- a fila mais prioritária tem handle 1:1
# -- a próxima fila tem handle 1:2
# -- a fila menos prioritária tem handle 1:3
# OBS: assume-se que a interface de saída seja eth0
tc qdisc add dev eth0 root handle 1:0 prio
# Balanceia os fluxos nas duas filas da qdisc PRIO que serão usadas
tc qdisc add dev eth0 parent 1:1 handle 2:0 sfq
tc qdisc add dev eth0 parent 1:2 handle 3:0 sfq
# Datagramas vindos da rede 172.18.0.0/16 vão pra fila mais prioritária.
tc filter add dev eth0 parent 1: prio 1 protocol ip u32 match ip src 172.18.0.0/16 flowid 1:1
# Demais datagramas vão para a fila intermediária.
tc filter add dev eth0 parent 1: prio 2 protocol ip u32 match ip src 0.0.0.0/0 flowid 1:2
4) Nessa rede, decidiu-se que fluxos vindos da rede 172.18.0.0/16 devem ter garantidos para si 70 % da capacidade do link, sendo o restante usado para os demais fluxos. Além disso, os fluxos devem estar balanceados. Implemente esse condicionamento de tráfego no seu roteador.
5) A disciplina de filas WFQ, existente em roteadores Cisco e usada para garantir banda para classes de serviço, não está implementada no controle de tráfego do Linux. Com as disciplinas existentes no Linux seria possível emular a WFQ ? Caso sim, como isso poderia ser feito ?
TAREFA: leitura da semana
O texto a seguir continua a leitura desta semana, tratando da implantação de uma estrutura Diffserv na borda da rede.