quinta-feira, 28 de junho de 2012

Básico do Iptables para Ubuntu Server Edition


Iptables é um firewall, instalado por padrão no Ubuntu Server. Na instalação normal do Ubuntu, o iptables é instalado mas todo tráfego é permitido (o firewall é ineficaz / inativo).

Tem muita informação disponível a respeito do iptables, mas de modo muito complexo, se você está em busca de como fazer de forma simples, este How To é para você.


Comando Básicos
Digitando:


# sudo iptables -L
listará suas regras correntes no iptables. Se você já configurou seu servidor e não tem nenhuma regra, você deverá ver:


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
Permitindo Sessões Estabelecidas
Nós podemos permitir que sessões estabelecidas recebam tráfego:


# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Permitindo Tráfego de Entrada em Portas Específicas
Você pode começar impedindo o tráfego, mas você pode estar trabalhando em SSH, onde você deve permitir SSH antes de bloquear qualquer coisa.

Para permitir tráfego de entrada na porta 22 (tradicionalmente usada pelo SSH), você pode dizer ao iptables para permitir todo tráfego TCP na porta 22 do seu adaptador de rede.


# iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT
Especificamente isso adiciona (-A) à tabela INPUT (entrada) a regra que diz que qualquer tráfego para a interface (-i) eth0 na porta destinada ao ssh, o iptables poderá pular (-j), ou escolher a ação, ACCEPT.

Vamos verificar as regras: (somente as primeiras linhas serão mostradas aqui, você verá mais)


# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
Agora, vamos permitir todo o tráfego da web:


# iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT
Verificando nossas regras, nós temos:


# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
Nós permitimos especificamente o tráfego tcp ao ssh e portas web, mas como não bloqueamos nada, todo o tráfego continua chegando.

Bloqueando Tráfego
Uma vez feita a decisão sobre o pacote, nenhuma regra o afetará. Como nossas regras permitindo ssh e tráfego web vêm primeiro, e como nossa regra para bloquear todo o tráfego vêm depois delas, nós podemos permanecer aceitando o tráfego que queremos. Tudo que precisamos fazer é colocar a regra para bloquear todo o tráfego no fim. O comando -A diz ao iptables para adicionar a regra no final, então nós usaremos isso de novo.


# iptables -A INPUT -j DROP
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
DROP       all  --  anywhere             anywhere
Pelo motivo de não especificarmos uma interface ou protocolo, qualquer tráfego de qualquer porta em qualquer interface está bloqueado, exceto para a web e ssh.

Editando o iptables
O único problema com nossa configuração é que até a porta "loopback" está bloqueada. Nós podemos escrever a regra de liberação somente para eth0 especificando -i eth0, mas nós podemos ainda adicionar a regra para o "loopback". Se nós adicionarmos essa regra ela virá muito tarde - depois que todo o tráfego foi liberado. Nós precisamos inserir essa regra na quarta linha.


# iptables -I INPUT 4 -i lo -j ACCEPT
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
As útlimas duas linhas parecem quase as mesmas, então vamos listar o iptables com um detalhe maior.


# iptables -L -v
Logando
Nos exemplos abaixo, nenhum dos tráfegos serão logados. Se você quiser logar pacotes liberados ao syslog, esse é o método mais rápido:


# iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
Veja a seção Dicas para mais detalhes sobre logar.

Salvando o Iptables
Se você fosse reiniciar a sua máquina agora a configuração do seu iptables desapareceria. Ao invés de escrevê-la toda vez que reinicia você pode salvar a configuração e deixá-la inicializando automaticamente. Para salvar as configurações você pode usar iptables-save e iptables-restore.

Configuração na inicialização
Salve as regras do seu firewall num arquivo


# iptables-save > /etc/iptables.up.rules
Modifique o script /etc/network/interfaces para aplicar as regras automaticamente (a última linha foi a adicionada)


auto eth0
iface eth0 inet dhcp
  pre-up iptables-restore < /etc/iptables.up.rules
Você também pode preparar um conjunto de regras para quando desligar, e aplicá-las automaticamente


auto eth0
iface eth0 inet dhcp
  pre-up iptables-restore < /etc/iptables.up.rules
  post-down iptables-restore < /etc/iptables.down.rules
Dicas
Se você edita o iptables regularmente

Os passos abaixo tratam de como configurar as regras de seu firewall e presume que elas são relativamente estáticas (e para a maioria das pessoas deve ser). Mas se você faz muito trabalho de desenvolvimento você pode querer ter sua iptables salva em todo reboot. Você pode adicionar uma linha como essa em /etc/network/interfaces:


  pre-up iptables-restore < /etc/iptables.up.rules
  post-down iptables-save > /etc/iptables.up.rules
A linha "post-down iptables-save > /etc/iptables.up.rules" vai salvar as regras para serem usadas no próximo boot.

