Pesquisa de site

Iptables para iniciantes


O Iptables é considerado um dos principais recursos defensivos para muitos administradores de sistema, apesar de ter sido substituído pelo Nftables. Os principais fabricantes de redes incorporaram o Iptables ao hardware ainda em ambientes de produção.

O Iptables é altamente versátil e aceita comandos direto do usuário que pode carregar e descarregar regras de acordo com a necessidade.

Este tutorial mostra como proteger um servidor da Web, encaminhar conexões para endereços IP internos de nossa LAN e oferecer serviços específicos apenas para endereços IP da lista de permissões.

Nota:Este tutorial do Iptables foi lançado pela primeira vez há dois anos e atualizado em 23/05/2021 com exemplos aprimorados e capturas de tela de melhor qualidade.

Como instalar

Iptables são omitidos por padrão em distribuições que incorporam Nftables.

Para instalar o Iptables em distribuições Linux baseadas em Debian, execute o seguinte comando:

sudo apt update && apt install iptables

Abrindo portas HTTP e HTTPS

Primeiro de tudo, vamos adicionar todas as políticas ACCEPT começando com o servidor web.

Observação: Se você criar um script com regras, não precisará usar sudo.

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Para ver as regras adicionadas, execute “iptables -L

Onde :

Iptables = chama o programa

-A=adiciona uma regra

INPUT=tráfego de entrada

-p=protocolo

–ddport=porta de destino

-j = especifica o “alvo”; o alvo é o tipo de política: ACCEPT, DROP, REJECT (Built-in)…

Iptables -L=lista todas as regras carregadas de iptables (Iptables -L -v=o mesmo com verbosidade.)

No exemplo acima, instruímos o Iptables a adicionar uma regra para que o tráfego de entrada através do protocolo TCP e as portas 80 (http) e 443 (https) sejam aceitas.

Podemos alterar o comando para aceitar a conexão apenas de um IP específico adicionando o parâmetro “-s ”:

sudo iptables -A INPUT -s 127.0.0.1 -p tcp --dport 80 -j ACCEPT

Onde :

s = origem

Você também pode testar seu firewall com nmap:

Nota:No exemplo acima, a porta 443 não é mostrada porque o servidor não possui um certificado SSL configurado adequadamente.

Nota: Para mais informações sobre o Nmap, você pode ler isto.

Protegendo seu servidor com Iptables:

#Open HTTP and HTTPS services.

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -p tcp --dport 443 -j ACCEPT

#Open SSH Port Service

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Onde os novos parâmetros são:

-m significa “correspondência” e é usado para chamar extensões do Iptables como conntrack, que não faz parte das funções principais do iptables.

conntrack = Permite rastrear informações sobre conexões como endereços específicos ou, neste caso, o estado da conexão. Isso deve ser usado com cuidado, pois muitas regras para defender servidores de alguns ataques usam conntrack enquanto o hardware limita seu uso, e tal limitação pode ser usada para sobrecarregar os recursos do servidor.

-ctstate = determina o estado da regra a ser correspondida; os estados possíveis são: NEW, ESTABLISHED, RELATED e INVALID.

#Protect your SSH Service against brute force attacks by allowing only a specific IP

to access iptables -A INPUT -p tcp -s X.X.X.X --dport 22 -m conntrack --ctstate NEW,

ESTABLISHED -j ACCEPT

#Protect your SSH Service against brute force attacks by limiting connection attempts
Iptables -A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j 22-test

Iptables -A 22-test -m recent --name CONNECTIONS --set --mask 255.255.255.255 --rsource

Iptables -A 22-test -m recent --name CONNECTIONS --rcheck --mask 255.255.255.255

--rsource --seconds 30 --hitcount 3 -j 22-protection

Iptables -A 22-test -j ACCEPT

Iptables -A 22-protection -j DROP

Onde :

No primeiro liNe, nossa regra diz “-m conntrack –ctstate NEW, ” o que significa que se a conexão for nova, passe para a regra “22-test ”.

A segunda linha diz que os pacotes netmask 255.255.255.255 são nomeados como CONNECTIONS.

A terceira linha diz que se CONNECTIONSfor superior a 3 vezes em 30 segundos, o firewall continua aplicando a cadeia 22-protection. A quarta linha diz que se as CONNECTIONS não forem vistas mais de 3 vezes em 30 segundos, elas poderão ser aceitas.

A quinta linha, que pertence à cadeia 22-proteção , diz para descartar CONNECTIONS se elas parecem ser mais de 3 vezes em 30 segundos.

Agora, para terminar, vamos recusar todas as conexões de entrada não permitidas e permitir todo o tráfego de saída:

iptables -P OUTPUT ACCEPT

iptables -P INPUT DROP

P refere-se à política da cadeia; lembre-se de que o alvo é a política ACCEPT, DROP, REJECT. Nesse caso, estamos dizendo que a política padrão para o tráfego de saída é aceitar e a política padrão para o tráfego de entrada é recusar, a menos que especifiquemos algo diferente nas regras anteriores. Este é um firewall muito básico que não inclui regras para muitos ataques, para fins de aprendizado e não para produção; no final do artigo, anexo um firewall que usei para produção em um servidor; tem comentários explicando cada regra.

ENCAMINHAR UMA CONEXÃO PARA UMA PORTA ESPECÍFICA PARA UM ENDEREÇO IP ESPECÍFICO

