A seguir mostraremos a sintaxe iptables e suas opções, tratando somente pacotes de dados da tabela filter, criando regras para liberar, bloquear ou rejeitar os pacotes de dados de trafego normal, sem a utilização de mascaramento (tabela NAT).
Sintaxe:
iptables -t [tabela] <ordem> <chain> [condições] -j <ação>
Tabela: Nesse caso estamos tratando da tabela filter, como já falamos anteriormente, esta tabela é a padrão e não é necessário explicitá-la.
Ordem:
a. -I --> Insere a regra no início da chain.
b. -A --> Insere a regra no final da chain.
PS: O chain é analisada da primeira regra para a última, isso quer dizer que a analise da regra é feita do inicio da chain para o final, essa análise se segue até encontrar uma regra se enquadre ao pacote. Ao localizar essa regra ele entra e é processado, deixando as regras subsequentes sem serem analisadas. Por isso é importante tratar as regras da mais restritiva para a menos restritiva.
Abaixo colocamos 3 regras, a primeira regra coloca a política da chain INPUT como DROP, isso quer dizer que só passa um pacote se ele estiver explicito em uma regra. A segunda regra libera acesso a porta 22 para a rede 10.0.0.0/24 e a terceira libera acesso do host 10.0.0.49 a porta 22 do host.
Exemplo:
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp -s 10.0.0.49 --dport 22 -j ACCEPT
No exemplo acima a terceira regra nunca fará match (nenhum pacote irá utilizá-la), pois a segunda regra fará match (regra mais genérica) caso o host de IP 10.0.0.49 tente acessar o host na porta 22.
Chain:
Iremos dizer a que chain a regra se refere (INPUT, OUTPUT, FORWARD).
Condição (match):
- -p = protocolo (all, tcp, udp, icmp etc)
- --sport = porta origem
- --dport = porta destino
- -s = IP origem
- -d = IP destino
- -i = interface de entrada
- -o = interface de saída
- -m = match
Ação: É onde informamos o que devemos fazer com o pacote, ignorar (DROP), aceitar (ACCEPT) ou rejeitar (REJECT).
Abaixo colocamos alguns exemplos de regras:
Bloquear o protocolo icmp (ping):
# iptables -A INPUT -p icmp --icmp-type ping -j DROP
Só vai liberar o acesso via ssh para o host 10.3.4.11, avisando que o pacote foi rejeitado para os outros hosts:
# iptables -A INPUT -p tcp --dport 22 -s ! 10.3.4.11 -j REJECT
PS: O símbolo de "!" significa uma exceção a regra. Em nosso exemplo ele esta tratando o host de IP 10.3.4.11 como exceção a regra. Isso quer dizer que o único host que pode acessar o "firewall" é o 10.3.4.11. A regra irá rejeitas qualquer outro host.
Só vai liberar o protocolo icmp (ping) para o host 10.3.1.10. Ignorando o ping para qualquer outro host:
# iptables -A INPUT -p icmp --icmp-type ping -s ! 10.3.1.10 -j DROP
Exemplo de liberação do smtp (tcp 25) e-mail, impedir que um servidor de e-mail interno envie e-mail para fora da empresa. Normalmente isso evita que spammers, que por algum motivo tenham conseguido "acesso" a um de seus servidores, instale um servidor de e-mail e o utilize para enviar spam.
# iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 25 -j REJECT
Essa regra se traduz em: os pacotes tcp que tiverem vierem através da interface eth1 e destino de saída a eth0 porta 25 deverão ser rejeitados.
No caso de duas redes:
Basta incluir as interfaces referentes a segunda rede:
# iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 25 -j REJECT
# iptables -A FORWARD -i eth2 -o eth0 -p tcp --dport 25 -j REJECT
Bloquear acesso através do endereço físico da placa de rede (MAC):
# iptables -A FORWARD -m mac --mac-source 00:00:AA:BB:11:12 -p tcp --dport 80 -j DROP
Se você tem alguma dúvida para saber o endereço MAC do host basta seguir o seguinte procedimento: dar um ping IP que você precisa saber o MAC e depois o dar comando o "arp".
Match (condição) OUTPUT:
Não deixa o host acessar a porta 80:
# iptables -A OUTPUT -p tcp --dport 80 -j REJECT
Libera somente o superuser (root) para fazer testes via icmp (ping):
# iptables -A OUTPUT -p icmp --icmp-type ping -m owner ! --uid-owner root -j REJECT
Esses foram alguns exemplos do que podemos fazer com o iptables, no que se refere aos pacotes de dados de tráfego normal (sem utilização de mascaramento - NAT). Ainda existem inúmeras formas de filtrarmos os pacotes, contudo são formas mais pontuais, normalmente não utilizaremos nada a mais que essas para esse tipo de filtro.