Entendendo TCP/IP (Parte 6) - Firewall
Neste artigo, o sexto da série, vou explicar o funcionamento de um firewall e mostrar como o iptables funciona.
Parte 2: Instalando o iptables
O iptables é uma ferramenta que administra o módulo netfilter do sistema operacional e está presente desde a versão 2.4 do kernel.
Para usá-lo, é necessário possuir direitos administrativos no equipamento. No caso improvável de você não ter o iptables, basta instalá-lo através do gerenciador de aplicativos da tua distribuição.
No Debian, use:
# apt-get install iptables
Antes de entrarmos nas regras de firewall, é preciso entender como o iptables trabalha. O iptables possui 3 cadeias (chain), que são caminhos diferentes por onde os pacotes de rede passam.
Todo dado que se origina no firewall e o que está saindo dele, usa a chain OUTPUT. Pacotes destinados ao firewall, usam a chain INPUT.
Há ainda uma outra chain, FORWARD, destinada a tratar pacotes de dados que estão passando pelo firewall, mas não se originam nele e nem tem ele como destino; esse é o caso se você está configurando o firewall no gateway da rede.
Quando alguém em sua rede acessa a internet, por exemplo, esse dado passa pelo firewall, mas nem a origem e nem o destino são o firewall. A figura abaixo exemplifica isso:
As ações podem ser ACCEPT, REJECT e DROP. A diferença entre REJECT e DROP, é que REJECT envia uma resposta ao remetente. Enquanto que DROP, simplesmente descarta o pacote como se ele nunca tivesse existido.
Para listar as regras atuais, digite:
# iptables -L
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Fazendo isso, você evita a criação de duas regras para cada liberação.
Vamos ver as mudanças:
# iptables -L
Vamos configurar INPUT como DROP e OUTPUT, como ACCEPT. Em outras palavras, esse desktop poderá sair para qualquer lugar, mas ninguém poderá se conectar nele.
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -L
Vamos tentar pingar o desktop através de outro equipamento:
ping -c 1 172.20.1.145
Para usá-lo, é necessário possuir direitos administrativos no equipamento. No caso improvável de você não ter o iptables, basta instalá-lo através do gerenciador de aplicativos da tua distribuição.
No Debian, use:
# apt-get install iptables
Antes de entrarmos nas regras de firewall, é preciso entender como o iptables trabalha. O iptables possui 3 cadeias (chain), que são caminhos diferentes por onde os pacotes de rede passam.
Todo dado que se origina no firewall e o que está saindo dele, usa a chain OUTPUT. Pacotes destinados ao firewall, usam a chain INPUT.
Há ainda uma outra chain, FORWARD, destinada a tratar pacotes de dados que estão passando pelo firewall, mas não se originam nele e nem tem ele como destino; esse é o caso se você está configurando o firewall no gateway da rede.
Quando alguém em sua rede acessa a internet, por exemplo, esse dado passa pelo firewall, mas nem a origem e nem o destino são o firewall. A figura abaixo exemplifica isso:
As ações podem ser ACCEPT, REJECT e DROP. A diferença entre REJECT e DROP, é que REJECT envia uma resposta ao remetente. Enquanto que DROP, simplesmente descarta o pacote como se ele nunca tivesse existido.
Para listar as regras atuais, digite:
# iptables -L
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destinationPara começar a brincadeira, vamos primeiramente ativar o Statefull, conforme expliquei acima:
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Fazendo isso, você evita a criação de duas regras para cada liberação.
Vamos ver as mudanças:
# iptables -L
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHEDAgora, vamos definir a regra padrão. Em um caso mais simples possível, considere que estamos criando as regras de firewall em um desktop normal (portanto, não teremos FORWARD).
Vamos configurar INPUT como DROP e OUTPUT, como ACCEPT. Em outras palavras, esse desktop poderá sair para qualquer lugar, mas ninguém poderá se conectar nele.
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -L
Chain INPUT (policy DROP) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destinationAgora podemos notar que a regra padrão de INPUT é DROP.
Vamos tentar pingar o desktop através de outro equipamento:
ping -c 1 172.20.1.145
PING 172.20.1.145 (172.20.1.145) 56(84) bytes of data. --- 172.20.1.145 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0msarp -na | grep 172.20.1.145
? (172.20.1.145) em 00:25:90:2b:35:de [ether] em br0Apesar de não termos resposta, podemos perceber pelo arp que o equipamento está na rede, pois a resolução ARP, como expliquei nos artigos anteriores, é feita antes que o firewall entre em ação.
Neste caso, eu vou usar a chain POSTROUTING, pois estou trabalhando na SAÍDA:
# iptables -t nat -A POSTROUTING -i eth1 -p tcp --dport 110 -j SNAT --to-source 200.200.100.60
Lembrando que essa regra deve vir antes da regra de MASQUERADE, pois o iptables é top-down, ou seja, as regras mais acima são executadas primeiro."
-- Acredito que neste caso não se pode utilizar o MASQUERADE.
O MASQUERADE somente se usa no IPtables quando o IP da placa de rede de entrada da Internet/dados está dinâmico (ou automático).
Todas as regras para os vários IPs do gateway, nesse caso, devem ser com SNAT.
"# iptables -A FORWARD -i eth0 -o eth1 -s 172.20.16.60 -d 8.8.8.8 -p udp --dport 53 -j ACCEPT
Acima, a regra permite (-j ACCEPT) que pacotes de DNS (-p udp --dport 53) vindos de 172.20.16.60 (-s 172.20.16.60) com destino ao DNS do Google (- d 8.8.8.8) entrando pela interface da LAN (-i eth0) e saindo pela interface de internet (-o eth1) atravessem o firewall (-A FORWARD)."
-- Note que especificar qualquer nome a ser resolvido com uma consulta remota, como a um DNS, é uma ideia muito ruim.
"Não se preocupe em entender esse comando agora, pois vou explicá-lo mais pra frente neste artigo. A princípio, tenha em mente que esse comando vai fazer com que todos as estações da rede saiam com o IP do firewall.
Para comprovar isso, acesse: http://meuip.datahouse.com.br/
Note que o IP mostrado é o do firewall, e não o teu."
-- O IP mostrado não é o do firewall, é o do modem/roteador.
Mas está bom o artigo.