Usando iptables-save/restore para testar as regras

Se você editar seu iptables além desse tutorial, você pode querer usar o iptables-save e iptables-restore para editar e testar suas regras. Para fazer isso abra o arquivo de regras no seu editor de textos (no exemplo usarei o gedit).


# iptables-save > /etc/iptables.test.rules
# gedit /etc/iptables.test.rules
Você verá um arquivo parecido com o exemplo abaixo:


# Generated by iptables-save v1.3.1 on Sun Apr 23 06:19:53 2006
*filter
:INPUT ACCEPT [368:102354]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [92952:20764374]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
COMMIT
# Completed on Sun Apr 23 06:19:53 2006
Observe que esses são comandos iptables, exceto o comando iptable. Sinta-se livre em editar esse arquivo e salvar quando terminar. Então vamos testar:


# iptables-restore < /etc/iptables.test.rules
Depois de testar, se você não adicionou o comando iptables-save sobre seu /etc/network/interfaces lembre-se de não perder suas alterações:


# iptables-save > /etc/iptables.up.rules
Logging mais detalhado

Para mais detalhes no seu syslog, você pode querer criar uma corrente (Chain) adicional. Segue um exemplo muito breve do meu /etc/iptables.up.rules mostrando como eu configurei minha iptables para logar ao syslog:


# Generated by iptables-save v1.3.1 on Sun Apr 23 05:32:09 2006
*filter
:INPUT ACCEPT [273:55355]
:FORWARD ACCEPT [0:0]
:LOGNDROP - [0:0]
:OUTPUT ACCEPT [92376:20668252]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j LOGNDROP
-A LOGNDROP -p tcp -m limit --limit 5/min -j LOG --log-prefix "Denied TCP: " --log-level 7
-A LOGNDROP -p udp -m limit --limit 5/min -j LOG --log-prefix "Denied UDP: " --log-level 7
-A LOGNDROP -p icmp -m limit --limit 5/min -j LOG --log-prefix "Denied ICMP: " --log-level 7
-A LOGNDROP -j DROP
COMMIT
# Completed on Sun Apr 23 05:32:09 2006
Note uma corrente (CHAIN) chamada LOGNDROP no começo do arquivo. Também, o padrão DROP embaixo da corrente INPUT foi modificado para LOGNDROP e adiciona descrições de protocolo então faz sentido olhar para o log. Por último nós permitimos o tráfego no fim da corrente LOGNDROP. Segue uma idéia do que está acontecendo:

--limit sets the number of times to log the same rule to syslog

--log-prefix "Denied..." adds a prefix to make finding in the syslog easier

--log-level 7 sets the syslog level to informational (see man syslog for more detail, but you can probably leave this)

Desabilitando o firewall

Se você necessitar desabilitar o firewall temporariamente poderá cancelar todas as regras usando


# sudo iptables -F
Configuração simples por uma Interface Gráfica
Um usuário iniciante pode facilmente usar o FireStarter (Programa com Interface Gráfica - GUI), disponível nos repositórios (Synaptic ou apt-get) para configurar as suas regras de iptables sem precisar de nenhum conhecimento em linha de comando. A configuração é simples, mas pode não ser suficiente para usuários avançados. Entretanto, pode atender a maioria dos usuários domésticos.

Uma sugestão interessante é utilizar uma política de saída restritiva por padrão, permitindo pela "lista branca" somente as conexões que você realmente precisa, como a porta 80 (comunicação http), porta 443 (https), porta 1863 para o MSN, etc, na aba "Política" que fica dentro do FireStarter. Você também pode usá-lo para ver as conexões ativas de e para o seu computador. O Firewall fica ligado assim que é configurado através do assistente.

 Usuários de conexões DialUp terão de especificar para uma inicialização automática quando em ligações dial up, no assistente de configuração.

Página do FireStarter: http://www.fs-security.com/ (novamente, disponível nos repositórios. não há nenhuma necessidade de compilá-lo) Tutorial: http://www.fs-security.com/docs/tutorial.php

Nota pessoal do autor: Infelizmente, o FireStarter não tem uma opção para bloquear (ou perguntar a opção ao usuário) conexões específicas de programas e aplicações... então, uma vez que você libera a porta 80 (para acesso à web, por exemplo), qualquer programa que utilize a porta 80 poderá se conectar em qualquer servidor e fazer o que bem entender...


ESTE TUTORIAL NÃO ESTÁ COMPLETO E DEVE SER COMPLETADO POR ALGUÉM QUE SAIBA MAIS QUE EU! OBRIGADO

Traduzido por: RodrigodaSilvaVaz
Fonte: http://wiki.ubuntu-br.org/Iptables

Nenhum comentário :

Postar um comentário

Total de visualizações de página