Isso também é muito útil para usuários de desktop que desejam rotear uma conexão por meio de um dispositivo específico; pode ser útil até mesmo para jogadores; normalmente, fazemos isso nas configurações do roteador, mas vamos supor que o dispositivo de roteamento esteja executando o Iptables.

iptables -A PREROUTING -t nat -p tcp -d X.X.X.X --dport 8080 -j DNAT --to-destination Y.Y.Y.Y:80

iptables -A POSTROUTING -t nat -p tcp -j SNAT --to-source X.X.X.X

As regras acima invocam NAT (Network Address Translation) para especificar conexões através do protocolo TCP para o endereço X.X.X.X, e a porta 8080 será redirecionada para o endereço Y.Y.Y.Y, porta 80. A segunda regra especifica que as respostas devem ser enviadas para o endereço de origem (X.X.X.X). Podemos usar essas regras para permitir o acesso a uma câmera IP, habilitar jogos online com redes externas, etc.

Este tutorial foi criado para apresentar o Iptables aos iniciantes e explica apenas um número limitado de fundamentos. Abaixo você pode ver uma amostra de um firewall bem planejado usado para um servidor de produção; inclui algumas das regras que já vimos até regras mais complexas para prevenir DDoS, entre outros tipos de ataques.

Bônus: amostra de firewall de produção

iptables -F

#---- Enable bad error message protection

enable /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

#---- Turn on reverse path filtering. Safer, but breaks asymmetric routing and/or IPSEC

enable /proc/sys/net/ipv4/conf/*/rp_filter

#---- Don't accept source routed packets. Source routing is rarely used for legitimate

purposes disable /proc/sys/net/ipv4/conf/*/accept_source_route

#---- Disable ICMP redirect acceptance which can be used to alter your routing tables

disable /proc/sys/net/ipv4/conf/*/accept_redirects

#---- As we don't accept redirects, don't send Redirect messages either

disable /proc/sys/net/ipv4/conf/*/send_redirects

#---- Ignore packets with impossible addresses

disable /proc/sys/net/ipv4/conf/*/log_martians

#---- Protect against wrapping sequence numbers and aid round trip time measurement

enable /proc/sys/net/ipv4/tcp_timestamps

#---- Help against syn-flood DoS or DDoS attacks using particular choices of initial

TCP sequence numbers enable /proc/sys/net/ipv4/tcp_syncookies

#---- Use Selective ACK which can be used to signify that specific packets are missing

disable /proc/sys/net/ipv4/tcp_sack

modprobe nf_conntrack_ipv4

modprobe nf_nat

# modprobe nf_conntrack_ipv6

# modprobe nf_conntrack_amanda

# modprobe nf_nat_amanda

modprobe nf_conntrack_h323

modprobe nf_nat_h323

modprobe nf_conntrack_ftp

modprobe nf_nat_ftp

# modprobe nf_conntrack_netbios_ns

# modprobe nf_conntrack_irc

# modprobe nf_nat_irc

# modprobe nf_conntrack_proto_dccp

# modprobe nf_nat_proto_dccp

modprobe nf_conntrack_netlink

# modprobe nf_conntrack_pptp

# modprobe nf_nat_pptp

# modprobe nf_conntrack_proto_udplite

# modprobe nf_nat_proto_udplite

# modprobe nf_conntrack_proto_gre

# modprobe nf_nat_proto_gre

# modprobe nf_conntrack_proto_sctp

# modprobe nf_nat_proto_sctp

# modprobe nf_conntrack_sane

modprobe nf_conntrack_sip

modprobe nf_nat_sip

# modprobe nf_conntrack_tftp

# modprobe nf_nat_tftp

# modprobe nf_nat_snmp_basic

#Now we can start adding selected services to our firewall filter. The first such thing

is a localhost interface iptables -A INPUT -i lo -j ACCEPT

#We told the firewall to take all incoming packets with tcp flags NONE and just DROP them.
iptables -A INPUT -p tcp ! -m conntrack --ctstate NEW -j DROP

#We tell iptables to add (-A) a rule to the incoming (INPUT)- SSH works on port 50683

instead 22.

iptables -A INPUT -p tcp -m tcp --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --set

--name SSH -j ACCEPT

iptables -A INPUT -p tcp --dport 50683 -m recent --update --seconds 60 --hitcount 4

--rttl --name SSH -j LOG --log-prefix "SSH_brute_force "

iptables -A INPUT -p tcp --dport 50683 -m recent --update --seconds 60 --hitcount 4

--rttl --name SSH -j DROP

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --set

--name SSH

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -j SSH_WHITELIST

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --update

--seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_bru

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --update

--seconds 60 --hitcount 4 --rttl --name SSH -j DROP

#Now I allow imap,and smtp.
-A INPUT -p tcp --dport 25 -j ACCEPT

# Allows pop and pops connections

-A INPUT -p tcp --dport 110 -j ACCEPT

-A INPUT -p tcp --dport 995 -j ACCEPT

############ IMAP & IMAPS ############

-A INPUT -p tcp --dport 143 -j ACCEPT

-A INPUT -p tcp --dport 993 -j ACCEPT

########### MYSQL ###################

iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT

########## R1soft CDP System ###############

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 1167 -j ACCEPT

############### outgoing ###################

iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

### Allow ongoing, block incoming not defined ###

iptables -P OUTPUT ACCEPT

iptables -P INPUT DROP

iptables -L -n

iptables-save | tee /etc/iptables.test.rules

iptables-restore < /etc/iptables.test.rules

#service iptables restart