Linux: Bloqueio de portas via IPtables (Dica)
Bom, a voce que chegou até aqui, acredito que tenha um pouco de conhecimento em ambientes Linux e deseja trabalhar melhor com IPtables.
Voce deve ter chegado aqui com a famosa pergunta: Como eu posso bloquear uma porta com iptables no Linux?
Os números de portas são reconhecidos em uma rede por meio de seus protocolos entre outros protocolos também, onde estes permitem que o seu computador ou servidor interaja com outros computadores em uma rede local, ou na internet e, cada servidor linux (como qualquer outro equipamento de rede) possui um número de portas para seus serviços.
Para isso, veja o arquivo /etc/services com seu editor de textos favorito. Veja alguns exemplos:
- Porta TCP 80 – Responde pelo serviço do HTTP (Servidor web)
- Porta TCP 443 – Responde pelo serviço do HTTPS (Servidor web com SSL)
- Porta TCP 25 – Responde pelo seu servidor de Email. (Desde 2012 essa porta no Brasil é bloqueada e a porta atualmente utilizada para o servidor de email é: 587)
- Porta TCP 22 – Responde pelo servidor do SSH
- Porta TCP/UDP 53 – É responsável pelo DNS.
Bloqueando portas de entrada
A sintaxe a seguir é utilizada para bloquear portas de ENTRADA (incoming) usando IPtables:
/sbin/iptables -A INPUT -p tcp --destination-port {NUMERO-PORTA} -j DROP ### Bloqueando a interface de entrada eth1 ### /sbin/iptables -A INPUT -i eth1 -p tcp --destination-port {NUMERO-PORTA} -j DROP ### Dropando somente portas por IPs ou por Subnet ## /sbin/iptables -A INPUT -i eth0 -p tcp --destination-port {NUMERO-PORTA} -s {IP} -j DROP /sbin/iptables -A INPUT -i eth0 -p tcp --destination-port {NUMERO-PORTA} -s {IP/SUBNET} -j DROP
Por exemplo, vamos bloquear a porta 80 HTTP Server em qualquer interface de rede:
# /sbin/iptables -A INPUT -p tcp –destination-port 80 -j DROP
# /sbin/service iptables save
Bloqueando porta 80 de entrada na interface eth0 para todos ips, exceto para o ip 1.2.3.4
# /sbin/iptables -A INPUT -p tcp -i eth1 -s ! 1.2.3.4 --dport 80 -j DROP
Bloqueando portas de saída
Temos as seguintes sintaxes:
/sbin/iptables -A OUTPUT -p tcp --dport {NUMERO-PORTA} -j DROP ### Bloqueando a interface de saída eth1 ### /sbin/iptables -A OUTPUT -o eth1 -p tcp --dport {NUMERO-PORTA} -j DROP ### Dropando somente portas por IPs ou por Subnet ## /sbin/iptables -A OUTPUT -o eth0 -p tcp --destination-port {NUMERO-PORTA} -s {IP} -j DROP /sbin/iptables -A OUTPUT -o eth0 -p tcp --destination-port {NUMERO-PORTA} -s {IP/SUBNET} -j DROP
Para bloquear a saída de tráfego pela porta 25, faça o seguinte:
# /sbin/iptables -A OUTPUT -p tcp --dport 25 -j DROP
# /sbin/service iptables save
Você pode bloquear a porta 1234 somente para o ip 192.168.1.2:
# /sbin/iptables -A OUTPUT -p tcp -d 192.168.1.2 --dport 1234 -j DROP
# /sbin/service iptables save
Como visualizar as regras de portas bloqueadas?
Use estes comandos:
# /sbin/iptables -L -n -v
# /sbin/iptables -L -n -v | grep port
# /sbin/iptables -L -n -v | grep -i DROP
# /sbin/iptables -L OUTPUT -n -v
# /sbin/iptables -L INPUT -n -v
Por que o iptables não poderia bloquear todos os protocolos para uma porta?
/sbin/iptables -I INPUT -s 172.131.13.0/16 –dport 33 -j DROP # Dá Erro
Por que temos que especificar o protocolo ao fazer esse tipo de bloqueio por porta?
/sbin/iptables -I INPUT -s 172.131.13.0/16 -p tcp –dport 33 -j DROP # Funciona
Não seria muito mais simples o comando que dá erro em caso de bloquear a porta, já que vamos bloquear, inutilizar, seria mais interessante bloquear para todos os protocolos.