LPI-2 202-450 Topico 212.1
Configuração de roteador
Índice
- 212.1 Configuração de roteador - Objetivos
- 212.1 Configuração de roteador - Conteúdo
212.1 Configuração de roteador - Objetivos
Peso 3
O candidato deve ser capaz de configurar um sistema para realizar tradução de endereço de rede (NAT, Mascaramento de IP) e determinar sua importância na proteção da rede. Este objetivo inclui configurar redirecionamento de portas, regras de filtros e prevenção de ataques.
Conhecimentos-chave:
- Arquivos de configuração e ferramentas do iptables;
- Ferramentas e comandos para administrar tabelas de rotas;
- Faixas de endereços privados;
- Redirecionamento de portas e de endereços IP;
- Exibir e criar filtros e regras que aceitem ou bloqueiem datagramas baseados na origem, destino, protocolo, porta ou endereço;
- Salvar e recuperar configurações de filtragem.
Lista parcial dos arquivos, termos e ferramentas utilizados:
212.1 Configuração de roteador - Conteúdo
Endereçamento de rede
Para um melhor aproveitamento desse tópico é importante conhecimento prévio sobre TCP/IP
O primeiro passo para evitar problemas numa rede é assegurar-se da escolha correta dos endereços de IP. O IANA (Internet Assigned Numbers Authority) define três categorias para os endereços de IP:
- Categoria 1
- Endereços que não precisam ter acesso a outros endereços em redes externas ou na Internet. Os endereços nessa categoria podem até utilizar números de IP existentes em redes externas, mas devem ser únicos na rede local;
- Categoria 2
- Endereços que precisam ter acesso a alguns serviços externos (EMail, FTP, www) que podem ser mediados via gateway. Como na categoria anterior pode-se atribuir a hosts dessa categoria endereços de outras redes externas, mas eles tem que ser únicos na rede local;
- Categoria 3
- Endereços que necessitam de conectividade direta com a Internet. Os endereços de IP dessa categoria devem ser únicos em toda a Internet
Os endereços na primeira e segunda categoria são chamados endereços privados. Já os da terceira categoria são os endereços públicos. Os endereços IP reservados para redes privadas são delimitados dentro das classes mostradas na Tabela 1.
Como os endereços privados são de competência exclusiva da rede local onde existem, as regras para criação de máscaras de rede são flexíveis, esta pode ser manipulada para melhor atender as necessidades da rede ou a preferência do administrador.
Faixa | Máscara | Notação CIDR |
---|---|---|
10.0.0.0 até 10.255.255.255 | 255.0.0.0 | 10.0.0.0/8 |
172.16.0.0 até 172.31.255.255 | 255.240.0.0 | 172.16.0.0/12 |
192.168.0.0 até 192.168.255.255 | 255.255.0.0 | 192.168.0.0/16 |
Noções sobre IPv6
Existem muitas diferenças entre o IPv4 e o IPv6 que fogem ao escopo desse texto, importa saber que o protocolo IPv6 é uma substituição completa do IPv4 tornando os dois protocolos incompatíveis entre si. A interação com as camadas superiores (transporte e acima) pouco muda, porém na camada de rede os dois protocolos simplesmente não se conversam.
Diferente do IPv4 a notação do IPv6 utiliza :
para separar os
elementos do endereço e quando precisamos referenciar um socket
devemos grafar o endereço entre colchetes:
http://[2804:12c:f288:9533:e49f:5ce0:3c8:f38a]:8080
Endereços IPv6 longos podem ser abreviados simplesmente omitindo os zeros à esquerda em cada grupo. Por exemplo:
2001:0db8:0000:0000:1319:0000:0000:7334
Pode ser escrito como:
2001:db8:0:0:1319:0:0:7334
Além disso, sequências de zeros podem ser substituídas por ::
,
passando a ser escrito dessa forma:
2001:db8::1319:0:0:7334
A substituição da sequência só pode ser feita uma vez no endereço, para evitar ambiguidade. Logo a forma:
2001:db8:0:01319::7334
Também estaria correta.
Endereços IPv6 também utilizam a notação CIDR para especificar o prefixo de rede. Sua notação é igual à do IPv4:
2001:db8:0:01319::7334/64
Os endereços IPv6 são classificados em três tipos: Unicast, Anycast e Multicast:
- Unicast
- O endereço IPv6 Unicast identifica uma única interface de rede. Os pacotes destinados a um endereço Unicast serão encaminhados exclusivamente à interface em questão. Por padrão, os 64 bits à esquerda de um endereço IPv6 Unicast identificam a sua rede e os 64 bits à direita identificam a interface;
- Anycast
- O endereço IPv6 Anycast identifica um conjunto de interfaces de rede. Os pacotes destinados a um endereço Anycast serão encaminhados apenas à interface mais próxima dentro desse conjunto;
- Multicast
- Como o endereço IPv6 Anycast, o endereço IPv6 Multicast identifica um conjunto de interfaces de rede. Os pacotes destinados a um endereço Multicast serão encaminhados à todas interfaces de rede do conjunto. Apesar de ser semelhante ao Broadcast do IPv4, não pode ser confundido com o mesmo. No IPv6 não existe broadcast.
Roteamento
As redes privadas comunicam-se com a Internet por meio de um
roteador, que por sua vez comunica-se tanto com a rede privada
interna quanto com a rede externa, por meio de um IP público. A
tabela de rotas do roteador determina pra onde devem ser
encaminhados os pacotes que o roteador receber. O principal comando
para manejo de rotas é o route
. Utilizando o route
para
verificar as rotas do roteador:
┌─[root@centos7lpi]──[22:12]──[~] └─[1001]─># route -n Tabela de Roteamento IP do Kernel Destino Roteador MáscaraGen. Opções Métrica Ref Uso Iface 192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 192.168.6.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2 192.168.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3 0.0.0.0 191.252.222.1 0.0.0.0 UG 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 191.252.222.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Essa é uma tabela de rotas típica de um computador que age como
roteador e gateway. Existem quatro interfaces de rede
conectadas e configuradas. Três delas conectam-se a redes locais e
uma à Internet (endereço público). Também a interface lo
,
interface de comunicação interna que não corresponde a nenhuma
rede externa, possui um endereço privado.
Todos os pacotes que chegarem serão direcionados aos respectivos
destinos nas redes locais. Se o destino de um pacote não pertence a
nenhum host em uma rede local, este será direcionado ao gateway
padrão, indicado na linha da tabela com a flag UG. Apesar de,
via de regra, a rota para uma rede ser automaticamente criada
quando a interface é configurada, pode ser necessário adicionar
uma rota manualmente. Essa tarefa pode ser realizada com o comando
route
.
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
Este comando adiciona a routa para a rede 192.168.1.0/24
, por
meio da interface eth1
. Para criar uma rota padrão (default),
outra forma é utilizada:
route add default gw 192.168.1.1
Essa forma na verdade é um atalho para a forma extensa:
route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.1
De maneira praticamente idêntica, rotas podem ser removidas
utilizando del
no lugar do termo add
.
Os diretórios /proc/sys/net/ipv4
e /proc/sys/net/ipv6
Talvez, uma das áreas mais freqüentemente negligenciadas na
configuração de um servidor GNU/Linux envolva o sistema de arquivos
/proc
. A pseudo-estrutura de arquivos dentro de /proc
permite
que você interaja com as estruturas de dados internas do kernel,
seja obtendo informações sobre o sistema ou alterando configurações
específicas. Algumas das partes de /proc
são somente leitura,
enquanto outras podem ser editadas. É referido como um sistema de
arquivos virtual, pois não ocupa nenhum espaço real no disco
rígido; os arquivos são criados sob demanda quando são acessados.
Os diretórios /proc/sys/net/ipv4
e /proc/sys/net/ipv6
contém
variáveis que podem ser editadas para modificar o comportamento do
kernel em atividades relacionadas a redes. Algumas dessas
variáveis, quando usadas em conjunto com outras, são úteis em
prevenção de ataques ao sistema ou permitir e não permitir o uso do
sistema como um roteador.
Segue a lista de algumas das variáveis mais importantes:
icmp_destunreach_rate
,icmp_echoreply_rate
,icmp_paramprob_rate
eicmp_timeexeed_rate
- Define a taxa máxima de envio de
pacotes ICMP, em 1/100 de segundo, para hosts sob certas
condições. Uma configuração de
0
remove qualquer atraso e não é uma boa ideia; icmp_echo_ignore_all
eicmp_echo_ignore_broadcasts
- Permite
que o kernel ignore pacotes ICMP ECHO de cada host ou apenas
aqueles originados de endereços de broadcast e multicast,
respectivamente. Um valor de
0
permite que o kernel responda, enquanto um valor de1
ignora os pacotes; ip_default_ttl
- Define o Time To Live (TTL) padrão, que limita o número de saltos que um pacote pode fazer antes de chegar ao seu destino. Aumentar esse valor pode diminuir o desempenho do sistema;
ip_forward
- Permite que as interfaces do sistema encaminhem pacotes entre si, fazendo o sistema atuar como um roteador;
rp_filter
- Se o encaminhamento de pacotes for ativado, você
também poderá modificar a configuração
rp_filter
; algo que muitas vezes é mal compreendido pelos administradores de rede. Orp_filter
pode rejeitar pacotes de entrada se seu endereço de origem não corresponder à interface de rede na qual eles estão chegando, o que ajuda a prevenir falsificação de IP. Ativar isso, no entanto, tem suas consequências: se seu host tiver vários endereços IP em interfaces diferentes, ou se sua única interface tiver vários endereços IP, você descobrirá que seu kernel pode acabar rejeitando tráfego válido. Também é importante observar que, mesmo se você não habilitar o rpfilter, a proteção contra broadcast spoofing estará sempre ativada. Além disso, a proteção que ele fornece é apenas contra endereços internos falsificados; endereços externos ainda podem ser falsificados. Por padrão fica ativo. ip_local_port_range
- Especifica o intervalo de portas a serem usadas por TCP ou UDP quando uma porta local é necessária. O primeiro número é a porta mais baixa a ser usada e o segundo número especifica a porta mais alta. Qualquer sistema que espera exigir mais portas do que o padrão 1024 a 4999 deve usar um intervalo de 32768 a 61000;
tcp_syn_retries
- Fornece um limite para o número de vezes que o sistema retransmite um pacote SYN ao tentar fazer uma conexão;
tcp_retries1
- Define o número de retransmissões permitidas
tentando responder a uma conexão de entrada. Padrão de
3
; tcp_retries2
- Define o número de retransmissões permitidas de
pacotes TCP. Padrão de
15
; tcp_syncookies
- esta opção é disponível quando um kernel
está compilado com a opção
CONFIG_SYN_COOKIES
, ela define que sejam enviadossyncookies
quando a fila de backlog desyn
destinada a um socket estourar. É útil para evitar ataques de inundação desyn
(syn flood attack).
Dê uma atenção especial aos parâmetros rp_filter
,
tcp_syncookies
e ip_forward
(este último por medidas de
segurança, só deve ser quando realmente queremos utilizar o sistema
como um roteador).
Ajustando os parâmetros de kernel
Uma das vantagens de esses parâmetros de kernel serem
apresentados no sistema como arquivos é que podemos ler o conteúdo
deles com um simples cat
e também editá-los da mesma forma que
faríamos com um arquivo qualquer. Portanto o comando a seguir
(quando executado como root
) é plenamente viável:
echo "2" > /proc/sys/net/ipv4/tcp_syncookies
Porém existe o utilitário sysctl
que permite a leitura e a
edição dos parâmetros de kernel em tempo de execução:
┌─[root@CentOS7lpi]──[23:26]──[~] └─[1004]─># sysctl net.ipv4.net_ipforward sysctl: cannot stat /proc/sys/net/ipv4/net_ipforward: Arquivo ou diretório não encontrado ┌─[root@CentOS7lpi]──[23:26]──[~] └─[1005]─># sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0 ┌─[root@CentOS7lpi]──[23:26]──[~] └─[1006]─># sysctl net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1 ┌─[root@CentOS7lpi]──[23:26]──[~] └─[1007]─># sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
A sintaxe é simples chame o comando sysctl
e em $1
especifique
qual parâmetro vai ser lido ou editado, se for apenas ler deve ser
informado apenas o parâmetro, se for editar coloque o sinal de
igual =
seguido do valor.
Para que sejam mostrados todos os valores do sistema utilize a
opção -a
que pode ser filtrada com um grep
.
O comando sysctl
só permite a edição em tempo de execução para
que as edições sejam definitivas elas devem ser salvas em
/etc/sysctl.conf
.
O iptables
Hoje a maioria dos sistemas operacionais modernos conta com um sistema de filtragem de pacotes, os famosos Firewalls.
O GNU/Linux conta com um firewall implementado diretamente no kernel que é o netfilter (a grafia do nome é assim mesmo, com letra minúscula), que provê filtragem de pacotes, tradução de endereços de rede (NAT) tradução de portas (PAT), log de pacotes, organização do fluxo de dados em filas (para controles de qualidade de serviço) e mais.
Hoje existem duas ferramentas em espaço de usuário para interagir
"diretamente" com o netfilter, o iptables
e o nftables
, este
último é a nova ferramenta de espaço de usuário, não abordaremos ele
em nossos estudos pois está fora do escopo da prova, mas é
importante saber de sua existência.
O assunto sobre iptables
é bastante longo aqui vamos focar no
essencial para o exame LPIC2. Posto isso podemos definir que o
iptables
trabalha com tabelas! Aqui iremos abordar três delas:
- Filter: Usada para a filtragem de pacotes;
- NAT: Tabela responsável pelas traduções;
- Mangle: Pode ser usada para marcação de pacotes que posteriormente essas marcas posteriormente são usadas para processamento dos pacotes.
A arquitetura do iptables
agrupa regras de processamento de
pacotes de rede dentro das tabelas por função (filtragem de
pacotes, tradução de endereços e mangle), cada uma das tabelas tem
chains (sequências) de regras de processamento. As regras
consistem em matches (definições para "casar" um pacote) e
targets (alvos, que determinam o que será feito aos pacotes que
"casarem" com as regras.
Descritivo das chains:
- PREROUTING
- configurada para bloquear, redirecionar ou permitir o pacote para a próxima cadeia. Normalmente, usado para redirecionar o pacote para outro endereço e/ou porta. (DNAT ou tradução de destino). Se o destino for local (esta máquina), envie para a cadeia INPUT. Se for direcionado para outra rede, será enviado para a cadeia FORWARD;
- INPUT
- recebe regras para o pacote ser bloqueado, registrado ou enviado ao sistema local para ser gerenciado pelo cliente, aplicativo ou serviço apropriado;
- OUTPUT
- o pacote é enviado do firewall para a rede até seu destino final. (As regras geralmente não são aplicadas nesta chain);
- FORWARD
- os pacotes nessa chain são destinados a alvos como bloqueio, log ou enviados para a chain POSTROUTING.
- POSTROUTING
- executa mudanças para o pacote que está saindo do firewall, geralmente usado para regras de mascaramento (masquerading).
Como as tabelas e as chains se relacionam? Todas as três tabelas (FILTER, NAT e MANGLE) podem estar presentes em chains, mas nem toda chain participa de todas as tabelas:
NAT | Filter | Mangle | |
---|---|---|---|
PREROUTING | √ | √ | |
INPUT | √ | ||
FORWARD | √ | √ | |
OUTPUT | √ | √ | √ |
POSTROUTING | √ |
Como as regras são quebradas no sistema de firewall? As chains são pontos de filtragem onde podemos criar regras, e as regras são aplicadas à passagem de pacotes. As regras definem o que exatamente deve acontecer com um pacote.
ip6tables
A introdução da nova geração do IP (Internet Protocol), chamada IPv6, expande os limites de 32-bit do IPv4. O IPv6 suporta endereços de 128-bit e assim as operadorsa de Internet que trabalham com IPv6 conseguem endereçar um número inconcebível de endereços roteáveis.
O GNU/Linux suporta regras de firewall IPv6 usando o subsistema
netfilter6 e o comando ip6tables
.
As ações ou alvos das regras
Quando os pacotes passam através do iptables
ele compara o
cabeçalho do pacote com as regras existentes nas chains até
encontar alguma regra que corresponda ao pacote, que "dê
match". Quando isso acontece o alvo da regra será aplicado e nada
mais será tratado nesse pacote dentro dessa chain. Portanto as
posições das regras dentro do iptables
é muito importante.
Em toda regra há a declaração de um alvo, os alvos mais comuns são:
- ACCEPT
- o pacote terá passagem permitida;
- DROP
- o pacote será descartado silenciosamente;
- REJECT
- o pacote será bloqueado e o remetedor do pacote receberá uma mensagem de negação;
- LOG
- envia informações do pacote que casar com a regra com esse alvo para o log;
- MAQUERADE
- utilizado para NAT.
O alvo é especificado pela opção -j
.
Em todas as chains padrão pode-se definir uma política padrão
(policy). Quando o iptables
está sem regras previamente
definidas a política padrão das chains é ACCEPT
.
Quando se precisa alterar a política padrão de uma chain usa-se a
opção -P
conforme a seguir:
iptables -P drop INPUT
Após esse comando todos os pacotes que passarem por essa chain que "não casarem" com as regras existentes serão descartados.
Criando regras com o comando iptables
Observação: as opções em linha de comando para o iptables
e
para o ip6tables
são idênticas.
Os comandos para entrada de regras com o iptables
podem ser um
pouco longos, e algumas vezes difíceis de entender, portanto
vamos analizar os componentes padrão para facilitar o
entendimento.
iptables -A/I/D/R *CHAIN* *N* [-i/-o *interface*] [-s/-d *address*] -p
*protocol* --sport/--dport *XX* -j *TARGET*
Na linha de exemplo acima tudo que estiver em negrito exemplificam campos que serão substituídos por componentes da regra que for criada. Vamos falar dos opcionais apresentados acima:
-A/I/D/R
- Significam Append, Include, Delete e
Replace respectivamente:
- Append: adiciona a regra ao final da chain;
- Include: inclui a regra na posição especificada em ~ N ~ (logo após o nome da chain) se o número não for informado a regra será inserida na primeira posiçao (no topo da chain);
- Delete: deleta a regra na posição especificada em ~ N ~, aqui a posição da regra precisa ser informada caso contrário o comando não executará nada e retornará erro;
- Replace: substitui a regra na posição especificada em ~ N ~, aqui a posição da regra precisa ser informada caso contrário o comando não executará nada e retornará erro;
-i/-o
- especifica a interface de entrada ou saída;
-s/-d
- especifica o endereço de origem ou endereço de destino;
-p
- especifica o protocolo (tcp, udp, icmp);
--sport/--dport
- especifica a porta de origem ou porta de destino;
-j
- como já mensionado adiciona um alvo.
Opção | Descrição |
---|---|
-L <chain> -t <tabela> |
Lista todas as regras de uma tabela |
-F |
Limpa todas as regras, ou de uma chain (quando indicado) |
-P |
Muda a política padrão de uma chain, pode ser DROP ou ACEPT |
-v |
Modo verboso |
-n |
Quando usado em conjunto com -L lista as regras sem traduzir |
Exemplos
Liberar acesso SSH:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Se por acaso a política da chain OUTPUT
estiver setada para
DROP
precisamos liberar a saída dos pacotes do SSH:
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
Bloquear completamente a configuração automática de IPv6 no atravessem o roteador, tanto por RA (Router Adversiments) ou DHCPv6:
ip6tables -A FORWARD -s fe80::/64 -j DROP
ip6tables -A FORWARD -d fe80::/64 -j DROP
Bloquear que hosts da rede interna (conectada na eth1
)
enviem ping para um endereço de uma rede externa:
iptables -A FORWARD -i eth1 -d 8.8.8.8 -j DROP
Bloquear apenas tráfego TCP de um host específico:
iptables -A INPUT -p tcp -s 192.168.30.12 -j DROP
Aceitar todo trafego TCP para porta de DNS:
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
Liberar uma rede inteira para atravessar o firewall com tráfego HTTP:
iptables -A FORWARD -p tcp -s 192.168.30.0/24 --dport 80 -j
ACCEPT
Para motivos de investigação de problemas é interessante ver o
que está sendo descartado por um firewall iptables
portanto
poderíamos inserir a seguinte regra em uma chain que tiver
como política padrão DROP
na última posição (ao final) da
chain:
iptables -A INPUT -j LOG --log-prefix "iptables INPUT Drop:"
Esta regra irá registrar no /var/log/messages
mensagens de
logs relativas a todos os pacotes descartados.
Salvando e recuperando as regras
As regras de iptables
não são persistentes a reboot portanto
faz muito sentido poder salvá-las para depois poder
recuperá-las. Para isso utilizands os comandos iptables-save
e
iptables-restore
.
O nome dos comandos é autoexplicativo porém seu uso é feito utilizando STDOUT e STDIN para salvar e recuperar as regras.
Salvando regras:
iptables-save > /etc/sysconfig/iptables
Pela ordem é boa prática salvar as regras do iptables
em
/etc/sysconfig/
porém pode ser em qualquer local que o
administrador achar interessante. Também por boa pratica é
interessante datar seus backups de firewall para ter um histórico
e ajudar em possíveis resoluções de problema, para tanto podemos
usar o comando date
dentro de um subshell:
iptables-save > /etc/sysconfig/iptables-$(date "+%Y%m%d%H%M")
Para recuperar as regras salvas usa-se o caminho inverso:
iptables-restore < /etc/sysconfig/iptables
Para subir as regras após um reboot tradicionalmente coloca-se
o comando iptables-restore
apontando para o arquivo de regras
dentro do arquivo /etc/rc.local
.
Essa técnica está entrando em desuso hoje distribuições como o
CentOS contam com o "Serviço iptables" que é formado apenas de
scripts bem elaborados utilizando o comando
iptables-save
e iptables-restore
para salvar e subir as
regras no momento propício após o reboot.
Salvando regras com o "serviço iptables":
service iptables save
Hoje no CentOS7 utiliza-se o firewalld
que é uma interface
completa para o iptables
criando regras utilizando o conceito
de zonas permitindo configurações e uma leitura muito mais
organizada do que com o iptables
puro, mas não passa de uma
simples interface. Seu uso, apesar de interessante, foge do
escopo desse estudo.
Redirecionamento de sockets
Eventualmente é necessário redirecionar algum tráfego destinado a um host para outro, ou redirecionar o tráfego de um número de porta para outra porta, ou até mesmo redirecionar o tráfego destinado a um endereço+porta para outro endereço+porta essas operações são conhecidas como NAT (Network Addres Translation ou tradução de endereço de rede) e PAT (Port Address Translation tradução de endereço de porta).
- NAT
- Nessa operação o roteador irá traduzir apenas o endereço IP do pacote, podendo ser dividido em DNAT (Destination NAT) e SNAT (Source NAT), em outras palavras podemos traduzir o endereço de destino do pacote e/ou o endereço de origem do pacote.
- PAT
- Nessa operação o roteador irá traduzir a porta de origem e/ou a porta de destino do pacote
Esses dois métodos de tradução podem ser utilizados individualmente ou combinados.
Este é um assunto bastante extenso e como já exposto é importante
ter conhecimento prévio sobre protocolo TCP/IP para melhor
compreenção desse tópico. Como aqui o interesse é a preparação
para a execução do exame LPIC2 infelizmente não podemos ir mais a
fundo nas explicações do conceitual da tradução (ou
redirecionamento de sockets). Vamos focar na prática do uso do
iptables
para a execução dessas traduções.
Redirecionamento de sockets no mesmo host
Eventualmente é necessário redirecionar o tráfego entregue em uma
porta em outra porta, por exemplo algum serviço WEB que por
padrão escute na porta 8080, porém queremos que o usuário final
não precise digitar o apêndice do sochet no navegador
(:8080
), para tanto podemos mandar todo direcionado a porta
80
para a 8080
:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j REDIRECT --to-port 80
Importante a tabela padrão do iptables
é a Filter e é ela
a quem o comando se refere por omissão, portanto quando queremos
escrever em outra tabela precisamos utilizar -t <tabela>
conforme mostrado no comando acima.
Redirecionamento de sockets para outros hosts
Aqui entra os conceitos de roteamento portanto para darmos
continuidade nas atividades precisaremos ativar o parâmetro de
kernel ip_forward
definindo-o para 1
.
sysctl net.ipv4.ip_forward=1
Redirecionando sockets de origem SNAT
Eventualmente precisamos alterar o socket de origem de um pacote, um exemplo prático disso é o de um servidor GNU/Linux atuando como gateway de rede. E como gateway o servidor GNU/Linux é o único que possui um endereço de IP roteável na Internet, os computadores conectados atrás dele tem apenas IPs pertencentes às classes privadas.
Esses computadores que não possuem IPs roteáveis estáo
configurados para procurar quaisquer redes diferentes através do
gateway da rede (nosso servidor GNU/Linux) este, estando definido
o parâmetro net.ipv4.ip_forward=1
irá verificar o endereço de
destino do pacote e entenderá que deverá remeter esse pacote
para a Internet através de sua interface que está conectada no
roteador da operadora de Internet.
Mas para isso ele precisa ser orientado a editar o endereço de origem do pacote, mudando ele para o IP roteável, caso contrário o pacote possívelmente seria descartado pelo roteador da operadora (IPs da classe privada, por padrão são bloqueados nos roteadores da Internet pública.
A chain que precisaremos editar para isso será a POSTROUTING da tabela NAT.
O considerando que nossa rede privada seja 192.168.0.0/24
e
nossa interface conectada à Internet seja a eth0
comando para tal tarefa seria:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 201.53.60.12
Isso para o caso de termos um IP Fixo contratado na operadora
de Internet, sabemos que isso nem sempre é o caso, as vezes o IP
contratado é entregue dinâmica e randômicamente via DHCP pela
operadora. Nesses casos utilizamos o alvo MASQUERADE
:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
Nesses dois exemplos se a chain FORWARD da tabela Filter estiver configurada para DROP a seguinte regra também precisa ser criada para liberar o trânsito dos pacotes:
iptables -A FORWARD -s 192.168.0.0/24 -o eth0 -j ACCEPT
Ou também
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
Direcionando sockets de destino DNAT
O direcionamento de sockets de pode ser considerado o inverso do apresentando no tópico anterior. Pois no tópico anterior estamos permitindo que um host invisível na Internet consiga se comunicar com um host visível. Agora vamos fazer com que o tráfego de um host visível na Internet seja entregue a um host invisível, virtualmente sem que o host de origem perceba isso.
Esta técnica é útil quando, por exemplo, temos um servidor rodando o webserver Apache em nossa rede de IPs privados e queremos que a página sustentada nesse Apache seja alcançável por hosts na Internet.
Para tanto permitiremos que todo o tráfego que chegar em um dos IPs públicos disponíveis na interface conectada à Internet em nosso Gateway seja entregue ao nosso servidor Apache.
A chain que precisaremos editar para isso será a PREROUTING na tabela NAT.
Logo, suponhamos que o IP de nosso servidor Apache seja
192.168.0.80
a regra para o cenário proposto seria a seguinte:
iptables -t nat -A PREROUTING -i eth0 -d 201.53.60.12 -j DNAT --to-destination 192.168.0.80
Se por acaso a chain FORWARD da tabela Filter estiver setada para DROP precisamos dar permissão para a passagem dos pacotes:
iptables -A FORWARD -i eth0 -d 192.168.0.80 -j ACCEPT
Há cenários onde não há muitos IPs públicos disponíveis nesses talvez seja interessante especificar exatamente o socket que deve casar com a regra de redirecionamento, segue o comando para o mesmo exemplo do servidor WEB, agora casando completamente o socket do serviço web:
iptables -t nat -A PREROUTING -i eth0 -d 201.53.60.12 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.80
Note que no comando acima não especificamos a porta do socket resultante do redirecionamento pois assume-se que a única coisa editada foi o endereço. Porém e se o webserver estiver utilizando uma porta diferente como a 8080? Assim podemos também especificar além da troca do endereço de IP de destino a porta de destino:
iptables -t nat -A PREROUTING -i eth0 -d 201.53.60.12 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.80:8080
Logo podemos (e devemos) deixar a regra de acesso criado na chain FORWARD da tabela Filter mais restrita:
iptables -A FORWARD -i etho -d 192.168.0.80 -p tcp --dport 80 -j ACCEPT
O arquivo /etc/services
Os sistemas operacionais UNIX armazenam o que é chamado de arquivo
de serviços em /etc/services
. Ele armazena informações sobre
vários serviços que os aplicativos cliente podem usar no
computador. Dentro do arquivo estão o nome do serviço, o número da
porta e o protocolo que ele usa, e todos os aliases aplicáveis. Os
números das portas são mapeados para serviços específicos, da mesma
forma que o arquivo /etc/hosts
mapeia um nome
de host para um endereço IP. No entanto, o arquivo de serviços do
UNIX não inclui endereços IP, mas sim
informações como se o serviço é TCP ou UDP e quais nomes comuns ele
pode ter.
Utilização do /etc/services
No UNIX, a função principal do arquivo de configuração
/etc/services
é que os programas possam fazer uma chamada
socket getportbyname ()
em seu código para entender qual porta eles devem
usar. Por exemplo, um daemon de e-mail POP3 consulta
getportbyname (POP3)
para recuperar o número 110 no qual o POP3
é executado. A
ideia é que, se todos os daemons POP3 usarem getportbyname ()
, não
importa qual daemon POP3 você execute, você sempre poderá
reconfigurar seu número de porta editando /etc/services
. Não é
confiável usar o arquivo de serviços para discernir o que
significam os números de porta. Para descobrir quais portas os
programas estão realmente usando, você deve usar o programa lsof
para
descobrir exatamente quais portas estão associadas a quais
processos. Se executar o lsof
não for apropriado, você deve
pesquisar as portas em uma referência mais genérica.
Esse arquivo também pode ser editado quando necessário ajustar
alguma nomenclatura a ser mostrada no comando iptables -L
. Por
exemplo se quisermos editar a porta 8080 para corresponder ao DVR
da empresa, faríamos assim:
DVR-WEB 8080/tcp #Porta WEB do DVR
Assim quando formos ler as regras do iptables
em formato texto
não numérico o termo tcp dpt:DVR-WEB
será apresentado no lugar de
tcp dpt:8080
.
Também poderia ser útil na hora de inserir regras no iptables
por
exemplo:
iptables -A FORWARD -i eth0 -s 192.168.0.80 -p tcp --dport DVR-WEB -j ACCEPT
# /etc/services: # $Id: services,v 1.55 2013/04/14 ovasik Exp $ # # Network services, Internet style # IANA services version: last updated 2013-04-10 # # Note that it is presently the policy of IANA to assign a single well-known # port number for both TCP and UDP; hence, most entries here have two entries # even if the protocol doesn't support UDP operations. # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports # are included, only the more common ones. # # The latest IANA port assignments can be gotten from # http://www.iana.org/assignments/port-numbers # The Well Known Ports are those from 0 through 1023. # The Registered Ports are those from 1024 through 49151 # The Dynamic and/or Private Ports are those from 49152 through 65535 # # Each line describes one service, and is of the form: # # service-name port/protocol [aliases ...] [# comment] tcpmux 1/tcp # TCP port service multiplexer tcpmux 1/udp # TCP port service multiplexer rje 5/tcp # Remote Job Entry rje 5/udp # Remote Job Entry echo 7/tcp echo 7/udp discard 9/tcp sink null discard 9/udp sink null systat 11/tcp users systat 11/udp users daytime 13/tcp daytime 13/udp qotd 17/tcp quote qotd 17/udp quote msp 18/tcp # message send protocol (historic) msp 18/udp # message send protocol (historic) chargen 19/tcp ttytst source chargen 19/udp ttytst source ftp-data 20/tcp ftp-data 20/udp # 21 is registered to ftp, but also used by fsp ftp 21/tcp ftp 21/udp fsp fspd ssh 22/tcp # The Secure Shell (SSH) Protocol ssh 22/udp # The Secure Shell (SSH) Protocol telnet 23/tcp telnet 23/udp