<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Fernando Softov &#187; Linux</title>
	<atom:link href="http://www.softov.com.br/blog/cat/linux/feed" rel="self" type="application/rss+xml" />
	<link>http://www.softov.com.br/blog</link>
	<description>Só mais um blog do WordPress</description>
	<lastBuildDate>Tue, 28 Sep 2010 03:18:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Desenvolvimento Web na Prática &#8211; Introdução</title>
		<link>http://www.softov.com.br/blog/post/122/desenvolvimento-web-na-pratica-introducao</link>
		<comments>http://www.softov.com.br/blog/post/122/desenvolvimento-web-na-pratica-introducao#comments</comments>
		<pubDate>Wed, 21 Jul 2010 02:37:49 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Video Aulas]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=122</guid>
		<description><![CDATA[Bom galera, minha primeira esta é uma introdução das minhas Vídeo  Aulas sobre Desenvolvimento Web, espero que gostem, ainda não falei sobre nada, mas em breve teremos muito conteúdo. Estarei falando sobre o PHP (OO), framwork ZEND, a biblioteca  jquery, css, xhtml, html, xml, e outros assuntos relativos ao desenvolvimento web. Sugestões sobre assuntos, mandem [...]]]></description>
			<content:encoded><![CDATA[<p>Bom galera, minha primeira esta é uma introdução das minhas Vídeo  Aulas sobre Desenvolvimento Web, espero que gostem, ainda não falei sobre nada, mas em breve teremos  muito conteúdo.</p>
<p>Estarei falando sobre o PHP (OO), framwork ZEND, a biblioteca  jquery, css,  xhtml, html, xml, e outros assuntos relativos ao desenvolvimento web.</p>
<p>Sugestões sobre assuntos, mandem por comentários ou e-mail.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/gFsBxlQZKK0&amp;hl=pt_BR&amp;fs=1?rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/gFsBxlQZKK0&amp;hl=pt_BR&amp;fs=1?rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/122/desenvolvimento-web-na-pratica-introducao/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Controle de tráfego com TC, HTB e Iptables</title>
		<link>http://www.softov.com.br/blog/post/41/controle-de-trafego-com-tc-htb-e-iptables</link>
		<comments>http://www.softov.com.br/blog/post/41/controle-de-trafego-com-tc-htb-e-iptables#comments</comments>
		<pubDate>Tue, 25 Aug 2009 22:08:27 +0000</pubDate>
		<dc:creator>fernandosoftov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[controle de tráfego]]></category>
		<category><![CDATA[htb]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tc]]></category>

		<guid isPermaLink="false">http://www.softov.com.br/blog/?p=41</guid>
		<description><![CDATA[Estava montando um servidor de Internet via rádio e tive a necessidade de fazer o controle de tráfego dos clientes ip por ip, pois determinados usuários teriam meros 128kbps de download enquanto outros teriam 256kbps e eu como admin teria meus meros 2048kbps de download. Em termos leigos, fucei e fucei na Internet até encontra [...]]]></description>
			<content:encoded><![CDATA[<p>Estava montando um servidor de Internet via rádio e tive a necessidade de fazer o controle de tráfego dos clientes ip por ip, pois determinados usuários teriam meros 128kbps de download enquanto outros teriam 256kbps e eu como admin teria meus meros 2048kbps de download.</p>
<p>Em termos leigos, fucei e fucei na Internet até encontra o site do <a title="http://www.eriberto.pro.br" rel="nofollow" href="http://www.eriberto.pro.br/">João Eriberto Mota Filho</a>, aonde aprendi muito sobre as regras de controle de tráfego utilizando o tc, htb e iptables, então resolvi compartilhar com quem tambêm tem a necessidade de efectuar este controle.</p>
<p>Muitas pessoas confundem controle de tráfego com controle de banda.</p>
<ul>
<li> Banda (ou bandwidth):  é a diferença entre os limites superior e inferior de uma freqüência, geralmente medida em hertz.</li>
<li> Tráfego:  quantidade de informações digitais transmitidas, geralmente medida em bits por segundo (b/s).</li>
</ul>
<p>Assim, ao controlar um tráfego de rede estaremos realizando um controle de tráfego e não de banda, como muitos dizem. Para alterar as propriedades de uma banda, teremos que fazer alterações físicas no meio.</p>
<p>Agora imagine uma rede que possua Internet, com um link de 2 Mb/s, e 50 máquinas. Exemplos atuais: prédios, pequenas empresas, lan houses, faculdade (essa vai para o Biguá),  etc. Imagine ainda que nessa rede possa ser utilizado qualquer tipo de programa de acesso à Internet.</p>
<p>Numa rede liberal, programas como o EMule ou o Kazaa poderão causar um enorme congestionamento. Um único EMule instalado em um computador da rede poderá abrir dezenas de conexões simultâneas. Com isso, caso algum outro usuário, em outro computador, deseje visitar o GMail, por exemplo, teremos uma máquina, estabelecendo uma conexão, lutando contra outro computador com 60 conexões (apenas um exemplo). Teremos, em outras palavras, 01 contra 60. É óbvio que haverá uma grande desvantagem para um dos dois. Isso ocorre porque, da forma como o Kernel Linux trabalha, normalmente, os pacotes são enfileirados em um buffer e saem na mesma ordem em que chegaram (FIFO, para os mais experientes, o primeiro que entra é o primeiro que sai). Aumentar o link, ao contrário do que muitos desinformados pensam, não resolveria o caso, pois só estaríamos dando mais &#8220;poder de fogo&#8221; ao usuário do EMule e continuaríamos sendo o 60º da fila. <strong>O que fazer então?</strong></p>
<ul>
<li> Bloquear o EMule, tornando-se um administrador radical e forçando o usuário de tal programa a achar uma forma de burlar o controle (sempre há uma forma de fazer isso). Ainda, o EMule foi bloqueado mas outros programas similares não. Existem centenas deles.</li>
<li> Controlar o tráfego da rede, fazendo com que haja um equilíbrio ou uma prioridade na navegação. Esta parece ser a forma mais sensata<span id="more-41"></span></li>
</ul>
<p>Observe as seguintes idéias:</p>
<ul>
<li> Em tráfego de rede estaremos submetidos à base decimal e não à binária, como em processamento, armazenamento e memória. Assim, 1 KByte por segundo será igual a 1000 bytes por segundo.</li>
<li> A abreviatura de byte é <strong>B</strong>.</li>
<li> A abreviatura de bit é <strong>b</strong>.</li>
<li> 1 B = 8 b (um byte é composto por 8 bits).</li>
</ul>
<p>Assim, 250 Kb/s são iguais a 31,25 KB/s que são iguais a 31250 B/s.</p>
<p>Agora cheguei em uma parte interessante: Como funciona o HTB.</p>
<p>O HTB funciona de forma hierárquica e, como todas as outras disciplinas, controla os pacotes que saem de uma determinada placa de rede. Isso se deve ao fato de que, quando um pacote chega a uma máquina, ele não pode ficar parado no cabo de rede ou na onda de rádio (wireless) esperando para entrar na placa. O pacote entra e é armazenado no buffer. Assim, só resta controlar a sua saída do buffer para a rede.</p>
<p>Imagine um servidor Linux aonde temos duas placas de rede:</p>
<ul>
<li>eth0: ligada a rede interna</li>
<li>eth1: ligada a internet</li>
</ul>
<p>A interface <em>eth0</em> irá controlar todo o download da Internet e a interface <em>eth1</em> todo o upload.</p>
<p>No que tange à hierarquia, o HTB possui um elemento principal conhecido como <em>root</em>, que receberá a designação numérica <strong>1:0</strong> ou, simplesmente, <strong>1:</strong>. O <em>root</em> possui um subordinado imediato, que controla o tráfego máximo total possível. Esse subordinado é uma <em>classe</em> e receberá a designação <strong>1:1</strong>.</p>
<blockquote><p>Os elementos superiores a cada classe são conhecidos como <em>pais</em>. A indicação para isso é <em>parent</em>.</p></blockquote>
<p>A seguir um exemplo de configuração do <em>root</em> e do parent de controle total de tráfego, para a interface <em>eth0</em>, com o comando <em>tc</em>:</p>
<pre class="brush: bash;">

tc qdisc add dev eth0 root handle 1:0 htb default 40
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100mbit
</pre>
<p>A primeira linha estabelece o <em>root</em>, para a interface <em>eth0</em>, com a designação <em>1:0</em>, usando a disciplina HTB. A palavra <em>qdisc</em> é a abreviatura de <em>Queue discipline</em> ou disciplina de enfileiramento. Em resumo, refere-se à disciplina de controle de tráfego. A primeira linha também estabelece que a classe default será a <em>1:40</em>.</p>
<blockquote><p>A classe default será utilizada para receber pacotes que não foram designados para trafegar em qualquer outra classe.</p></blockquote>
<p>A segunda linha estabelece que a classe <em>1:0</em> será parent (pai) da <em>1:1</em>. Esta classe estabelece que a interface de rede <em>eth0</em> funcionará a 100 Mb/s.</p>
<p>Veja agora uma configuração do HTB já com algumas classes (dentro de um script em shell bash):</p>
<pre class="brush: bash;">

#!/bin/bash

tc qdisc del dev eth0 root

tc qdisc add dev eth0 root handle 1:0 htb default 40
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100mbit

tc class add dev eth0 parent 1:1 classid 1:10 htb rate 100kbit  ceil 300kbit  prio 0   # DNS / ACK / SYN / FIN
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 500kbit  ceil 800kbit  prio 1   # E-mail
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1200kbit ceil 1600kbit prio 2   # HTTP / HTTPS
tc class add dev eth0 parent 1:1 classid 1:40 htb rate 300kbit  ceil 500kbit  prio 3   # Geral
</pre>
<p>A primeira linha remove qualquer pré-configuração existente. As duas linhas seguintes já foram analisadas. As próximas linhas são as classes que irão controlar o tráfego.</p>
<p>A classe <em>1:10</em> é filha da classe <em>1:1</em>. Ela permitirá um tráfego de 100 Kb/s. Caso as outras classes estejam livres, sem tráfego, esta classe poderá emprestar um pouco do link que sobra nas outras, podendo chegar a 300 Kb/s. Esta classe tem prioridade 0, ou seja, todas as outras irão parar para o seu tráfego passar (caso isso seja necessário). No fim da linha há um comentário, que não é obrigatório. Por intermédio desse comentário, entendemos que a classe <em>1:10</em> será utilizada para tráfego DNS e para alguns pacotes com algumas flags TCP. A análise das demais classes segue o mesmo raciocínio. Apenas relembrando, a classe <em>1:40</em> é a classe default e, tudo que não for enviado para as outras classes terminará passando por ela.</p>
<p>A seguir, uma imagem que resume toda a situação explanada até aqui:</p>
<div>
<div><span><a title="Htb1.jpg" href="http://www.eriberto.pro.br/wiki/index.php?title=Imagem:Htb1.jpg"><img src="http://www.eriberto.pro.br/wiki/images/3/3b/Htb1.jpg" border="0" alt="" width="438" height="310" /></a></span></div>
</div>
<p>É interessante fazer uma configuração para a interface <em>eth1</em> para controlar o upload. A configuração para a <em>eth1</em> segue os mesmos princípios da <em>eth0</em>. Exemplo:</p>
<pre class="brush: bash;">
#!/bin/bash

tc qdisc del dev eth1 root

tc qdisc add dev eth1 root handle 1:0 htb default 40
tc class add dev eth1 parent 1:0 classid 1:1 htb rate 100mbit

tc class add dev eth1 parent 1:1 classid 1:10 htb rate 100kbit ceil 300kbit prio 0   # DNS / ACK / SYN / FIN
tc class add dev eth1 parent 1:1 classid 1:20 htb rate 500kbit ceil 500kbit prio 1   # E-mail
tc class add dev eth1 parent 1:1 classid 1:30 htb rate 300kbit ceil 500kbit prio 2   # FTP
tc class add dev eth1 parent 1:1 classid 1:40 htb rate 300kbit ceil 500kbit prio 3   # Geral
</pre>
<blockquote><p>Na classe 1:20, a opção <em>ceil 500kbit</em> poderia ter sido omitida, uma vez que tal <em>ceil</em> possui o mesmo valor de <em>rate</em>.</p></blockquote>
<h2><span> A instalação do comando <em>tc</em> e da disciplina <em>HTB</em> no Debian GNU/Linux </span></h2>
<p>Para instalar o <em>tc</em> e o <em>HTB</em> no Debian, execute:</p>
<pre class="brush: bash;">
# apt-get install iproute
</pre>
<h2><span> A associação do HTB com o Iptables </span></h2>
<p>A divisão do tráfego pelas classes poderá ser feito com o auxílio do Iptables, utilizando a tabela <em>mangle</em> e o alvo <em>CLASSIFY</em>. A seguir, um exemplo de script de configuração do Iptables:</p>
<pre class="brush: bash;">
#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin

iptables -t mangle -F

# portas e-mail (entrada e saida)

iptables -t mangle -A FORWARD -p tcp -m multiport --ports 25,110,995 -j CLASSIFY --set-class 1:20

# trafego HTTP entrando

iptables -t mangle -A FORWARD -o eth0 -p tcp --sport 80 -j CLASSIFY --set-class 1:30

# trafego FTP saindo (upload)

iptables -t mangle -A FORWARD -o eth1 -p tcp --dport 20 -j CLASSIFY --set-class 1:30

# DNS e ACK/SYN/FIN (pacotes com até 60 bytes)

iptables -t mangle -A FORWARD -p udp -m multiport --ports 53 -j CLASSIFY --set-class 1:10  # DNS
iptables -t mangle -A FORWARD -m length --length 0:60 -j CLASSIFY --set-class 1:10         # Flags TCP
</pre>
<blockquote><p>Note que nas classes <em>1:30</em>, em virtude das opções <em>-o eth0</em> e <em>-o eth1</em>, a interface <em>eth0</em> será acionada somente para o tráfego HTTP que entra e a interface <em>eth1</em> somente para o tráfego FTP que sai (porta 20 &#8211; dados).</p></blockquote>
<h2><span> A ordem das regras </span></h2>
<p>Diferentemente das tabelas <em>filter</em> e <em>nat</em>, a tabela <em>mangle</em> lê todas as regras, até o final, mesmo que uma delas case com a situação do pacote em tráfego. Assim, deveremos colocar casos mais específicos como últimas regras.</p>
<p>Observe o exemplo a seguir:</p>
<pre class="brush: bash;">
# iptables -t mangle -A FORWARD -d 10.0.0.1 -p tcp --sport 110 -j CLASSIFY --set-class 1:65
# iptables -t mangle -A FORWARD -d 10.0.0.0/8 -p tcp --sport 110 -j CLASSIFY --set-class 1:70
</pre>
<p>A idéia das regras anteriores foi limitar a leitura de e-mails (protocolo POP3). A máquina 10.0.0.1 vai utilizar a classe 1:65, enquanto que o resto da rede 10.0.0.0 vai ser enquadrada na classe 1:70. No entanto, na prática, isso não irá acontecer, uma vez que a tabela <em>mangle</em> lê todas as regras existentes até o final. Assim, um pacote oriundo da máquina 10.0.0.1 será enquadrado pela primeira regra e, em seguida, pela segunda. Então, valerá a última situação. Ou seja, a ordem correta das regras deverá ser a seguinte:</p>
<pre class="brush: bash;">
# iptables -t mangle -A FORWARD -d 10.0.0.0/8 -p tcp --sport 110 -j CLASSIFY --set-class 1:70
# iptables -t mangle -A FORWARD -d 10.0.0.1 -p tcp --sport 110 -j CLASSIFY --set-class 1:65
</pre>
<h2><span> Tráfego local </span></h2>
<p>Como já foi dito, o controle de tráfego deverá ser feito no momento da saída do pacote pela placa de rede. Assim, caso você tenha que controlar o tráfego gerado pela máquina que contém o HTB, deverá ser utilizada a chain <em>OUTPUT</em> do Iptables. Isso será útil se, por exemplo, você quiser liberar totalmente o acesso à máquina de controle. Se você não fizer isso, um ssh para tal máquina, por exemplo, será impraticável. A seguir, um exemplo de liberação do tráfego:</p>
<pre class="brush: bash;">
# tc class add dev eth0 parent 1:1 classid 1:90 htb rate 100mbit prio 0
# iptables -t mangle -A OUTPUT -j CLASSIFY --set-class 1:90
</pre>
<h2><span> Verificando as <em>qdiscs</em> e as <em>classes</em> existentes </span></h2>
<p>Para verificar as <em>qdiscs</em> e as <em>classes</em> configuradas na <em>eth0</em>, execute:</p>
<pre class="brush: bash;">
# tc qdisc show dev eth0
# tc class show dev eth0
</pre>
<p>Caso deseje ver também detalhes e estatísticas, acresça as chaves <em>-d</em> e <em>-s</em>, da seguinte forma:</p>
<pre class="brush: bash;">
# tc -d -s qdisc show dev eth0
# tc -d -s class show dev eth0
</pre>
<h2><span> O módulo multiport do Iptables </span></h2>
<p>O módulo <em>multiport</em> do Iptables é um excelente elemento para ser utilizado em controle de tráfego, uma vez que é muito flexível. Observe as regras a seguir:</p>
<pre class="brush: bash;">
# iptables -t mangle -A FORWARD -p tcp --sport 110 -j CLASSIFY --set-class 1:78
# iptables -t mangle -A FORWARD -p tcp --sport 995 -j CLASSIFY --set-class 1:78
</pre>
<p>Essas regras poderiam ser substituídas por:</p>
<pre class="brush: bash;"># iptables -t mangle -A FORWARD -p tcp -m multiport --sport 110,995 -j CLASSIFY --set-class 1:78</pre>
<p>Ainda, observe:</p>
<pre class="brush: bash;">
# iptables -t mangle -A FORWARD -p tcp --sport 110 -j CLASSIFY --set-class 1:78
# iptables -t mangle -A FORWARD -p tcp --sport 995 -j CLASSIFY --set-class 1:78

# iptables -t mangle -A FORWARD -p tcp --dport 25 -j CLASSIFY --set-class 1:78
# iptables -t mangle -A FORWARD -p tcp --dport 465 -j CLASSIFY --set-class 1:78
</pre>
<p>Essas regras poderiam ser substituídas por:</p>
<pre class="brush: bash;"># iptables -t mangle -A FORWARD -p tcp -m multiport --port 25,110,465,995 -j CLASSIFY --set-class 1:78</pre>
<p>Outros módulos poderão ser úteis. Para aprender mais sobre eles, utilize o comando:</p>
<pre class="brush: bash;"># man iptables</pre>
<h2><span> As somas das velocidades das classes </span></h2>
<p>As somas das velocidades das classes não necessariamente precisarão ser menores do que a velocidade máxima do link. Apenas como exemplo, admita um link Internet de 1 Mb/s. Você poderá trabalhar com as seguintes classes e prioridades:</p>
<p><img src="http://www.eriberto.pro.br/wiki/images/4/40/Htb2.jpg" border="0" alt="" width="400" height="339" /></p>
<p>Observando a figura anterior, podemos notar que a soma das velocidades é 1150 Kb/s, enquanto o link total é 1000 Kb/s. No entanto, como trabalhamos com prioridades, haverá uma tendência das classes com menos prioridade diminuírem as suas velocidades, proporcionalmente, quando o link estiver saturado, para que as classes com mais prioridade possam trafegar. Entretanto, em virtude das velocidades utilizadas, em caso de saturação do link, nenhuma das classes deverá parar.</p>
<blockquote><p>Observe que não há uma necessidade de seguir uma ordem crescente numérica regular para numerar as classes e as prioridades. O mais importante é fazer a correta ligação com os pais.</p></blockquote>
<h2><span> Pense nisto&#8230; </span></h2>
<p>Observe a figura a seguir e deixe a sua imaginação fluir&#8230;</p>
<p><img src="http://www.eriberto.pro.br/wiki/images/c/cd/Htb3.jpg" border="0" alt="" width="400" height="228" /></p>
<p>Agora, imagine a possibilidade de ramificar a classe 1:50 em mais duas ou três classes&#8230;</p>
<p>fonte:  <a title="Eriberto" href="http://www.eriberto.pro.br/wiki/index.php?title=Controle_de_tr%C3%A1fego_com_TC%2C_HTB_e_Iptables" target="_blank"></a><a title="http://www.eriberto.pro.br" rel="nofollow" href="http://www.eriberto.pro.br/">João Eriberto Mota Filho</a><a title="Eriberto" href="http://www.eriberto.pro.br/wiki/index.php?title=Controle_de_tr%C3%A1fego_com_TC%2C_HTB_e_Iptables" target="_blank"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.softov.com.br/blog/post/41/controle-de-trafego-com-tc-htb-e-iptables/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

