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 3: Liberações e bloqueios
Liberando acessos
Vamos agora liberar o ping para a tua máquina. Para isso, vamos adicionar uma regra na change INPUT (-A INPUT), permitindo (-j ACCEPT) o protocolo ICMP (-p icmp).E para efeito de desempenho, vamos listar as regras de firewall (-L) sem a resolução de nomes dns (-n).
# iptables -A INPUT -p icmp -j ACCEPT
# iptables -nL
Chain INPUT (policy DROP) target prot opt source destination ACCEPT icmp -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destinationTestando o ping:
ping -c 1 172.20.1.145
PING 172.20.1.145 (172.20.1.145) 56(84) bytes of data. 64 bytes from 172.20.1.145: icmp_req=1 ttl=64 time=0.028 ms --- 172.20.16.60 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.028/0.028/0.028/0.000 msVemos que agora, o equipamento responde ao ping.
Você pode adicionar regras usando o "-I" ao invés de "-A". A diferença é que o "-I" adiciona a regra no top da tabela, enquanto que o "-A", adiciona no final.
* Lembre-se: as regras mais acima têm precedência em relação às que estão embaixo.
Especificando IP de origem e destino
Há situações que você precisa liberar um acesso apenas a alguns hosts. Por exemplo, você pode liberar acesso remoto em seu servidor apenas para as estações dos administradores do sistema.Para isso, use o parâmetro "-s" (origem) e "-d" (destino):
# iptables -A INPUT -s 172.20.16.60 -j ACCEPT
Isso permite que o host 172.20.16.60 se conecte em qualquer porta.
# iptables -A OUTPUT -d 8.8.8.8 j DROP
Isso bloqueia o acesso a qualquer porta do IP 8.8.8.8.
Especificando o tipo de protocolo
Para começar a ser mais específico, podemos especificar qual o tipo que porta você quer bloquear. Por exemplo, para bloquear todos os pacotes TCP, permitindo somente o UDP, devemos usar o parâmetro "-p":# iptables -A INPUT -s 172.20.16.60 -p udp -j ACCEPT
Podemos ser ainda mais específicos, liberando o acesso somente à porta 53 UDP (DNS) usando o parâmetro "--dport":
# iptables -A INPUT -s 172.20.16.60 -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -s 172.20.16.60 -j DROP.
Podemos perceber na primeira regra, que o host 172.20.16.60 tem liberado a resolução de nomes (UDP 53). Na segunda regra, está sendo bloqueado qualquer outro tipo de acesso deste host.
Trabalhando com a chain FORWARD
Agora que você já sabe o básico do iptables, vamos partir para a configuração de um firewall de rede.Vamos supor que você tenha um equipamento com duas placas de rede, a eth0 ligada na tua rede local, e eth1 na internet. Primeiramente, temos que habilitar o roteamento:
# sysctl net.ipv4.ip_forward=1
Como eu mostrei nos outros artigos da série, é necessário que as estações da rede saiam para a internet com o IP externo do firewall.
Para fazer isso, digite o comando abaixo:
# iptables -t nat -A POSTROUTING -j MASQUERADE
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:
Note que o IP mostrado é o do firewall, e não o teu.
Agora, para liberar o acesso da rede interna à navegação (HTTP e HTTPS), digite:
# iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
# iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
Especificando as interfaces nas regras de firewall
Para evitar um ataque do tipo IP spoofing, você pode especificar as interfaces de rede nas regras do iptables. Vamos supor que a eth0 seja a interface da rede interna e eth1, a interface da internet:# iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -j ACCEPT
Em outras palavras, a regra acima permite (ACCEPT) o acesso da HTTP (-p tcp --dport 80) que esteja entrando pela rede interna (-i eth0) e saindo pela interface de internet (-o eth0).
# 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).
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.