{"id":157,"date":"2009-03-04T14:35:43","date_gmt":"2009-03-04T17:35:43","guid":{"rendered":"http:\/\/www.foxnet.com.br\/portal2\/?p=157"},"modified":"2010-09-27T09:29:15","modified_gmt":"2010-09-27T12:29:15","slug":"iptables-na-pratica-para-iniciantes","status":"publish","type":"post","link":"https:\/\/www.foxnet.com.br\/portal3\/?p=157","title":{"rendered":"Iptables na pr\u00e1tica para iniciantes"},"content":{"rendered":"<blockquote>\n<p class=\"quote\">O iptables \u00e9 uma ferramenta que pode ser usada para controlar o Netfilter de v\u00e1rias distribui\u00e7\u00f5es Linux. O Netfilter \u00e9 um firewall embutido no kernel\u00a0e o iptables \u00e9 uma ferramenta que permite estabelecer regras para este firewall.<\/p>\n<\/blockquote>\n<p class=\"quote\">Este tutorial trata apenas dos aspectos b\u00e1sicos das tabelas do iptables e da sintaxe para a cria\u00e7\u00e3o de regras.<\/p>\n<p><strong><span style=\"font-size: small;\">O Netfilter<br \/>\n<\/span><\/strong>Como voc\u00ea j\u00e1 deve saber, toda comunica\u00e7\u00e3o numa rede TCP-IP \u00e9 feita atrav\u00e9s de pacotes. O Netfilter trata apenas de regras. Estas regras s\u00e3o aplicadas aos pacotes. Cada regra \u00e9 criada para fazer alguma coisa, e esta coisa \u00e9 chamada de alvo. As regras pertencem a vertentes (chains), que s\u00e3o usadas para agrupar regras. Imagine as vertentes como uma correnteza que carrega pacotes, onde cada vertente leva determinado tipo de pacote. Cada vertente pertence a uma tabela.<\/p>\n<p><strong><span style=\"font-size: small;\">Alvos das Regras<\/span><\/strong><br \/>\nComo j\u00e1 disse, as regras atuam sobre os pacotes. Se uma regra for aplic\u00e1vel a um pacote, ent\u00e3o o alvo \u00e9 executado. Os alvos pr\u00e9-existentes s\u00e3o ACCEPT (aceitar), DROP (descartar), QUEUE (fila de espera) e RETURN (retornar ou devolver).<\/p>\n<p><strong><span style=\"font-size: small;\">As cinco vertentes pr\u00e9-existentes<\/span><\/strong><br \/>\nImagine seu sistema como uma caixa preta. Fora desta caixa preta fica um processador que &#8220;ca\u00e7a&#8221; todos os pacotes destinados ao seu sistema antes mesmo deles alcan\u00e7arem a interface de entrada &#8211; uma placa ethernet, um modem, uma antena de wireless ou qualquer outra interface de comunica\u00e7\u00e3o. Esta \u00e1rea \u00e9 chamada de pr\u00e9-roteamento. Como os pacotes n\u00e3o podem ser alterados pelo sistema antes deles entrarem no sistema, \u00e9 mais f\u00e1cil imaginar que eles possam ser alterados nesta \u00e1rea de pr\u00e9-roteamento de modo que, quando alcan\u00e7arem a interface, j\u00e1 tenham sido modificados e estejam prontos para serem roteados. Desta forma, as regras da vertente PREROUTING podem ser aplicadas antes que os pacotes entrem no sistema.<br \/>\nDentro do sistema existem mais tr\u00eas vertentes: INPUT (entrada), FORWARD (redespacho) e OUTPUT (sa\u00edda). Todos os pacotes que chegam s\u00e3o levados pela &#8220;correnteza&#8221; INPUT ou FORWARD. Os que est\u00e3o apenas em tr\u00e2nsito s\u00e3o levados pela vertente FORWARD, os que s\u00e3o destinados para o sistema local v\u00e3o pela vertente INPUT. Os pacotes provenientes do sistema local transitam apenas pela vertente OUTPUT.<br \/>\nQuando os pacotes saem da &#8220;caixa preta&#8221; e ainda n\u00e3o abandonaram a m\u00e1quina, eles podem ser levados por uma \u00faltima vertente &#8211; a POSTROUTING. Esta \u00e9 a \u00e1rea de p\u00f3s-roteamento, onde o sistema tamb\u00e9m n\u00e3o pode mais alcan\u00e7ar os pacotes.<\/p>\n<p><strong><span style=\"font-size: small;\">As tabelas do iptables<\/span><\/strong><\/p>\n<p>O framework do iptables \u00e9 dividido em 3 tabelas separadas:<\/p>\n<ul>\n<li>tabela\u00a0<strong>filter<\/strong>,<\/li>\n<li>tabela\u00a0<strong>nat<\/strong> (Network Address Translation &#8211; Tradu\u00e7\u00e3o de Endere\u00e7os de Rede) e<\/li>\n<li>tabela\u00a0<strong>mangle<\/strong> (lustrar, dar brilho).<\/li>\n<\/ul>\n<p>Cada uma destas tabelas possui correntes ou\u00a0<strong>vertentes<\/strong> (chains) mostrando os caminhos que devem ser seguidos ou as tarefas que devem ser realizadas.<\/p>\n<p><strong><span style=\"font-size: small;\">O filtro<\/span><\/strong><br \/>\nA tabela filter \u00e9 a tabela padr\u00e3o e uma das mais utilizadas. \u00c9 usada para identificar e tratar os pacotes que passam pelo firewall. Esta tabela possui tr\u00eas vertentes:\u00a0<strong>INPUT<\/strong> (entrada),\u00a0<strong>OUTPUT<\/strong> (sa\u00edda) e\u00a0<strong>FORWARD<\/strong>(redespacho), ou seja, \u00e9 o cora\u00e7\u00e3o da &#8220;caixa preta&#8221; do sistema. A vertente de entrada trata os pacotes destinados ao sistema local, a de sa\u00edda filtra os pacotes que est\u00e3o saindo do sistema local e a vertente de redespacho mostra o que deve ser feito com os pacotes que est\u00e3o apenas em tr\u00e2nsito porque se destinam a outra m\u00e1quina.<br \/>\nUm dado pacote n\u00e3o pode transitar por mais de uma vertente, ou seja, o pacote que estiver na &#8220;correnteza&#8221; INPUT\u00a0<strong>n\u00e3o<\/strong> pode pular a a vertente FORWARD e vice-versa.<br \/>\nSe voc\u00ea quiser saber se sua m\u00e1quina est\u00e1 ou n\u00e3o filtrando pacotes, chame o iptables para listar a tabela de filtragem com -L (lista). Se voc\u00ea ainda n\u00e3o definiu nenhuma regra de filtragem, o resultado mostra apenas as vertentes vazias:<\/p>\n<p><span style=\"color: gray;\"># iptables -L<\/span><br \/>\n<span style=\"color: gray;\">Chain INPUT (policy ACCEPT)<\/span><br \/>\n<span style=\"color: gray;\">target prot opt source destination<\/span><\/p>\n<p><span style=\"color: gray;\">Chain FORWARD (policy ACCEPT)<\/span><br \/>\n<span style=\"color: gray;\">target prot opt source destination<\/span><\/p>\n<p><span style=\"color: gray;\">Chain OUTPUT (policy ACCEPT)<\/span><br \/>\n<span style=\"color: gray;\">target prot opt source destination<\/span><\/p>\n<p>Nada impede identificar a tabela no comando usado:\u00a0<em>iptables -L -t filter<\/em> tem o mesmo efeito que\u00a0<em>iptables -L<\/em>.<\/p>\n<p><strong><span style=\"font-size: small;\">A tabela NAT<\/span><\/strong><br \/>\nEsta tabela \u00e9 usada para alterar o endere\u00e7o IP e\/ou portas de destino. Suas vertentes s\u00e3o\u00a0<strong>PREROUTING<\/strong> (pr\u00e9-roteamento),\u00a0<strong>POSTROUTING<\/strong> (p\u00f3s-roteamento) e\u00a0<strong>OUTPUT<\/strong> (sa\u00edda).<br \/>\nNa vertente PREROUTING podemos identificar a origem do pacote (interface de entrada) al\u00e9m do endere\u00e7o IP e a porta \u00e0 qual se destina. Antes do pacote ser roteado (quando ainda est\u00e1 na \u00e1rea de pr\u00e9-roteamento) podemos alterar o IP e tamb\u00e9m a porta que deve receb\u00ea-lo &#8211; em outras palavras, pode-se mudar a rota do pacote direcionando-o para uma outra m\u00e1quina e\/ou para uma outra porta na mesma m\u00e1quina ou numa m\u00e1quina diferente.<br \/>\nA vertente OUTPUT serve para dar sa\u00edda aos pacotes e para analis\u00e1-los antes que saiam da m\u00e1quina.<br \/>\nNa vertente POSTROUTING podemos alterar o IP\/porta de origem do pacote. Tamb\u00e9m podemos indicar a interface de sa\u00edda. Tudo isto acontece depois do pacote ter sido tratado na vertente OUTPUT e um pouquinho antes de ser despachado, ou seja, quando est\u00e1 na \u00e1rea de p\u00f3s-roteamento.<br \/>\nSe voc\u00ea quiser saber se a sua m\u00e1quina est\u00e1 redirecionando pacotes, chame o iptables com o comando -L -t nat. Se nenhuma regra tiver sido definida, a listagem deve ser a seguinte:<\/p>\n<p><span style=\"color: #696969;\"># iptables -L -t nat<\/span><br \/>\n<span style=\"color: #696969;\">Chain PREROUTING (policy ACCEPT)<\/span><br \/>\n<span style=\"color: #696969;\">target prot opt source destination<\/span><\/p>\n<p><span style=\"color: #696969;\">Chain POSTROUTING (policy ACCEPT)<\/span><br \/>\n<span style=\"color: #696969;\">target prot opt source destination<\/span><\/p>\n<p><span style=\"color: #696969;\">Chain OUTPUT (policy ACCEPT)<\/span><br \/>\n<span style=\"color: #696969;\">target prot opt source destination<\/span><\/p>\n<p>Apenas para refor\u00e7ar: para listar a tabela NAT, \u00e9 preciso especific\u00e1-la com a diretiva -t (tabela). No caso da tabela de filtragem isto n\u00e3o foi preciso porque o filtro \u00e9 a tabela padr\u00e3o do iptables.<\/p>\n<p><strong><span style=\"font-size: small;\">A tabela mangle<\/span><\/strong><br \/>\nEsta tabela serve para guardar as regras que devem ser seguidas para &#8220;escovar&#8221; (&#8220;lustrar&#8221;) pacotes, ou seja, fazer pacotes &#8220;mexidos&#8221;. Mas quem \u00e9 que quer ou precisa dar uma ajeitada em pacotes? O motivo mais comum \u00e9 alterar o campo Tipo de Servi\u00e7o (Type Of Service &#8211; TOS). Este campo \u00e9 lido pelo kernel do Linux e altera a prioridade do pacote.<br \/>\nComo o uso da tabela mangle \u00e9 pequeno e depende de conhecimentos mais especializados, n\u00e3o vou entrar em maiores detalhes por que ainda temos muito pela frente.<br \/>\nEm todo caso, agora que voc\u00ea j\u00e1 sabe como descobrir as vertentes de uma tabela, que tal dar um\u00a0<em>iptables -L -t mangle<\/em>?<\/p>\n<p><strong><span style=\"font-size: small;\">Aprendendo na pr\u00e1tica<\/span><\/strong><br \/>\nO iptables disponibiliza uma s\u00e9rie de comandos que podem ser &#8220;vitaminados&#8221; com um outro tanto de op\u00e7\u00f5es. Pelo menos um destes comandos n\u00f3s j\u00e1 conhecemos, o -L, usado para listar tabelas. Se voc\u00ea tiver curiosidade, fa\u00e7a um\u00a0<em>iptables -h<\/em> para ver o que pode ser feito:<\/p>\n<p><span style=\"color: gray;\">iptables -h<\/span><br \/>\n<span style=\"color: gray;\">iptables v1.3.3<\/span><\/p>\n<p><span style=\"color: gray;\">Usage:<\/span><br \/>\n<span style=\"color: gray;\">iptables -[AD] chain rule-specification [options]<\/span><br \/>\n<span style=\"color: gray;\">iptables -[RI] chain rulenum rule-specification [options]<\/span><br \/>\n<span style=\"color: gray;\">iptables -D chain rulenum [options]<\/span><br \/>\n<span style=\"color: gray;\">iptables -[LFZ] [chain] [options]<\/span><br \/>\n<span style=\"color: gray;\">iptables -[NX] chain<\/span><br \/>\n<span style=\"color: gray;\">iptables -E old-chain-name new-chain-name<\/span><br \/>\n<span style=\"color: gray;\">iptables -P chain target [options]<\/span><br \/>\n<span style=\"color: gray;\">iptables -h (print this help information)<\/span><\/p>\n<p><span style=\"color: gray;\">Commands:<\/span><br \/>\n<span style=\"color: gray;\">Either long or short options are allowed.<\/span><br \/>\n<span style=\"color: gray;\">&#8211;append -A chain Append to chain<\/span><br \/>\n<span style=\"color: gray;\">&#8211;delete -D chain Delete matching rule from chain<\/span><br \/>\n<span style=\"color: gray;\">&#8211;delete -D chain rulenum Delete rule rulenum (1 = first) from chain<\/span><br \/>\n<span style=\"color: gray;\">&#8211;insert -I chain [rulenum] Insert in chain as rulenum (default 1=first)<\/span><br \/>\n<span style=\"color: gray;\">&#8211;replace -R chain rulenum Replace rule rulenum (1 = first) in chain<\/span><br \/>\n<span style=\"color: gray;\">&#8211;list -L [chain] List the rules in a chain or all chains<\/span><br \/>\n<span style=\"color: gray;\">&#8211;flush -F [chain] Delete all rules in chain or all chains<\/span><br \/>\n<span style=\"color: gray;\">&#8211;zero -Z [chain] Zero counters in chain or all chains<\/span><br \/>\n<span style=\"color: gray;\">&#8211;new -N chain Create a new user-defined chain<\/span><br \/>\n<span style=\"color: gray;\">&#8211;delete-chain -X [chain] Delete a user-defined chain<\/span><br \/>\n<span style=\"color: gray;\">&#8211;policy -P chain target Change policy on chain to target<\/span><br \/>\n<span style=\"color: gray;\">&#8211;rename-chain -E old-chain new-chain<\/span><br \/>\n<span style=\"color: gray;\">Change chain name, (moving any references)<\/span><\/p>\n<p><span style=\"color: gray;\">Options:<\/span><br \/>\n<span style=\"color: gray;\">&#8211;proto -p [!] proto protocol: by number or name, eg. `tcp&#8217;<\/span><br \/>\n<span style=\"color: gray;\">&#8211;source -s [!] address[\/mask] source specification<\/span><br \/>\n<span style=\"color: gray;\">&#8211;destination -d [!] address[\/mask] destination specification<\/span><br \/>\n<span style=\"color: gray;\">&#8211;in-interface -i [!] input name[+] network interface name ([+] for wildcard)<\/span><br \/>\n<span style=\"color: gray;\">&#8211;jump -j target target for rule (may load target extension)<\/span><br \/>\n<span style=\"color: gray;\">&#8211;match -m match extended match (may load extension)<\/span><br \/>\n<span style=\"color: gray;\">&#8211;numeric -n numeric output of addresses and ports<\/span><br \/>\n<span style=\"color: gray;\">&#8211;out-interface -o [!] output name[+]<\/span><br \/>\n<span style=\"color: gray;\">network interface name ([+] for wildcard)<\/span><br \/>\n<span style=\"color: gray;\">&#8211;table -t table table to manipulate (default: `filter&#8217;)<\/span><br \/>\n<span style=\"color: gray;\">&#8211;verbose -v verbose mode<\/span><br \/>\n<span style=\"color: gray;\">&#8211;line-numbers print line numbers when listing<\/span><br \/>\n<span style=\"color: gray;\">&#8211;exact -x expand numbers (display exact values)<\/span><br \/>\n<span style=\"color: gray;\">[!] &#8211;fragment -f match second or further fragments only<\/span><br \/>\n<span style=\"color: gray;\">&#8211;modprobe=&lt;command&gt; try to insert modules using this command<\/span><br \/>\n<span style=\"color: gray;\">&#8211;set-counters PKTS BYTES set the counter during insert\/append<\/span><br \/>\n<span style=\"color: gray;\">[!] &#8211;version -V print package version.<\/span><\/p>\n<p>Observe que todos os comandos e op\u00e7\u00f5es possuem duas formas: a completa e a reduzida. Observe tamb\u00e9m que a forma reduzida dos comandos \u00e9 sempre em letra mai\u00fascula e a das op\u00e7\u00f5es \u00e9 em letra min\u00fascula e que a forma completa \u00e9 precedida por &#8212; e a forma reduzida por -. Apenas para ficarmos no que j\u00e1 sabemos usar, para listar tabelas a forma completa \u00e9 &#8211;list (dois h\u00edfens seguidos pela palavra list) e a forma reduzida \u00e9 -L (um h\u00edfem seguido pela letra mai\u00fascula L).<\/p>\n<p><strong><span style=\"font-size: small;\">Criando a primeira regra<\/span><\/strong><br \/>\nSe \u00e9 que voc\u00ea n\u00e3o sabe, o endere\u00e7o 127.0.0.1 \u00e9 a interface &#8216;loopback&#8217;, a qual existe mesmo quando nenhuma conex\u00e3o de rede estiver ativa. Vamos us\u00e1-la neste exemplo para criar pacotes.<br \/>\nO modo mais f\u00e1cil e r\u00e1pido de criar um pacote \u00e9 usando o programa &#8216;ping&#8217;. O ping envia um pacote ICMP tipo 8 (requisi\u00e7\u00e3o de eco) ao qual todos os hosts (m\u00e1quinas) que estejam no mesmo segmento de rede precisam obrigatoriamente responder com um pacote ICMP tipo 0 (resposta de eco). Isto torna o programa muito \u00fatil para fazer testes de conectividade e&#8230; para fazer testes com o Netfilter\/iptables.<br \/>\nExperimente o seguinte:<\/p>\n<p><span style=\"color: gray;\"># ping -c 1 127.0.0.1<\/span><br \/>\n<span style=\"color: gray;\">PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.<\/span><br \/>\n<span style=\"color: gray;\">64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.072 ms<\/span><\/p>\n<p><span style=\"color: gray;\">&#8212; 127.0.0.1 ping statistics &#8212;<\/span><br \/>\n<span style=\"color: gray;\">1 packets transmitted, 1 received, 0% packet loss, time 0ms<\/span><br \/>\n<span style=\"color: gray;\">rtt min\/avg\/max\/mdev = 0.072\/0.072\/0.072\/0.000 ms<\/span><\/p>\n<p>A op\u00e7\u00e3o -c 1 (count 1 = contador 1) do ping diz para enviar apenas um pacote. Na estat\u00edstica v\u00ea-se que apenas um pacote foi transmitido pela m\u00e1quina local para ela mesma (1 packets transmitted), que ela recebeu a resposta (1 received) e que, portanto, houve 0% de perda de pacotes (0% packet loss).<br \/>\nAgora chegou a hora de botar o firewall para funcionar. Como n\u00e3o queremos alterar o pacote de resposta ao ping antes que ele alcance o sistema, podemos esquecer a \u00e1rea de pr\u00e9-roteamento e nos concentrarmos apenas no sistema. Sabemos que este pacote n\u00e3o vai ser redespachado (afinal, \u00e9 a resposta que estamos esperando) e que, se est\u00e1 endere\u00e7ado para nossa m\u00e1quina, s\u00f3 pode ser levado pela vertente INPUT (entrada). Quais s\u00e3o as tabelas que possuem a vertente INPUT? A tabela filter e a tabela mangle (a nap n\u00e3o tem a vertente INPUT). A mangle \u00e9 para alterar caracter\u00edsticas do pacote, nada do que pretendemos fazer. S\u00f3 sobra a tabela filter.<br \/>\nEu poderia ter explicado esta coisa toda dizendo que, como queremos filtrar um pacote ICMP vindo de 127.0.0.1, vamos usar a tabela filter. Acontece que repetir a l\u00f3gica do sistema Netfilter\/iptables nunca \u00e9 demais. Existem casos um pouco mais complicados que apenas podemos resolver se conhecermos o caminho das pedras (ou o caminho da &#8220;correnteza&#8221;). Pelo menos foi assim que eu aprendi a pilotar este firewall.<br \/>\nMas vamos l\u00e1, est\u00e1 na hora de criar nossa primeira regra. Vamos chamar o iptables para acionar a tabela filter (-t filter) e adicionar (-A) na vertente INPUT uma regra que diz: quando o endere\u00e7o de origem (-s source) for 127.0.0.1 e o protocolo (-p) for icmp, salte (-j jump) para DROP (descartar). B\u00e3o, para escrever isto em iptabl\u00eas, fa\u00e7a o seguinte:<\/p>\n<p><span style=\"color: gray;\"># iptables -t filter -A INPUT -s 127.0.0.1 -p icmp -j DROP<\/span><\/p>\n<p>\u00c9 claro que a op\u00e7\u00e3o\u00a0<em>-t filter<\/em> poderia ser omitida (j\u00e1 que a tabela filter \u00e9 a default), mas, por uma quest\u00e3o de respeito (e para deixar as coisas mais expl\u00edcitas), resolvi identificar a tabela. Para verificar o resultado deste comando, fa\u00e7a uma listagem com\u00a0<em>iptables -t filter -L INPUT<\/em> ou apenas com\u00a0<em>iptables -L INPUT<\/em>:<\/p>\n<p><span style=\"color: gray;\"># iptables -t filter -L INPUT<\/span><br \/>\n<span style=\"color: gray;\">Chain INPUT (policy ACCEPT)<\/span><br \/>\n<span style=\"color: gray;\">target prot opt source destination<\/span><br \/>\n<span style=\"color: gray;\">DROP icmp &#8212; localhost anywhere<\/span><\/p>\n<p>Veja que a pol\u00edtica \u00e9 aceitar qualquer pacote que venha &#8220;boiando&#8221; nesta vertente (policy ACCEPT), a n\u00e3o ser que se encaixe em qualquer uma das regras que vier a seguir. A \u00fanica regra \u00e9 a que acabamos de criar e ela diz que, se o pacote for do protocolo ICMP (prot icmp), origin\u00e1rio de localhost (source localhost) que \u00e9 o mesmo que 127.0.0.1 e cujo destino for para qualquer lugar (destination anywhere), o alvo (target) \u00e9 DROP (descartar). Isto significa que, a partir de agora, qualquer resposta de ping ser\u00e1 descartada. Toca conferir:<\/p>\n<p><span style=\"color: gray;\"># ping -c 1 127.0.0.1<\/span><br \/>\n<span style=\"color: gray;\">PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.<\/span><\/p>\n<p><span style=\"color: gray;\">&#8212; 127.0.0.1 ping statistics &#8212;<\/span><br \/>\n<span style=\"color: gray;\">1 packets transmitted, 0 received, 100% packet loss, time 0ms<\/span><\/p>\n<p>Fazendo um novo ping, igualzinho ao primeiro, at\u00e9 parece que tudo travou. Tenha paci\u00eancia, demora um pouquinho mesmo. Depois do pacote de resposta do ping chegar levado pela vertente INPUT, nossa regra precisa ser aplicada e o pacote \u00e9 descartado. Tanto \u00e9 que a resposta \u00e9\u00a0<em>1 packets transmitted, 0 received, 100% packet loss<\/em>.<br \/>\nNovamente, s\u00f3 para conferir, vamos pedir uma listagem apenas da vertente INPUT da tabela filter no modo<em>verbose<\/em> (-v explicativo) e com n\u00famero de linhas (&#8211;line-numbers):<\/p>\n<p><span style=\"color: gray;\"># iptables -t filter -L INPUT -v &#8211;line-numbers<\/span><br \/>\n<span style=\"color: gray;\">Chain INPUT (policy ACCEPT 5592 packets, 2716K bytes)<\/span><br \/>\n<span style=\"color: gray;\">num pkts bytes target prot opt in out source destination<\/span><br \/>\n<span style=\"color: gray;\">1 1 84 DROP icmp &#8212; any any localhost anywhere<\/span><\/p>\n<p>O modo\u00a0<em>verbose<\/em> diz que um pacote (pkts 1) foi recebido e descartado. D\u00ea mais um ping e confira que pkts vai para 2. N\u00e3o \u00e9 que funciona mesmo?<\/p>\n<p><strong><span style=\"font-size: small;\">Mais um exemplo de regra<\/span><\/strong><\/p>\n<p>Quando um usu\u00e1rio chama seu site com\u00a0<span style=\"color: #000099;\">HTTP<\/span>:\/\/www.seusite.com.br, a porta 80 \u00e9 automaticamente acionada. S\u00f3 para efeito de teste, vamos adicionar mais uma porta de acesso para o site, a 8080.<br \/>\nAntes de come\u00e7ar, experimente acessar seu site com\u00a0http:\/\/www.seusite.com.br:8080. A n\u00e3o ser que a porta 8080 esteja habilitada, voc\u00ea vai receber uma p\u00e1gina de erro informando que houve falha na conex\u00e3o. Se n\u00e3o h\u00e1 conex\u00e3o, ent\u00e3o vamos proporcion\u00e1-la usando o iptables&#8230; s\u00f3 para testar.<br \/>\nVamos redirecionar a porta 8080 para a porta 80. Redirecionar significa rotear de forma diferente e a tabela que cuida disto \u00e9 a NAT. Com uma regra na vertente PREROUTING podemos alterar todos os pacotes cujo protocolo seja TCP trocando a porta de destino de 8080 para 80. A sintaxe deste comando \u00e9 a seguinte:<\/p>\n<p><span style=\"color: gray;\">iptables -t nat -A PREROUTING -p {protocolo} -i {interface} -d {IP destino}<\/span><br \/>\n<span style=\"color: gray;\">&#8211;dport {porta destino} -j REDIRECT &#8211;to-port {nova porta}<\/span><\/p>\n<p>Podemos usar todas as op\u00e7\u00f5es ou algumas delas. Neste exemplo nos interessam apenas as op\u00e7\u00f5es -t (precisamos garantir que a tabela seja a nat), -p, &#8211;dport e &#8211;to-port. Para adicionar a nova regra fa\u00e7a o seguinte:<\/p>\n<p><span style=\"color: gray;\">iptables -t nat -A PREROUTING -p tcp &#8211;dport 8080 -j REDIRECT &#8211;to-port 80<\/span><\/p>\n<p>S\u00f3 pra tirar a cisma, chame seu site novamente com\u00a0http:\/\/www.seusite.com.br:8080 e&#8230; \u00e9 isto a\u00ed. Funcionou novamente.<\/p>\n<p><strong><span style=\"font-size: small;\">Eliminando regras<\/span><\/strong><br \/>\nComo este segundo exemplo \u00e9 uma insanidade (ningu\u00e9m vai chamar seu site usando a porta 8080), n\u00e3o tem sentido manter esta regra no Netfilter. \u00c9 isto mesmo o que voc\u00ea leu, o iptables \u00e9 uma ferramenta que coloca as regras diretamente dentro do Netfilter, ou seja, no kernel do Linux. Bem, se ele serve para adicionar regras, o esperado \u00e9 que tamb\u00e9m seja capaz de retir\u00e1-las. O comando para retirar regras do Netfilter \u00e9 especialmente importante de se conhecer quando estamos brincando com o firewall &#8211; caso alguma coisa d\u00ea errado ou n\u00e3o esteja de acordo com o esperado, precisamos poder eliminar a regra para podermos continuar com nossas experi\u00eancias. O comando para limpar as tabelas chama-se\u00a0<em>Flush<\/em> e meu mnem\u00f4nico \u00e9 F de Faxina:<\/p>\n<p><span style=\"color: gray;\">iptables -F<\/span><br \/>\n<span style=\"color: gray;\">iptables -t nat -F<\/span><br \/>\n<span style=\"color: gray;\">iptables -t mangle -F<\/span><\/p>\n<p>Por um lado, o -F da faxina \u00e9 bom porque tira TODAS as regras de determinada tabela; por outro, \u00e9 uma encrenca quando queremos eliminar apenas uma delas. Para remediar existe um outro comando, o -D de deletar, que precisa de um par\u00e2metro adicional: o n\u00famero da regra que queremos fazer sumir. Digamos que nossa tabela NAT tenha 5 regras na vertente PREROUTING. Para saber como est\u00e3o numeradas \u00e9 s\u00f3 listar a tabela com a op\u00e7\u00e3o &#8211;line-number:<\/p>\n<p><span style=\"color: gray;\">iptables -t nat -L PREROUTING &#8211;line-number<\/span><\/p>\n<p>Depois disto, basta indicar o n\u00famero da regra que deve ser eliminada com:<\/p>\n<p><span style=\"color: gray;\">iptables -t nat -D PREROUTING 3<\/span><\/p>\n<p>Uma outra forma de eliminar determinada regra \u00e9 simplesmente repetir o que ela estava ditando. Digamos que criamos uma regra do tipo\u00a0<em>iptables -A INPUT -s 192.168.0.1 -j ACCEPT<\/em>. Para elimin\u00e1-la da tabela filter \u00e9 s\u00f3 repetir a regra depois do -D:<\/p>\n<p><span style=\"color: gray;\">iptables -D INPUT -s 192.168.0.1 -j ACCEPT<\/span><\/p>\n<p><strong><span style=\"font-size: small;\">Tornando as regras permanentes<\/span><\/strong><br \/>\nO fato de inserirmos regras no Netfilter usando o iptables n\u00e3o significa que elas s\u00e3o permanentes &#8211; enquanto o servifor estiver no ar, tudo bem; no momento em que for\u00a0<em>rebootado<\/em>, ba-bau&#8230; as regras estar\u00e3o perdidas. Como fazer com que sejam recuperadas? Coloque as regras num dos scripts de inicializa\u00e7\u00e3o do boot (por exemplo, no \/etc\/rc.d\/rc.local). \u00c9 isso a\u00ed.<\/p>\n<p><strong><span style=\"font-size: small;\">Finalmentes<\/span><\/strong><br \/>\nO b\u00e1sico do b\u00e1sico sobre o iptables \u00e9 o que voc\u00ea acabou de ler. \u00c9 claro que a coisa n\u00e3o p\u00e1ra por a\u00ed. H\u00e1 um mundo de comandos e op\u00e7\u00f5es que ainda pode ser explorado, mas isto vai ficar por sua conta. Espero que este texto introdut\u00f3rio sirva de ajuda para poder come\u00e7ar. O resto fica por sua conta.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este tutorial trata apenas dos aspectos b\u00e1sicos das tabelas do iptables e da sintaxe para a cria\u00e7\u00e3o de regras&#8230;. <\/p>\n<div class=\"read-more navbutton\"><a href=\"https:\/\/www.foxnet.com.br\/portal3\/?p=157\">Read More<i class=\"fa fa-angle-double-right\"><\/i><\/a><\/div>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,25,14,23],"tags":[243,51,241,242,245,244],"class_list":["post-157","post","type-post","status-publish","format-standard","hentry","category-linux_dicas","category-seguranca_firewall","category-linux","category-seguranca","tag-filter","tag-firewall","tag-iptables","tag-mangle","tag-postroute","tag-preroute"],"_links":{"self":[{"href":"https:\/\/www.foxnet.com.br\/portal3\/index.php?rest_route=\/wp\/v2\/posts\/157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.foxnet.com.br\/portal3\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.foxnet.com.br\/portal3\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.foxnet.com.br\/portal3\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.foxnet.com.br\/portal3\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=157"}],"version-history":[{"count":3,"href":"https:\/\/www.foxnet.com.br\/portal3\/index.php?rest_route=\/wp\/v2\/posts\/157\/revisions"}],"predecessor-version":[{"id":199,"href":"https:\/\/www.foxnet.com.br\/portal3\/index.php?rest_route=\/wp\/v2\/posts\/157\/revisions\/199"}],"wp:attachment":[{"href":"https:\/\/www.foxnet.com.br\/portal3\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.foxnet.com.br\/portal3\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.foxnet.com.br\/portal3\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}