O QUE SÃO REGRAS?
As regras são como comandos passados ao iptables para que ele realize uma determinada ação (como bloquear ou deixar passar um pacote) de acordo com o endereço/porta de origem/destino, interface de origem/destino, etc. As regras são armazenadas dentro dos chains e processadas na ordem que são inseridas. As regras são armazenadas no kernel, o que significa que quando o computador for reiniciado tudo o que fez será perdido. Por este motivo elas deverão ser gravadas em um arquivo para serem carregadas a cada inicialização.
Um exemplo de regra: iptables -A INPUT -s 123.123.123.1 -j DROP.
As regras são como comandos passados ao iptables para que ele realize uma determinada ação (como bloquear ou deixar passar um pacote) de acordo com o endereço/porta de origem/destino, interface de origem/destino, etc. As regras são armazenadas dentro dos chains e processadas na ordem que são inseridas. As regras são armazenadas no kernel, o que significa que quando o computador for reiniciado tudo o que fez será perdido. Por este motivo elas deverão ser gravadas em um arquivo para serem carregadas a cada inicialização.
Um exemplo de regra: iptables -A INPUT -s 123.123.123.1 -j DROP.
O QUE SÃO CHAINS?
É onde podemos especificar a situação do tratamento dos pacotes, seja qual tabela for.
Existem dois tipos de chains: os embutidos (como os chains INPUT, OUTPUT e FORWARD) e os criados pelo usuário. Os nomes dos chains embutidos devem ser especificados sempre em maiúsculas (note que os nomes dos chains são case-sensitive, ou seja, o chain input é completamente diferente de INPUT).
É onde podemos especificar a situação do tratamento dos pacotes, seja qual tabela for.
Existem dois tipos de chains: os embutidos (como os chains INPUT, OUTPUT e FORWARD) e os criados pelo usuário. Os nomes dos chains embutidos devem ser especificados sempre em maiúsculas (note que os nomes dos chains são case-sensitive, ou seja, o chain input é completamente diferente de INPUT).
O QUE SÃO TABELAS?
Tabelas são os locais usados para armazenar os chains e conjunto de regras com uma determinada característica em comum. As tabelas podem ser referenciadas com a opção -t tabela e existem 3 tabelas disponíveis no iptables:
Tabelas são os locais usados para armazenar os chains e conjunto de regras com uma determinada característica em comum. As tabelas podem ser referenciadas com a opção -t tabela e existem 3 tabelas disponíveis no iptables:
FILTER : responsável pela filtragem de todos os pacotes que passam pelo host, não importando origem e destino;
NAT : responsável pelo controle dos pacotes que passam pelo host, mas cuja origem ou destino não é o mesmo.
MANGLE : permite alterar características específicas do pacote, como por exemplo: o TOS (Tipo de Serviço) o que permite implementar um sistema simples de QOS ( qualidade de serviço).
8.0
-FLUXOS DO IPTABLES 8.1
– A tabela FILTER
É a tabela padrão do Netfilter e trata das situações implementadas por um Firewall filtro de pacotes. Estas situações são:
-INPUT – Tudo o que entra no Host -FORWARD – Tudo o que chega ao Host mas deve ser redirecionado a um host secundário ou outra interface de rede.
-OUTPUT – Tudo o que sai do Host
Sintaxe: iptables -t filter
Sintaxe: iptables -t filter
A tabela NAT
Usada para dados que gera outra conexão (masquerading, source nat, destination nat, port forwarding, proxy transparente são alguns exemplos). Possui 3 chains padrões:
-PREROUTING – Utilizada quando há necessidade de se fazer alterações em pacotes antes que os mesmos sejam roteados.
-OUTPUT – Trata os pacotes emitidos pelo Host Firewall, ou seja, possibilita o redirecionamento dos pacotes que foram emitidos pelo host.
-POSTROUTING – Utilizado quando há necessidade de se fazer alterações em pacotes após o tratamento de roteamento.
Sintaxe: iptables -t nat
Usada para dados que gera outra conexão (masquerading, source nat, destination nat, port forwarding, proxy transparente são alguns exemplos). Possui 3 chains padrões:
-PREROUTING – Utilizada quando há necessidade de se fazer alterações em pacotes antes que os mesmos sejam roteados.
-OUTPUT – Trata os pacotes emitidos pelo Host Firewall, ou seja, possibilita o redirecionamento dos pacotes que foram emitidos pelo host.
-POSTROUTING – Utilizado quando há necessidade de se fazer alterações em pacotes após o tratamento de roteamento.
Sintaxe: iptables -t nat
A tabela MANGLE
Implementa alterações especiais em pacotes em um nível mais complexo. A tabela mangle é capaz, por exemplo, de alterar a prioridade de entrada e saída de um pacote baseado no tipo de serviço (TOS) o qual o pacote se destinava. Suas situações são:
-PREROUTING – Modifica pacotes dando-lhes um tratamento especial antes que os mesmos sejam roteados
-OUTPUT – Altera pacotes de forma “especial” gerados localmente antes que os mesmos sejam roteados.
Implementa alterações especiais em pacotes em um nível mais complexo. A tabela mangle é capaz, por exemplo, de alterar a prioridade de entrada e saída de um pacote baseado no tipo de serviço (TOS) o qual o pacote se destinava. Suas situações são:
-PREROUTING – Modifica pacotes dando-lhes um tratamento especial antes que os mesmos sejam roteados
-OUTPUT – Altera pacotes de forma “especial” gerados localmente antes que os mesmos sejam roteados.
Sintaxe: iptables -t mangle 9
.0 – COMANDOS DO IPTABLES (em MAIÚSCULO)
-A – Adiciona (anexa) uma nova entrada ao fim da lista de regras;
iptables -A INPUT (Adiciona uma nova regra ao final da lista referente a INPUT chain)
Como exemplo vamos criar uma regra que bloqueia o acesso a nossa própria máquina (127.0.0.1 loopback). Primeiro daremos um ping para verificar seu funcionamento: #ping 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0.6 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=255 time=0.5 ms ---127.0.0.1 ping statistics --2
packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.5/0.5/0.6 ms
Ok, a máquina responde, agora vamos incluir uma regra no chain INPUT (-A INPUT) que bloqueie (-j DROP) qualquer acesso indo ao endereço 127.0.0.1 (-d 127.0.0.1):
iptables -t filter -A INPUT -d 127.0.0.1 -j DROP
packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.5/0.5/0.6 ms
Ok, a máquina responde, agora vamos incluir uma regra no chain INPUT (-A INPUT) que bloqueie (-j DROP) qualquer acesso indo ao endereço 127.0.0.1 (-d 127.0.0.1):
iptables -t filter -A INPUT -d 127.0.0.1 -j DROP
Agora verificamos um novo ping: #ping 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes ---127.0.0.1 ping statistics --2 packets transmitted, 0 packets received, 100% packet loss
Desta vez a máquina 127.0.0.1 não respondeu, pois todos os pacotes com o destino 127.0.0.1 (-d 127.0.0.1) são rejeitados (-j DROP). A opção -A é usada para adicionar novas regras no final do chain. Além de -j DROP que serve para rejeitar os pacotes, podemos também usar -j ACCEPT para aceitar pacotes. A opção -j é chamada de alvo da regra ou somente alvo pois define o destino do pacote que atravessa a regra
-L -A seguinte sintaxe é usada para listar as regras criadas:
Sintaxe: iptables [-t tabela] -L [chain] [opções]
Desta vez a máquina 127.0.0.1 não respondeu, pois todos os pacotes com o destino 127.0.0.1 (-d 127.0.0.1) são rejeitados (-j DROP). A opção -A é usada para adicionar novas regras no final do chain. Além de -j DROP que serve para rejeitar os pacotes, podemos também usar -j ACCEPT para aceitar pacotes. A opção -j é chamada de alvo da regra ou somente alvo pois define o destino do pacote que atravessa a regra
-L -A seguinte sintaxe é usada para listar as regras criadas:
Sintaxe: iptables [-t tabela] -L [chain] [opções]
Onde:
tabela É uma das tabelas usadas pelo iptables. Se a tabela não for especificada, a tabela filter será usada como padrão.
tabela É uma das tabelas usadas pelo iptables. Se a tabela não for especificada, a tabela filter será usada como padrão.
chain Um dos chains disponíveis na tabela acima ou criado pelo usuário. Caso o chain não seja especificado, todos os chains da tabela serão mostrados.
opções As seguintes opções podem ser usadas para listar o conteúdo de chains:
-v -Exibe mais detalhes sobre as regras criadas nos chains.
-n -Exibe endereços de máquinas/portas como números ao invés de tentar a resolução DNS e consulta ao /etc/services. A resolução de nomes pode tomar muito tempo dependendo da quantidade de regras que suas tabelas possuem e velocidade de sua conexão.
-x -Exibe números exatos ao invés de números redondos. Também mostra a faixa de portas de uma regra
de firewall.
--line-numbers -Exibe o número da posição da regra na primeira coluna da listagem.
Para listar a regra criada anteriormente usamos o comando:
Para listar a regra criada anteriormente usamos o comando:
#iptables -t filter -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all --anywhere localhost
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all --anywhere localhost
O comando iptables -L INPUT -n tem o mesmo efeito, a diferença é que são mostrados números ao invés de nomes:
#iptables -L INPUT -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all --.0.0.0/0 127.0.0.1
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all --.0.0.0/0 127.0.0.1
#iptables -L INPUT -n -–line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all --0.0.0.0/0 127.0.0.1
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all --0.0.0.0/0 127.0.0.1
#iptables -L INPUT -n -v
Chain INPUT (policy ACCEPT 78 packets, 5820 bytes)
pkts bytes target prot opt source destination
2 194 DROP icmp --* * 0.0.0.0/0 127.0.0.1
Chain INPUT (policy ACCEPT 78 packets, 5820 bytes)
pkts bytes target prot opt source destination
2 194 DROP icmp --* * 0.0.0.0/0 127.0.0.1
Os campos assim possuem o seguinte significado:
Chain INPUT Nome do chain listado (policy ACCEPT 78 packets, 5820 bytes) Policiamento padrão do chain pkts Quantidade de pacotes que atravessaram a regra.
bytes Quantidade de bytes que atravessaram a regra. Pode ser referenciado com K (Kilobytes),
M (Megabytes), G (Gigabytes).
target O alvo da regra, o destino do pacote. Pode ser ACCEPT, DROP ou outro chain.
prot Protocolo especificado pela regra. Pode ser udp, tcp, icmp ou all.
opt Opções extras passadas a regra. Normalmente “!”
in Interface de entrada (de onde os dados chegam).
out Interface de saída (para onde os dados vão).
source Endereço de origem.
destination Endereço de destino.
outras opções Estas opções normalmente aparecem quando são usadas a opção -x:
dpt ou dpts -Especifica a porta ou faixa de portas de destino.
reject-with icmp-port-unreachable -Significa que foi usado o alvo REJECT
-F -Para limpar todas as regras de um chain, use a seguinte sintaxe: iptables [-t tabela] [-F chain]
Onde:
tabela -Tabela que contém o chain que desejamos zerar.
Chain -Chain que desejamos limpar. Caso um chain não seja especificado, todos os chains da tabela serão limpos.
iptables -t filter -F INPUT (Remove todas as regras referentes a INPUT chain)
iptables -t filter -F
-D – Apaga uma regra especificada da lista;
iptables -D INPUT (Apaga a regra inserida anteriormente apenas trocando o comando -A pelo -D; o comando -D também lhe permite apagar uma certa regra por seu número da lista de ocorrências o Iptables.); iptables -D FORWARD 2 (Apaga a regra de número 2 referente a FORWARD chain).
tabela -Tabela que contém o chain que desejamos zerar.
Chain -Chain que desejamos limpar. Caso um chain não seja especificado, todos os chains da tabela serão limpos.
iptables -t filter -F INPUT (Remove todas as regras referentes a INPUT chain)
iptables -t filter -F
-D – Apaga uma regra especificada da lista;
iptables -D INPUT (Apaga a regra inserida anteriormente apenas trocando o comando -A pelo -D; o comando -D também lhe permite apagar uma certa regra por seu número da lista de ocorrências o Iptables.); iptables -D FORWARD 2 (Apaga a regra de número 2 referente a FORWARD chain).
P ara apagar um chain, existem duas alternativas:
1 -Quando sabemos qual é o número da regra no chain (listado com a opção -L) podemos referenciar o número diretamente. Por exemplo:
iptables -t filter -D INPUT 1
1 -Quando sabemos qual é o número da regra no chain (listado com a opção -L) podemos referenciar o número diretamente. Por exemplo:
iptables -t filter -D INPUT 1
Esta opção não é boa quando temos um firewall complexo com um grande número de regras por chains, neste caso a segunda opção é a mais apropriada.
2 -Usamos a mesma sintaxe para criar a regra no chain, mas trocamos -A por -D:
iptables -t filter -D INPUT -d 127.0.0.1 -j DROP
iptables -t filter -D INPUT -d 127.0.0.1 -j DROP
Então a regra correspondentes no chain INPUT será automaticamente apagada (confira listando o chain com a opção “-L”). Caso o chain possua várias regras semelhantes, somente a primeira será apagada. OBS: Não é possível apagar os chains defaults do iptables (INPUT, OUTPUT. . . ).
-P -O policiamento padrão determina o que acontecerá com um pacote quando ele chegar ao final das regras contidas em um chain. O policiamento padrão do iptables é “ACCEPT” mas isto pode ser alterado com o comando:
iptables [-t tabela] [-P chain] [ACCEPT/DROP]
-P -O policiamento padrão determina o que acontecerá com um pacote quando ele chegar ao final das regras contidas em um chain. O policiamento padrão do iptables é “ACCEPT” mas isto pode ser alterado com o comando:
iptables [-t tabela] [-P chain] [ACCEPT/DROP]
Onde:
tabela Tabela que contém o chain que desejamos modificar o policiamento padrão.
chain Define o chain que terá o policiamento modificado. O chain deve ser especificado.
tabela Tabela que contém o chain que desejamos modificar o policiamento padrão.
chain Define o chain que terá o policiamento modificado. O chain deve ser especificado.
ACCEPT/DROP
ACCEPT aceita os pacotes caso nenhuma regra do chain conferir (usado em regras permissivas).
ACCEPT aceita os pacotes caso nenhuma regra do chain conferir (usado em regras permissivas).
DROP
rejeita os pacotes caso nenhuma regra do chain conferir (usado em regras restritivas).
rejeita os pacotes caso nenhuma regra do chain conferir (usado em regras restritivas).
O policiamento padrão de um chain é mostrado com o comando iptables -L:
# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp --anywhere localhost
# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp --anywhere localhost
No exemplo acima, o policiamento padrão de INPUT é ACCEPT (policy ACCEPT), o que significa que qualquer pacote que não seja rejeitado pela regra do chain, será aceito. Para alterar o policiamento padrão deste chain usamos o comando:
iptables -t filter -P INPUT DROP
iptables -t filter -P INPUT DROP
NOTA: Os policiamentos PERMISSIVOS (ACCEPT) normalmente são usados em conjunto com regras restritivas no chain correspondentes (tudo é bloqueado e o que sobrar é liberado) e policiamentos RESTRITIVOS (DROP) são usados em conjunto com regras permissivas no chain correspondente (tudo é liberado e o que sobrar é bloqueado pelo policiamento padrão).
-I – Insere uma nova regra ao início da lista de regras (ao contrário do comando -A que insere ao final da lista);
iptables -I OUTPUT
-I – Insere uma nova regra ao início da lista de regras (ao contrário do comando -A que insere ao final da lista);
iptables -I OUTPUT
Exemplo:
Precisamos que o tráfego vindo de 192.168.1.15 não seja rejeitado pelo nosso firewall. Não podemos adicionar uma nova regra (-A) pois esta seria incluída no final do chain e o tráfego seria rejeitado pela primeira regra (nunca atingindo a segunda). A solução é inserir a nova regra antes da regra que bloqueia todo o tráfego ao endereço 127.0.0.1 na posição 1:
iptables -t filter -I INPUT 1 -s 192.168.1.15 -d 127.0.0.1 -j ACCEPT
Precisamos que o tráfego vindo de 192.168.1.15 não seja rejeitado pelo nosso firewall. Não podemos adicionar uma nova regra (-A) pois esta seria incluída no final do chain e o tráfego seria rejeitado pela primeira regra (nunca atingindo a segunda). A solução é inserir a nova regra antes da regra que bloqueia todo o tráfego ao endereço 127.0.0.1 na posição 1:
iptables -t filter -I INPUT 1 -s 192.168.1.15 -d 127.0.0.1 -j ACCEPT
Após este comando, temos a regra inserida na primeira posição do chain (repare no número 1 após INPUT) e a antiga regra número 1 passa a ser a número 2. Desta forma a regra acima será consultada, se a máquina de origem for 192.168.1.15 então o tráfego estará garantido, caso contrário o tráfego com o destino 127.0.0.1 será bloqueado na regra seguinte.
-R – Substitui uma regra já adicionada por outra.
Iptables -R FORWARD 2 -s 10.0.40.3 -d 10.0.30.0/8 -j DROP (Substitui a segunda regra referente a FOWARD chain pela seguinte: “-s 10.0.40.3 -d 10.0.30.0/8 -j DROP)
Exemplo:
Após criar nossa regra, percebemos que a nossa intenção era somente bloquear os pings com o destino 127.0.0.1 (pacotes ICMP) e não havia necessidade de bloquear todo o tráfego da máquina. Existem duas alternativas: apagar a regra e inserir uma nova no lugar ou modificar diretamente a regra já criada sem afetar outras regras existentes e mantendo a sua ordem no chain (isso é muito importante). Use o seguinte comando:
iptables -R INPUT 2 -d 127.0.0.1 -p icmp -j DROP
Após criar nossa regra, percebemos que a nossa intenção era somente bloquear os pings com o destino 127.0.0.1 (pacotes ICMP) e não havia necessidade de bloquear todo o tráfego da máquina. Existem duas alternativas: apagar a regra e inserir uma nova no lugar ou modificar diretamente a regra já criada sem afetar outras regras existentes e mantendo a sua ordem no chain (isso é muito importante). Use o seguinte comando:
iptables -R INPUT 2 -d 127.0.0.1 -p icmp -j DROP
O número 2 é o número da regra que será substituída no chain INPUT, e deve ser especificado.
O comando acima substituirá a regra 2 do chain INPUT (-R INPUT 2) bloqueando (-j DROP) qualquerpacote icmp (-p icmp) com o destino 127.0.0.1 (-d 127.0.0.1).
-N – Este comando nos permite inserir/criar uma nova chain a tabela especificada. Exemplo:
O comando acima substituirá a regra 2 do chain INPUT (-R INPUT 2) bloqueando (-j DROP) qualquerpacote icmp (-p icmp) com o destino 127.0.0.1 (-d 127.0.0.1).
-N – Este comando nos permite inserir/criar uma nova chain a tabela especificada. Exemplo:
Em firewalls organizados com um grande número de regras, é interessante criar chains individuais para organizar regras de um mesmo tipo ou que tenha por objetivo analisar um tráfego de uma mesma categoria (interface, endereço de origem, destino, protocolo, etc) pois podem consumir muitas linhas e tornar o gerenciamento do firewall confuso (e conseqüentemente causar sérios riscos de segurança). O tamanho máximo de um nome de chain é de 31 caracteres e podem conter tanto letras maiúsculas quanto minúsculas.
iptables [-t tabela] [-N novochain]
iptables [-t tabela] [-N novochain]
Para criar o chain internet (que pode ser usado para agrupar as regras de internet) usamos o seguinte comando:
iptables -t filter -N internet
iptables -t filter -N internet
Para inserir regras no chain internet basta especificá-lo após a opção -A:
iptables -t filter -A internet -s 200.200.200.200 -j DROP
E então criamos um pulo (-j) do chain INPUT para o chain internet:
iptables -t filter -A INPUT -j internet
iptables -t filter -A internet -s 200.200.200.200 -j DROP
E então criamos um pulo (-j) do chain INPUT para o chain internet:
iptables -t filter -A INPUT -j internet
OBS: O chain criado pelo usuário pode ter seu nome tanto em maiúsculas como minúsculas. Se uma máquina do endereço 200.200.200.200 tentar acessar sua máquina, o iptables consultará as seguintes regras:
AÇÕES DO IPTABLES (em minúsculo)
-p – Especifica o protocolo aplicado a regra. Pode ser qualquer valor numérico especificado no arquivo /etc/protocolo ou o próprio nome do protocolo (tcp, icmp, udp, etc...);
-p – Especifica o protocolo aplicado a regra. Pode ser qualquer valor numérico especificado no arquivo /etc/protocolo ou o próprio nome do protocolo (tcp, icmp, udp, etc...);
Exemplo: -p icmp
-i – Especifica a interface de entrada a ser utilizada; como um Firewall possui mais de uma interface, esta regra acaba sendo muito importante para distinguir a que interface de rede o filtro deve ser aplicado. Para listar suas interfaces de rede configuradas utilize o comando “isconfig” A regra -i não deve ser aplicada na OUTPUT chain pois refere-se apenas a interface de entrada (INOUT e FORWARD) são as duas chains aplicáveis a flag -i).
Exemplo: -i eth0
-i – Especifica a interface de entrada a ser utilizada; como um Firewall possui mais de uma interface, esta regra acaba sendo muito importante para distinguir a que interface de rede o filtro deve ser aplicado. Para listar suas interfaces de rede configuradas utilize o comando “isconfig” A regra -i não deve ser aplicada na OUTPUT chain pois refere-se apenas a interface de entrada (INOUT e FORWARD) são as duas chains aplicáveis a flag -i).
Exemplo: -i eth0
Podemos também especificar todas as interfaces “eth” sde nosso host da seguinte forma:
Exemplo: -i eth+
-o – Especifica a interface de saída a ser utilizada e se aplica da mesma forma que a regra -i, porém, somente as chains OUTPUT e FORWARD se aplicam a regra;
Exemplo: -o eth0
-s – Especifica a origem (source) do pacote ao qual a regra deve ser aplicada. A origem pode ser um host ou uma rede. Nesta opção geralmente utilizamos o IP seguido de sua sub-rede;
Exemplo: -s 10.0.10.0/255.0.0.0
A máscara de rede pode ser omitida deste comando, neste caso o iptables optará (de forma autônoma) pela máscara 255.255.255.0 (o que acaba se aplicando a todas as sub-redes). O -s também possibilita a utilização de nomes ao invés do IP;
Exemplo: -s www.gnu.org
Obviamente para resolver este endereço o Iptables utilizará a resolução de nomes (seu servidor DNS) que consta configurado em seu host Firewall.
-d – Especifica o destino do pacote (destination) ao qual a regra deve ser aplicada. Sua utilização se dá da mesma maneira que a ação -s.
!-Significa uma exclusão e é utilizado quando se deseja aplicar uma exceção a uma regra. É utilizado juntamente com as ações -s, -d, -p, -i, -o e etc.;
Exemplo: -s ! 10.0.0.3 (Refere-se a todos os endereços possíveis com exceção do 10.0.0.3)
Exemplo: -p ! icmp (Refere-se a todos os protocolos possíveis com exceção do 10.0.0.3)
-j – Define o alvo (target) do pacote caso o mesmo se encaixe a uma regra. As principais ações são ACCEPT, DROP, REJECT e LOG que serão citadas mais a frente.
--sport – Porta de origem (source port), com esta regra é possível aplicar filtros com base na porta de origem do pacote. Só pode ser aplicada a portas referentes aos protocolos UDP e TCP;
Exemplo: --p tcp -sport 80 (Refere-se a porta 80 do protocolo TCP)
--dport – Porta de destino )destination port), especifica a porta de destino do pacote e funciona de forma similar a regra --sport.
ALVOS DAS REGRAS (em MAIÚSCULO)
Quando um pacote se adequa a uma regra previamente criada ele deve ser direcionado a um alvo e quem o especifica é a própria regra. Os alvos (targets) aplicáveis são:
-ACCEPT – Corresponde a aceitar, ou seja, permite a entrada/passagem do pacote em questão.
-DROP – Corresponde a descartar; um pacote que é conduzido a este alvo (target) é descartado imediatamente. O Target DROP não informa ao dispositivo emissor do pacote o que houve. No caso de ping (solicitação icmp), o mesmo não retornará mensagens ao host de origem, isso dará a entender que o host que sofreu a solicitação (o ping) não existe, pois não enviará nenhum retorno ao mesmo.
-REJECT – Corresponde a rejeitar; um pacote conduzido para este alvo (Target) é automaticamente descartado, a diferença do Reject para o DROP é que o mesmo retorna uma mensagem de erro ao host emissor do pacote informando o que houve.
Quando um pacote se adequa a uma regra previamente criada ele deve ser direcionado a um alvo e quem o especifica é a própria regra. Os alvos (targets) aplicáveis são:
-ACCEPT – Corresponde a aceitar, ou seja, permite a entrada/passagem do pacote em questão.
-DROP – Corresponde a descartar; um pacote que é conduzido a este alvo (target) é descartado imediatamente. O Target DROP não informa ao dispositivo emissor do pacote o que houve. No caso de ping (solicitação icmp), o mesmo não retornará mensagens ao host de origem, isso dará a entender que o host que sofreu a solicitação (o ping) não existe, pois não enviará nenhum retorno ao mesmo.
-REJECT – Corresponde a rejeitar; um pacote conduzido para este alvo (Target) é automaticamente descartado, a diferença do Reject para o DROP é que o mesmo retorna uma mensagem de erro ao host emissor do pacote informando o que houve.
-LOG – Cria uma entrada de log no arquivo /var/log/messages sobre a utilização dos demais alvos (Targets), justamente por isso deve ser utilizado antes dos demais alvos.
-RETURN – Retorna o processamento do chain anterior sem processar o resto do chain atual.
-QUEUE – Encarrega um programa em nível usuário de administrar o processamento do fluxo atribuído ao mesmo.
-SNAT – Altera o endereço de origem das máquinas clientes antes dos pacotes serem roteados. Pode, por exemplo, enviar um pacote do Host “A” ao Host “B” e informar ao Host “B” que tal pacote fora enviado pelo Host “C”.
-DNAT – Altera o endereço de destino das máquinas clientes. Pode, por exemplo, receber um certo pacote destinado a porta 80 do Host “A” e encaminha-lo por conta própria a porta 3128 do Host “B”. Isso é o que chamamos de Proxy transparent, um encaminhamento dos pacotes dos clientes sem que os mesmos possuam a opção de escolher ou não tal roteamento.
-REDIRECT – Realiza redirecionamento de portas em conjunto com a opção --to-port.
-TOS – Prioriza a entrada e saída de pacotes baseado em seu “tipo de serviço”, informação esta especificada no header do IPV4.
ALGUNS EXEMPLOS
Firewall para um servidor que:
–proíba que qualquer pacote oriundo de nossa LAN (192.168.254.0/24) possa ser direcionado ao site “www.proibido.com.br”;
–proíba que qualquer pacote oriundo de nossa LAN (192.168.254.0/24) possa ser direcionado ao site “www.proibido.com.br”;
– permitir a entrada de pacotes oriundos do site “www.cyberoots.org.br” na nossa rede;
– todos os pacotes oriundos da interface “eth1” do firewall devem ser redirecionados para computador 192.168.254.254;
– todos os pacotes que desejam sair (eth0) da rede local para outra rede, tenham seus endereços de origem alterados para 146.164.32.90;
– todos os pacotes que tentam entrar na rede por uma interface diferente da “eth0” devem ser
descartados; o mesmo deve ocorrer com qualquer pacote que tente sair por uma interface diferente da “eth2”;
– descarte todos os pacotes oriundos do IP 200.255.96.171 e destinado ao IP 192.168.254.7;
– todos os pacotes destinados a porta 23 do nosso firewall sejam registrados e posteriormente
descartados;
# política padrão
#i
ptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
##
liberando tráfego na interface Io
#i
ptables -A INPUT -i Io -j ACCEPT
iptables -A INPUT -o Io -j ACCEPT
##
pacotes que entram no firewall
#i
ptables -A INPUT -p tcp - - dport 23 -j LOG “[firewall] acesso ao serviço telnet”
iptables -A INPUT -p tcp - - dport 23 -j DROP
##
regras de forward
#
iptables -A FORWARD -s 192.158.254.0/24 -d www.proibido.com.br -j DROP
iptables -A FORWARD -d 192.158.254.0/24 -s www.cyberroots.org.br - j ACCEPT
iptables -A FORWARD -s 200.255.96.171 -d 192.168.254.7 -j DROP
iptables -A FORWARD -i ! eth1 -j DROP
iptables -A FORWARD -o ! eth0 -j DROP
##
regras da nat
#i
ptables -t nat -A PREROUTING -i eth1 -j DNAT - - to 192.168.254.254
iptables -t nat -A POSTROUTING -o eth1 -j SNAT - - to 146.164.32.90
2) Qualquer pacote cuja origem é o host 10.0.3.1 deverá ter seu endereço de origem alterado para
192.11.22.33
iptables -t nat -A POSTROUTING -s 10.0.3.1 -o eth0 -j SNAT - - to 192.11.22.33
3) Qualquer pacote cuja origem é a rede 10.0.3.0/8 deve ter seu endereço de origem alterado para
192.11.22.33
iptables -t nat -A POSTROUTING -s 10.0.3.0/8 -o eth0 -j SNAT - - to 192.11.22.33
4) Qualquer pacote cuja origem é a rede 10.0.3.0/8 que sai pela interface eth0 deve ter seu endereço de
origem alterado para qualquer um do intervalo 192.11.22.33-192.11.22.66
iptables -t nat -A POSTROUTING -s 10.0.3.0/8 -o eth0 -j SNAT - - to 192.11.22.33-192.11.22.66
origem alterado para qualquer um do intervalo 192.11.22.33-192.11.22.66
iptables -t nat -A POSTROUTING -s 10.0.3.0/8 -o eth0 -j SNAT - - to 192.11.22.33-192.11.22.66
5) Qualquer pacote que venha do host 10.0.3.1 e entre na máquina pela interface eth0 deve ser
redirecionado para o endereço 192.11.22.33
iptables -t nat -A PREROUTING -s 10.0.3.1 -i eth0 -j DNAT - - to 192.11.22.33
redirecionado para o endereço 192.11.22.33
iptables -t nat -A PREROUTING -s 10.0.3.1 -i eth0 -j DNAT - - to 192.11.22.33
6) Todos os pacotes que entrem pela interface eth0 devem ser redirecionados para um dos endereços do
intervalo: 192.11.22.10 até 192.11.22.33
iptables -t nat -A PREROUTING -i eth0 -j DNAT - - to 192.11.22.10-192.11.22.33
intervalo: 192.11.22.10 até 192.11.22.33
iptables -t nat -A PREROUTING -i eth0 -j DNAT - - to 192.11.22.10-192.11.22.33
7) Todos os pacotes que entram pela interface eth2 e são destinados a porta 22 deve ser redirecionados
para o host 192.11.22.1
iptables -t nat -A PREROUTING -i eth2 -p tcp - - dport 22 -j DNAT - - to 192.11.22.12.0 –
para o host 192.11.22.1
iptables -t nat -A PREROUTING -i eth2 -p tcp - - dport 22 -j DNAT - - to 192.11.22.12.0 –
MISSÃO 1
Antes de começarmos é interessante que listemos as regras anexadas a base do Iptables, desta forma
também podemos observar a política padrão de nossas chains (que provavelmente estarão setadas como
ACCEPT por ser este o padrão inicial do Iptables). Utilizaremos então o comando “-L” que nos fornece uma listagem dos registros de regras do Iptables;
[ root@minha maquina /] # iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCPET)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Antes de começarmos é interessante que listemos as regras anexadas a base do Iptables, desta forma
também podemos observar a política padrão de nossas chains (que provavelmente estarão setadas como
ACCEPT por ser este o padrão inicial do Iptables). Utilizaremos então o comando “-L” que nos fornece uma listagem dos registros de regras do Iptables;
[ root@minha maquina /] # iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCPET)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Você deve ter observado também que não especificamos com a flag -t a tabela a ser utilizada em tal
listagem. Por ser padrão do Netfilter a tabela filter fora eleita automaticamente pelo sistema. Diante disso, a seguir listamos as regras referentes a tabela NAT; [ root@ minha maquina /]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (Policy ACCEPT)
target prot opt source destination
listagem. Por ser padrão do Netfilter a tabela filter fora eleita automaticamente pelo sistema. Diante disso, a seguir listamos as regras referentes a tabela NAT; [ root@ minha maquina /]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (Policy ACCEPT)
target prot opt source destination
E mais a seguir as regras referentes a tabela Mangle;
[ root@ minha maquina /]# iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
haon OUTPUT (policy ACCEPT)
target prot opt source destination
[ root@ minha maquina /]# iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
haon OUTPUT (policy ACCEPT)
target prot opt source destination
MISSÃO 2
Diante da listagem de regras do Iptables, podemos observar que o Target (alvo) padrão de nossas chains
está setado como ACCEPT. Vamos configurar o alvo padrão das chains referentes a tabela filter como
DROP;
[ root@ minha maquina /]# iptables -P INPUT DROP
[ root@ minha maquina /]# iptables -P FORWARD DROP
[ root@ minha maquina /]# iptables -P OUTPUT DROP
MISSÃO 3
Vamos agora liberar totalmente o tráfego de entrada de nossa Interface de Loopback (Io). Esta regra deve
obrigatoriamente fazer parte de seu script Firewall para permitir então que a comunicação entreprocessos
seja possível. Lembre-se, esta regra não é opcional!
[ root@ minha maquina /]# iptables -A INPUT -i Io -j ACCEPT
Diante da listagem de regras do Iptables, podemos observar que o Target (alvo) padrão de nossas chains
está setado como ACCEPT. Vamos configurar o alvo padrão das chains referentes a tabela filter como
DROP;
[ root@ minha maquina /]# iptables -P INPUT DROP
[ root@ minha maquina /]# iptables -P FORWARD DROP
[ root@ minha maquina /]# iptables -P OUTPUT DROP
MISSÃO 3
Vamos agora liberar totalmente o tráfego de entrada de nossa Interface de Loopback (Io). Esta regra deve
obrigatoriamente fazer parte de seu script Firewall para permitir então que a comunicação entreprocessos
seja possível. Lembre-se, esta regra não é opcional!
[ root@ minha maquina /]# iptables -A INPUT -i Io -j ACCEPT
MISSÃO 4
Proibiremos então que qualquer pacote oriundo de nossa LAN 10.0.30.0 possa direcionar-se ao site
www.proibido.com.br. A síntese é então basicamente a seguinte:
[ root@ minha maquina /]# iptables -A FORWARD
Proibiremos então que qualquer pacote oriundo de nossa LAN 10.0.30.0 possa direcionar-se ao site
www.proibido.com.br. A síntese é então basicamente a seguinte:
[ root@ minha maquina /]# iptables -A FORWARD
# Utilizamos o -A para inserir uma regra a tabela filter (padrão) sob a chain FORWARD.
[ root@ minha maquina /]# iptables -A FORWARD -s 10.0.30.0/8
[ root@ minha maquina /]# iptables -A FORWARD -s 10.0.30.0/8
# Logo em seguida dizemos que todos os pacotes que forem provenientes (-s significa, ou seja. Origem) da rede 10.0.30.0/8 e que precisarem ser redirecionados (o redirecionamento fora especificado na chain
FORWARD) ...
[ root@ minha maquina /]# iptables -A FORWARD -s 10.0.30.0/8 -d www.proibido.com.br
FORWARD) ...
[ root@ minha maquina /]# iptables -A FORWARD -s 10.0.30.0/8 -d www.proibido.com.br
# ... ao destino www.proibido.com.br (-d significa destination, ou seja, destino) ...
[ root@ minha maquina /]# iptables -A FORWARD -s 10.0.30.0/8 -d www.proibido.com.br -j DROP
[ root@ minha maquina /]# iptables -A FORWARD -s 10.0.30.0/8 -d www.proibido.com.br -j DROP
# ... deverá ser automaticamente bloqueado (-j indica a ação a ser tomada, e DROP trata-se da ação
propriamente dita) pelo Firewall.
Note que anteriormente, ao especificarmos a origem do pacote adicionamos um “/8”. O “/8” especifica o
número de nossa sub-rede. Este mesmo “/8” poderia ser substituído por um “255.0.0.0”, que é a sub-rede
de IP´s sobre a classe A (10.0.0.0/255.0.0.0). Caso não fosse especificado, o iptables adotaria de maneira
autônoma a sub rede 255.255.255.0 como componente da regra.
propriamente dita) pelo Firewall.
Note que anteriormente, ao especificarmos a origem do pacote adicionamos um “/8”. O “/8” especifica o
número de nossa sub-rede. Este mesmo “/8” poderia ser substituído por um “255.0.0.0”, que é a sub-rede
de IP´s sobre a classe A (10.0.0.0/255.0.0.0). Caso não fosse especificado, o iptables adotaria de maneira
autônoma a sub rede 255.255.255.0 como componente da regra.
MISSÃO 5
Especificaremos agora que qualquer pacote oriundo do host www.cracker.com não pode penetrar em nossa rede (10.0.30.0);
[ root@ minha maquina /]# iptables -A FORWARD -s www.cracker.com -d 10.0.30.0 -j DROP
Especificaremos agora que qualquer pacote oriundo do host www.cracker.com não pode penetrar em nossa rede (10.0.30.0);
[ root@ minha maquina /]# iptables -A FORWARD -s www.cracker.com -d 10.0.30.0 -j DROP
# Utilizamos então o -A para inserir uma regra a tabela filter (padrão) sob a chain FORWARD
[ root@ minha maquina /]# iptables -A FORWARD -s www.cracker.com
[ root@ minha maquina /]# iptables -A FORWARD -s www.cracker.com
# Logo em seguida dizemos que todos os pacotes que forem provenientes (-s significa source, ou seja,
orgiem) de www.cracker.com e que precisarem ser redirecionados (o redirecionamento fora especificado na chain FORWARD) ...
[ root@ minha maquina /]# iptables -A FORWARD -s www.cracker.com -d 10.0.30.0
orgiem) de www.cracker.com e que precisarem ser redirecionados (o redirecionamento fora especificado na chain FORWARD) ...
[ root@ minha maquina /]# iptables -A FORWARD -s www.cracker.com -d 10.0.30.0
# ... ao destino 10.0.30.0 (-d significa destination, ou seja, destino) ...
[ root@ minha maquina /]# iptables -A FORWARD -s www.cracker.com -d 10.0.30.0 -j DROP
[ root@ minha maquina /]# iptables -A FORWARD -s www.cracker.com -d 10.0.30.0 -j DROP
# ... deverá ser automaticamente bloqueado (-j indica a ação a ser tomada, e DROP trata-se da ação
propriamente dita) pelo Firewall.
propriamente dita) pelo Firewall.
MISSÃO 6
Faremos agora com que os pacotes provenientes do Site www.suaempresa.com penetrem livremente em
nossa rede:
[ root@ minha maquina /]# iptables -A FORWARD -s www.suaempresa.com -d 10.0.30.0 -j ACCEPT
Note, então, que especificamos -s como sua empresa pois ela é a origem dos pacotes (source) e -d como
10.0.30.0, que trata-se do destino dos pacotes (destination).
A chain ACCEPT confirma que aceitaremos este tipo de tráfego em nosso Firewall.
Faremos agora com que os pacotes provenientes do Site www.suaempresa.com penetrem livremente em
nossa rede:
[ root@ minha maquina /]# iptables -A FORWARD -s www.suaempresa.com -d 10.0.30.0 -j ACCEPT
Note, então, que especificamos -s como sua empresa pois ela é a origem dos pacotes (source) e -d como
10.0.30.0, que trata-se do destino dos pacotes (destination).
A chain ACCEPT confirma que aceitaremos este tipo de tráfego em nosso Firewall.
MISSÃO 7
Agora, todos os pacotes oriundos de qualquer rede que penetrem em Firewall pela interface de rede eth2
serão redirecionados para o computador 10.0.30.47. Observe que nesta regra utilizamos a tabela NAT;
[ root@ minha maquina /]# iptables -t nat -A PREROUTING -i eth2 -j DNAT - - to 10.0.30.47
Note que agora utilizamos a tabela nat (-t nat) e sua chain PREROUTING, que nada mais faz do que aplicar
a regra antes do roteamento do pacote.
Agora, todos os pacotes oriundos de qualquer rede que penetrem em Firewall pela interface de rede eth2
serão redirecionados para o computador 10.0.30.47. Observe que nesta regra utilizamos a tabela NAT;
[ root@ minha maquina /]# iptables -t nat -A PREROUTING -i eth2 -j DNAT - - to 10.0.30.47
Note que agora utilizamos a tabela nat (-t nat) e sua chain PREROUTING, que nada mais faz do que aplicar
a regra antes do roteamento do pacote.
A ação -i por sua vez indica os pacotes que entram pela interface eth2 e o -j indica o alvo a ser dado aos
mesmos, que neste caso trata-se do DNAT. Lembre-se de que o papel do alvo DNAT é o de alterar o
endereço de destino das máquinas clientes.
mesmos, que neste caso trata-se do DNAT. Lembre-se de que o papel do alvo DNAT é o de alterar o
endereço de destino das máquinas clientes.
MISSÃO 8
Nossa próxima missão também utilizará a tabela NAT e fará com que qualquer pacote que deseje sair da
rede local para outra rede possua seu endereço de origem alterado para 192.168.0.33, implementando
assim o conceito de mascaramento ip. Este mesmo pacote somente sofrerá modificações se sair pela
interface de rede eth2. Utilizaremos a ação “-o”, que se refere a interface de saída (OUTPUT), ao contrário
da ação -i que se refere a interface de entrada (INPUT);
[ root@ minha maquina /]# iptables -t nat -A POSTROUTING -o eth2 -j SNAT - - to 192.168.0.33
MISSÃO 9
Em nossa missão utilizaremos a tabela filter para rejeitar (REJECT) pacotes entrantes pela interface de rede
eth1;
[ root@ minha maquina /]# iptables -A FORWARD -i eth1 -j REJECT
Em nossa missão utilizaremos a tabela filter para rejeitar (REJECT) pacotes entrantes pela interface de rede
eth1;
[ root@ minha maquina /]# iptables -A FORWARD -i eth1 -j REJECT
MISSÃO 10
Faremos agora com que pacotes que entram por qualquer interface de rede com exceção da eth0 sejam
descartados;
[ root@ minha maquina /]# iptables -A FORWARD -i ! eth0 -j DROP
Faremos agora com que pacotes que entram por qualquer interface de rede com exceção da eth0 sejam
descartados;
[ root@ minha maquina /]# iptables -A FORWARD -i ! eth0 -j DROP
MISSÃO 11
Agora uma tarefa mais trivial, sim, e porque não? Vamos então deletar a segunda regra inserida sobre a
chain FORWARD;
[ root@ minha maquina /]# iptables -D FORWARD 2
Agora uma tarefa mais trivial, sim, e porque não? Vamos então deletar a segunda regra inserida sobre a
chain FORWARD;
[ root@ minha maquina /]# iptables -D FORWARD 2
MISSÃO 12
Listaremos agora a segunda regra associada as output chain
[ root@ minha maquina /]# iptables -L OUTPUT
Listaremos agora a segunda regra associada as output chain
[ root@ minha maquina /]# iptables -L OUTPUT
MISSÃO 13
Vamos então descartar qualquer pacote oriundo do IP 10.0.80.32 destinado ao IP 10.0.30.4
[ root@minha maquina /]# iptables -A FORWARD -s 10.0.80.32 -d 10.0.30.4 -j DROP
Vamos então descartar qualquer pacote oriundo do IP 10.0.80.32 destinado ao IP 10.0.30.4
[ root@minha maquina /]# iptables -A FORWARD -s 10.0.80.32 -d 10.0.30.4 -j DROP
MISSÃO 14
Pacotes TCP destinados à porta 80 de nosso host firewall deverão ser descartados;
[ root@ minha maquina /]# iptables -A INPUT -p tcp - - dport 80 -j DROP
Pacotes TCP destinados à porta 80 de nosso host firewall deverão ser descartados;
[ root@ minha maquina /]# iptables -A INPUT -p tcp - - dport 80 -j DROP
MISSÃO 15
Agora faremos com que pacotes destinados a porta 25 de nosso Firewall sejam arquivados em log (/var/log/messages)
[ root@ minha maquina /]# iptables -A INPUT -p tcp - - dport 25 -j LOG
Agora faremos com que pacotes destinados a porta 25 de nosso Firewall sejam arquivados em log (/var/log/messages)
[ root@ minha maquina /]# iptables -A INPUT -p tcp - - dport 25 -j LOG
Note que diante de tal regra temos a possibilidade de, por exemplo, arquivar tal tráfego em Log e logo
depois descartá-lo conforme o exemplo a seguir:
[ root@ minha maquina /]# iptables -A INPUT -p tcp - - dport 25 -j LOG
[ root@ minha maquina /]# iptables -A INPUT -p tcp - - dport 25 -j DROP
3.0 – DETALHANDO NAT
depois descartá-lo conforme o exemplo a seguir:
[ root@ minha maquina /]# iptables -A INPUT -p tcp - - dport 25 -j LOG
[ root@ minha maquina /]# iptables -A INPUT -p tcp - - dport 25 -j DROP
3.0 – DETALHANDO NAT
SNAT
Uma das funções de um Firewall NAT é o que conhecemos por SNAT, ou simplesmente “tradução de
endereçamento de origem” (source nat).
endereçamento de origem” (source nat).
O alvo (target) SNAT lhe dá a possibilidade de alterar os endereços/portas de origem dos pacotes que
atravessam seu host Firewall antes que os mesmos sejam roteados a seu destino final.
atravessam seu host Firewall antes que os mesmos sejam roteados a seu destino final.
Para compreendermos e assimilarmos o conceito, tal com prática, vamos a análise de alguns exemplos,
mas antes disso vamos analisar algumas poucas, mas não menos importantes considerações:
a) Qualquer regra aplicada SNAT utiliza-se somente da chain POSTROUTING. Logo, se é SNAT que você
quer, é POSTROUTING que você usa!
mas antes disso vamos analisar algumas poucas, mas não menos importantes considerações:
a) Qualquer regra aplicada SNAT utiliza-se somente da chain POSTROUTING. Logo, se é SNAT que você
quer, é POSTROUTING que você usa!
b) Antes de iniciarmos a manipulação de qualquer regra que se utilize da tabela NAT, é importante que
habilitemos a função de redirecionamento de pacotes (forward) em nosso Kernel através do seguinte
comando:
[ root@ minha maquina /]# echo “1” >/proc/sys/net/ipv4/ip_forward
Não se esqueça de utilizar antes de qualquer regra que envolva a tabela NAT. Tal comando também pode
ser utilizado em scripts.
habilitemos a função de redirecionamento de pacotes (forward) em nosso Kernel através do seguinte
comando:
[ root@ minha maquina /]# echo “1” >/proc/sys/net/ipv4/ip_forward
Não se esqueça de utilizar antes de qualquer regra que envolva a tabela NAT. Tal comando também pode
ser utilizado em scripts.
c) Análises de regras de exemplo:
[ root@ minha maquina /]# iptables -t nat -A POSTROUTING -s 10.0.3.1 -o eth1 -j SNAT - - to 192.111.22.33
[ root@ minha maquina /]# iptables -t nat -A POSTROUTING -s 10.0.3.1 -o eth1 -j SNAT - - to 192.111.22.33
Note que acima primeiramente anunciamos o programa (iptables) e em seguida informamos sobre a
criação de uma nova regra (-A) ao fim da lista.
criação de uma nova regra (-A) ao fim da lista.
Finalmente anunciamos que tal regra deve ser atribuída a tabela nat (-t nat), sob a chain POSTROUTING.
Anunciamos também que qualquer pacote que possua como origem (-s 10.0.3.1) o host 10.0.3.1 e que
saia por nossa eth1 (-o eth1) deverá possuir seu endereço de destino alterado (-j SNAT) para 191.111.22.33
(- - to 192.111.22.33).
[ root@ minha maquina /]# iptables -t nat -A POSTROUTING -s 10.0.3.0/8 -o eth0 -j SNAT - -to 192.111.22.33
saia por nossa eth1 (-o eth1) deverá possuir seu endereço de destino alterado (-j SNAT) para 191.111.22.33
(- - to 192.111.22.33).
[ root@ minha maquina /]# iptables -t nat -A POSTROUTING -s 10.0.3.0/8 -o eth0 -j SNAT - -to 192.111.22.33
No exemplo acima fomos um pouco mais longe e especificamos que qualquer pacote que possua como
origem (-s 10.0.3.0/8) a rede 10.0.3.0/8, e que sair por nossa interface eth0 (-o eth0) deverá ter seu
endereço alterado (-j SNAT) para 192.111.22.33 (- - to 192.111.22.33)
[ root@ minha maquina/ ]# iptables -t nat -A POSTROUTING -s 10.0.3.1 -o eth0 -j SNAT --to
192.111.22.33-192.11.322.66
# Acima especificamos então que qualquer pacote proveniente do host 10.0.3.1 (-s 10.0.3.1) e que saia por nossa interface eth0 deverá ter seu endereço de origem alterado (-j SNAT) por qualquer ip disponível na faixa entre 192.111.22.33 a 192.11.22.66 ( - - to 192.111.22.33-192.11.322.66).
origem (-s 10.0.3.0/8) a rede 10.0.3.0/8, e que sair por nossa interface eth0 (-o eth0) deverá ter seu
endereço alterado (-j SNAT) para 192.111.22.33 (- - to 192.111.22.33)
[ root@ minha maquina/ ]# iptables -t nat -A POSTROUTING -s 10.0.3.1 -o eth0 -j SNAT --to
192.111.22.33-192.11.322.66
# Acima especificamos então que qualquer pacote proveniente do host 10.0.3.1 (-s 10.0.3.1) e que saia por nossa interface eth0 deverá ter seu endereço de origem alterado (-j SNAT) por qualquer ip disponível na faixa entre 192.111.22.33 a 192.11.22.66 ( - - to 192.111.22.33-192.11.322.66).
DNAT
Outra função agregada a um Firewall NAT é o DNAT, ou “tradução de endereçamento de
destino” (destination nat).
Outra função agregada a um Firewall NAT é o DNAT, ou “tradução de endereçamento de
destino” (destination nat).
O alvo (target) DNAT lhe dá a possibilidade de alterar os endereços/portas de destino dos pacotes que
atravessam seu host Firewall antes que os mesmos sejam roteados a seu destino final. Com isso o DNAT
nos possibilita o desenvolvimento de proxys transparentes, balanceamento de carga, entre outros.
As regras do DNAT, ao contrário do SNAT, utilizam-se tão somente da chain PREROUTING. Logo, se é
DNAT que você vai fazer, é PREROUTING que você vai usar!
Nunca é demais lembrar que, antes de iniciarmos a manipulação de qualquer regra que se utilize da tabela
NAT, é importante que habilitemos a função de redirecionamento de pacotes (forward) em nosso kernel ou tais implementações não funcionarão. Logo, conforme já fora visto anteriormente e repito, nunca é demais relembrar, habilitamos esta propriedade (forward) de nosso Kernel através do seguinte comando:
[ root@ minha maquina /]# echo “1” >/proc/sys/net/ipv4/ip_forward
Para uma melhor assimilação da síntese associada ao DNAT acompanhe os exemplos a seguir:
[ root@ minha maquina /]# iptables -t nat -A PREROUTING -s 10.0.3.1 -i eth1 -j DNAT - - to 192.111.22.33
[ root@ minha maquina /]# iptables -t nat -A PREROUTING -s 10.0.3.1 -i eth1 -j DNAT - - to 192.111.22.33
# Note que acima primeiramente anunciamos o programa (iptables) e em seguida informamos sobre a
criação de uma nova regra (-A) ao fim da lista.
criação de uma nova regra (-A) ao fim da lista.
# Finalmente atribuiremos tal regra a tabela nat (-t nat), sob a chain PREROUTING.
# Informamos também que qualquer pacote que possua como origem o host 10.0.3.1 (-s 10.0.3.1) e que
entre por nossa interface eth1 (-j eth1) deve ter seu endereço de destino alterado (-j DNAT) para
192.111.22.33 (- - to 192.111.22.33).
entre por nossa interface eth1 (-j eth1) deve ter seu endereço de destino alterado (-j DNAT) para
192.111.22.33 (- - to 192.111.22.33).
# A grosso modo podemos observar que mesmo que o host 10.0.3.1 tenha enviado um pacote
192.55.55.55, o mesmo será forçadamente redirecionado sem o consentimento do cliente (10.0.3.1) para ohost 192.11.22.33.
[ root@ minha maquina /]# iptables -t nat -A PREROUTING -i eth0 -j DNAT - - to 192.11.22.10-192.11.22.13
192.55.55.55, o mesmo será forçadamente redirecionado sem o consentimento do cliente (10.0.3.1) para ohost 192.11.22.33.
[ root@ minha maquina /]# iptables -t nat -A PREROUTING -i eth0 -j DNAT - - to 192.11.22.10-192.11.22.13
# Após chamarmos o programa (iptables), informamos sobre a criação de uma nova regra (-A) ao fim da
lista.
lista.
# Atribuimos então a tabela nat (-t nat), uma regra sob a chain PREROUTING.
# Logo anunciamos ao iptables que qualquer pacote que entre por nossa interface de rede eth0
independentemente de quem o enviou, deve ser automaticamente redirecionado aos hosts 192.11.22.10,
192.11.22.11, 192.11.22.12 e 192.11.22.13 (- - to 192.11.22.10-192.11.22.13)
Mas você deve estar se perguntando: “mas como ele irá direcionar o pacote a 3 hosts diferentes?”
Imagine então que você possui um servidor de www, e que este mesmo é o responsável por realizar o
recadastramento de CPF´s de todos os cidadãos brasileiros, e que hoje, justo hoje, é o último dia para o tal recadastramento. Como não haveria de ser diferente, quase todo mundo resolveu fazer isso no último dia, ou seja, hoje. E, acredite, ainda reclamam da lentidão no acesso ao sistema. Diante de tal situação você já sabe que apenas um servidor não dará conta do recado. O que você faz? Pede demissão e procura um trabalho mais traquilo? Não, não precisa ir tão longe ... Que tal balancear o tráfego de seu servidor principal com mais uns 2 ou 3 (quem sabe até mais) “servidores reservas”?
independentemente de quem o enviou, deve ser automaticamente redirecionado aos hosts 192.11.22.10,
192.11.22.11, 192.11.22.12 e 192.11.22.13 (- - to 192.11.22.10-192.11.22.13)
Mas você deve estar se perguntando: “mas como ele irá direcionar o pacote a 3 hosts diferentes?”
Imagine então que você possui um servidor de www, e que este mesmo é o responsável por realizar o
recadastramento de CPF´s de todos os cidadãos brasileiros, e que hoje, justo hoje, é o último dia para o tal recadastramento. Como não haveria de ser diferente, quase todo mundo resolveu fazer isso no último dia, ou seja, hoje. E, acredite, ainda reclamam da lentidão no acesso ao sistema. Diante de tal situação você já sabe que apenas um servidor não dará conta do recado. O que você faz? Pede demissão e procura um trabalho mais traquilo? Não, não precisa ir tão longe ... Que tal balancear o tráfego de seu servidor principal com mais uns 2 ou 3 (quem sabe até mais) “servidores reservas”?
Logo não há dúvidas de que quando você precisar fazer o que conhecemos por balanceamento de tráfego,
você precisa de um simples e eficiente DNAT!
[ root@ minha maquina /]# iptables -t nat -A PREROUTING -i eth2 -j DNAT - - to 192.11.22.58:22
# Após chamarmos o programa, (iptables) informamos sobre a criação de uma nova regra (-A) ao fim da
lista.
lista.
# Atribuimos então a tabela nat (-t nat), uma regra sob a chain PREROUTING.
# Logo anunciamos ao iptables que qualquer pacote que entre por nossa interface de rede eth2,
independentemente de quem o enviou, deve ser automaticamente redirecionado ao host 192.11.22.10, e,
independentemente da porta solicitada pelo cliente (origem), deverá ser enviado à porta 22 do mesmo.
# Vemos então um típico conceito que é geralmente aplicado a Bastions hosts, onde todo o tráfego é filtradopor um Firewall e apenas os pacotes entrantes por uma certa interface deverão ser aceitos e redirecionados a um serviço específico, no caso do exemplo acima, o serviço SSH.
4.0 – DETALHANDO MANGLE
Conceito de TOS
O futuramente extinto, mas enquanto isso, padrão IPV4 conforme sabemos, combina diversas informações
em um Header (cabeçalho) de pacote, estes por sua vez divididos em campos. Um destes, o “tipo de
serviço”, é o campo que nos possibilita aplicar TOS, ou seja, o controle do tipo de serviço a um tráfego
destinado a um host/rede. Este campo por sua vez foi criado com o intuito específico de nos permitir aplicar conceitos de gerenciamento de tráfego sob argumento “tipo de serviço”.
Isso nos permite então dizer a um Firewall que qualquer pacote cujo o “tipo de serviço” seja “SSH” possui
uma prioridade de tráfego “X”, e que outros cujo o “tipo de pacote” seja “ICQ”, por exemplo, possuem
prioridade “Y”, com isso, o TOS torna-se então uma forma simples porém eficiente de lhe dar total controle sobre o tráfego de entrada e saída de sua rede.
Aplicando o TOS
Para aplicar os conceitos de TOS em uma rede, seu Firewall, além de servir como ponto de indução de sua
rede, deve utilizar-se de regras com a tabela Mangle.
Para aplicar os conceitos de TOS em uma rede, seu Firewall, além de servir como ponto de indução de sua
rede, deve utilizar-se de regras com a tabela Mangle.
A Mangle, conforme visto anteriormente nos serve exatamente para isso, ou seja, realizar controle e
alterações “especiais” em pacote. Se você ainda possuía alguma dúvida sobre este “especial”, acho que a
mesma não mais faz parte de sua lista de questionamentos.
TOS é, mais especificamente e como visto anteriormente, o nome dado a um alvo (tal como DROP,
ACCEPT, etc.) que fará então este controle. Este mesmo alvo, combinado com o argumento - - set-tos lhe
permitirá aplicar os conceitos de gerenciamento de tráfego por “tipo de serviço”.
Para que haja a possibilidade de se alterar o bit de prioridade de um pacote por seu “tipo de serviço”,
possuímos então em mãos uma tabela com especificações e valores que deverão ser alterados conforme
veremos a seguir:
BIT TOS AJUSTE DO BIT
Espera Mínima (Minimize-Delay) 16 ou 0x10
Máximo Processamento (Maximize-Throughput) 8 ou 0x08
Máxima Confiança (Maximize-Reliability) 4 ou 0x04
Custo mínimo (Minimize-Cost) 2 ou 2x02
Prioridade Normal (Normal-Service) 0 ou 0x00
Obs.: É importante termos em mente que por padrão, o valor TOS ajustado a cada pacote lhe dá uma
prioridade normal, ou simplesmente 0x00
possuímos então em mãos uma tabela com especificações e valores que deverão ser alterados conforme
veremos a seguir:
BIT TOS AJUSTE DO BIT
Espera Mínima (Minimize-Delay) 16 ou 0x10
Máximo Processamento (Maximize-Throughput) 8 ou 0x08
Máxima Confiança (Maximize-Reliability) 4 ou 0x04
Custo mínimo (Minimize-Cost) 2 ou 2x02
Prioridade Normal (Normal-Service) 0 ou 0x00
Obs.: É importante termos em mente que por padrão, o valor TOS ajustado a cada pacote lhe dá uma
prioridade normal, ou simplesmente 0x00
Regras de TOS
A síntese para a aplicação de regras de TOS segue o mesmo padrão da composição clássica da do próprio
iptables. Logo, se você conseguiu compreender as sínteses que envolvem outras tabelas, não terá maiores
problemas na compreensão desta tão somente por utilizar-se da Mangle.
A síntese para a aplicação de regras de TOS segue o mesmo padrão da composição clássica da do próprio
iptables. Logo, se você conseguiu compreender as sínteses que envolvem outras tabelas, não terá maiores
problemas na compreensão desta tão somente por utilizar-se da Mangle.
Analise a seguir algumas regras que provavelmente irão sanar suas interrogações:
Tráfego de Saída
Exemplo a seguir nos demonstra na prática como aplicar uma prioridade máxima (espera mínima) para
tráfego de saída na interface eth0 (OUTPUT -o eth0) em pacotes sob o protocolo ssh. Isso na prática quer
dizer que qualquer pacote SSH (porta 22) será direcionado a seu destino primeiro do que qualquer outro.
[ root@ minha maquina /]# iptables -t mangle -A OUTPUT -o eth0 -p tcp - - dport 22 -j TOS - - set-tos 16
Tráfego de Saída
Exemplo a seguir nos demonstra na prática como aplicar uma prioridade máxima (espera mínima) para
tráfego de saída na interface eth0 (OUTPUT -o eth0) em pacotes sob o protocolo ssh. Isso na prática quer
dizer que qualquer pacote SSH (porta 22) será direcionado a seu destino primeiro do que qualquer outro.
[ root@ minha maquina /]# iptables -t mangle -A OUTPUT -o eth0 -p tcp - - dport 22 -j TOS - - set-tos 16
Esta regra, estando sobre a forma de “tráfego de saída”, apenas irá incorporar tais conceitos de TOS
somente sob pacotes emitidos por seu host/rede. Logo, pacotes emitidos por seu host/rede sob o protocolo SSH terão prioridade sob as demais emissões de pacotes. Mas isso não significa que pacotes SSH que entrarem em seu host/rede terão a mesma prioridade. Para tal é necessário a aplicação de outra regra que especifique o “tráfego de entrada”, conforme veremos a seguir.
somente sob pacotes emitidos por seu host/rede. Logo, pacotes emitidos por seu host/rede sob o protocolo SSH terão prioridade sob as demais emissões de pacotes. Mas isso não significa que pacotes SSH que entrarem em seu host/rede terão a mesma prioridade. Para tal é necessário a aplicação de outra regra que especifique o “tráfego de entrada”, conforme veremos a seguir.
Tráfego de Entrada
Entendemos tráfego de entrada como um conjunto de pacotes que entram por sua interface de rede, logo,
não faz sentido, a exemplo das regras de tráfego de saída do TOS utilizarmos a chain OUTPUT.
Para o tratamento deste tráfego, o de entrada, utilizamos tão somente a chain PREROUTING, e é claro, ao
especificarmos a interface, utlizamos a ação -i, o que indica pacotes entrantes na mesma.
O exemplo a seguir dará prioridade máxima (espera mínima) a pacotes que entrem em seu host/rede sob
protocolo SSH.
[ root@ minha maquina /]# iptables -t mangle -A PREROUTING -i eth0 -p tcp - - sport 22 -j TOS - - set-tos 16
O exemplo a seguir dará máximo processamento (Maximize-Throughput) a pacotes que entrem em seu
host/rede sob o protocolo FTP.
[ root@ minha maquina /]# iptables -t mangle -A PREROUTING -i eth0 -p tcp - - sport 20 -j TOS - - set-tos 8
Ainda com prioridade acima do tráfego normal mas abaixo dos especificados acima (16 e 8), o exemplo
seguinte dará máxima confiança (Maximize-Reliability) a pacotes que entrem em seu host/rede sob o
protovolo Web.
[ root@ minha maquina /]# iptables -t mangle -A PREROUTING -i eth0 -p tcp - - sport 80 -j TOS - - set-tos 4
Conclusões
Além de ser uma excelente forma de controle de tráfego, o TOS é também uma excelente maneira de
compreendermos melhor o termo “tratamento especial”, que é normalmente utilizado para especificar as
funções da Tabela Mangle.
Os exemplos demonstrados são apenas uma pequena parte do poder do TOS. O resto virá de sua
necessidade e criatividade!
E lembre-se, um TOS jamais substitui um bom trabalho de QOS em sua rede, logo, nem pense em substituir o QOS de seu roteador por regras de TOS, pois estas não agregam qualidade ao tráfego, e sim priorização de forma “curta e grossa”.