Pesquisa de site

Como configurar um firewall usando Iptables no Ubuntu 12.04


Status: Obsoleto

Este artigo aborda uma versão do Ubuntu que não é mais suportada. Se você atualmente opera um servidor executando o Ubuntu 12.04, é altamente recomendável atualizar ou migrar para uma versão suportada do Ubuntu:

  • Atualize para o Ubuntu 14.04.
  • Atualização do Ubuntu 14.04 para o Ubuntu 16.04
  • Migre os dados do servidor para uma versão compatível

Razão:

Veja em vez disso:

Sobre o Iptables

Para tornar um servidor mais seguro após a configuração inicial, o Ubuntu vem com iptables, que é o firewall padrão da distribuição. No início, embora o firewall do Ubuntu esteja configurado, ele é configurado para permitir todo o tráfego de entrada e saída em um servidor privado virtual. Para habilitar alguma proteção mais forte no servidor, podemos adicionar algumas regras básicas de iptables.

As regras do iptables vêm de uma série de opções que podem ser combinadas para criar cada processo específico. Cada pacote que atravessa o firewall é verificado por cada regra em ordem. Assim que corresponde a uma regra, o pacote segue a ação associada, caso contrário, ele segue a linha.

Observação: Este tutorial aborda a segurança do IPv4. No Linux, a segurança do IPv6 é mantida separadamente do IPv4. Por exemplo, \iptables\ só mantém regras de firewall para endereços IPv4, mas tem uma contraparte IPv6 chamada \ip6tables\, que pode ser usada para manter regras de firewall para endereços de rede IPv6.

Se o seu VPS estiver configurado para IPv6, lembre-se de proteger as interfaces de rede IPv4 e IPv6 com as ferramentas apropriadas. Para obter mais informações sobre ferramentas IPv6, consulte este guia: Como configurar ferramentas para usar IPv6 em um Linux VPS

Comandos do Iptables

Embora este tutorial aborde uma quantidade limitada de comandos que forneceriam a um servidor alguma segurança básica, há uma variedade de casos específicos e sutis que podem ser desenvolvidos para o iptables. Abaixo estão alguns dos comandos mais úteis para desenvolver um firewall para o seu VPS, mas lembre-se de que esta é uma lista curta e há uma variedade de outras opções.

-A: (Append), adds a rule to iptables
-L:  (List), shows the current rules
-m conntrack: allows rules to be based on the current connection state, elaborated in the the --cstate command.
--cstate: explains the states that connections can be in, there are 4: New, Related, Established, and Invalid
-p: (protocol), refers to the the protocol of the rule or of the packet to check.The specified protocol can be one of tcp, udp, udplite, icmp, esp, ah, sctp or the special keyword "all".
--dport: (port), refers to the the port through which the machine connects
-j: (jump), this command refers to the action that needs to be taken if something matches a  rule perfectly. It translates to one of four possibilities:
	-ACCEPT: the packet is accepted, and no further rules are processed
	-REJECT: the packet is rejected, and the 	sender is notified, and no further rules are processed
	-DROP: the packet is rejected, but the 	sender is not notified, and no further rules are processed
	-LOG: the packet is accepted but logged, and the following rules are processed 
-I: (Insert), adds a rule between two previous ones
-I INPUT 3: inserts a rule to make it the third in the list
-v: (verbose), offers more details about a rule

Criando as regras do Iptables:

Se você digitar o seguinte, poderá ver as regras atuais do iptables:

sudo iptables -L

Eles devem ficar assim:

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               destination

Se você tiver outro conjunto de regras em vigor ou quiser começar do zero, sempre poderá definir as regras de volta ao padrão, liberando e excluindo todas elas:

sudo iptables -F

Além disso, se você deseja acelerar seu trabalho com iptables, pode incluir -n no comando. Essa opção desativa as pesquisas de DNS e impede que o comando tente encontrar o reverso de cada IP no conjunto de regras. Você poderia usar isso para listar regras, como um exemplo:

iptables -L -n

Um firewall básico

Tal como está, as regras atuais permitem todas as conexões, tanto de entrada quanto de saída. Não há nenhuma medida de segurança em vigor. À medida que construímos a tabela, lembre-se de que, assim que um pacote for ACEITADO, REJEITADO ou ABANDONADO, nenhuma outra regra será processada. Portanto, as regras que vêm primeiro têm prioridade sobre as posteriores.

Ao criar as regras, temos que nos certificar de evitar o bloqueio acidental do SSH (o método pelo qual nos conectamos ao servidor).

Para começar, certifique-se de permitir que todas as conexões atuais, todas as conexões no momento da regra, permaneçam online:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Podemos ir em frente e dividir isso:

  1. -A diz ao iptables para anexar uma regra à tabela.
  2. INPUT designa esta regra como parte da cadeia de entrada.
  3. m conntrack seguido de --cstate ESTABLISHED,RELATED garante que o resultado desta regra será aplicado apenas às conexões atuais e as relacionadas a elas são permitidas
  4. -j ACCEPT diz ao pacote para JUMP aceitar e as conexões ainda estão em vigor.

Depois de termos certeza de que todas as conexões atuais com o servidor privado virtual podem permanecer ininterruptas, podemos começar a bloquear outras conexões inseguras.

Vamos supor que queremos bloquear todo o tráfego de entrada, exceto aqueles que chegam em 2 portas comuns: 22 para SSH e 80 para tráfego da web. Prosseguimos permitindo todo o tráfego nas portas designadas com os seguintes comandos:

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

Em ambos os comandos, a opção -p representa o protocolo com o qual a conexão está sendo feita, neste caso tcp, enquanto a opção --dport especifica a porta pela qual o pacote está sendo transmitido.

Depois de garantirmos que o tráfego desejável passará pelo firewall, podemos concluir bloqueando todo o tráfego restante de acessar nosso servidor virtual. Como esta é a última regra da lista, todo o tráfego que corresponder a qualquer uma das regras anteriores no iptables não será afetado e será tratado conforme configuramos anteriormente.

Vamos fazer uma regra para bloquear todo o tráfego restante:

sudo iptables -P INPUT DROP

Com isso, podemos ver como ficam nossas regras atualizadas:

sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http 

Estamos quase terminando. No entanto, estamos perdendo mais uma regra. Precisamos fornecer ao nosso VPS acesso de loopback. Se adicionássemos a regra agora sem mais qualificadores, ela iria para o final da lista e, como seguiria a regra de bloquear todo o tráfego, nunca seria efetivada.

Para contornar esse problema, precisamos criar essa regra primeiro na lista, usando a opção INPUT:

sudo iptables -I INPUT 1 -i lo -j ACCEPT

  1. -I INPUT 1 coloca esta regra no início da tabela
  2. lo refere-se à interface de loopback
  3. -j ACCEPT então garante que o tráfego de loopback será aceito

Agora terminamos de criar um firewall básico. Suas regras devem ficar assim (podemos ver os detalhes do iptable digitando -v):

sudo iptables -L -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
 1289 93442 ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    2   212 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http     

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes)
 pkts bytes target     prot opt in     out     source               destination       

No entanto, assim que o servidor virtual for reinicializado, as regras do iptables serão apagadas. A próxima etapa será salvar e restaurar as regras do iptables.

Salvando Regras do Iptables

Embora as regras do iptables sejam eficazes, elas serão excluídas automaticamente se o servidor for reinicializado. Para garantir que eles permaneçam em vigor, podemos usar um pacote chamado IP-Tables persistente.

Podemos instalá-lo usando o apt-get:

sudo apt-get install iptables-persistent

Durante a instalação, você será perguntado se deseja salvar as regras do iptables tanto para as regras IPv4 quanto para as regras IPv6. Diga sim para ambos.

Suas regras serão salvas em /etc/iptables/rules.v4 e /etc/iptables/rules.v6.

Quando a instalação estiver concluída, inicie o iptables-persistent em execução:

sudo service iptables-persistent start

Após qualquer reinicialização do servidor, você verá que as regras permanecem em vigor.