UP | HOME

LPI-2 202-450 Topico 212.1
Configuração de roteador

Índice

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:

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.

Tabela 1: Classes privadas de endereçamento IP
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 e icmp_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 e icmp_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 de 1 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. O rp_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 enviados syncookies quando a fila de backlog de syn destinada a um socket estourar. É útil para evitar ataques de inundação de syn (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:

  1. Filter: Usada para a filtragem de pacotes;
  2. NAT: Tabela responsável pelas traduções;
  3. 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:

Tabela 2: Relação entre tabelas e chains
  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.
Tabela 3: Opções do comando iptables além da manipulação de regras
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

Autor: Jeremias Alves Queiroz

Criado em: 2021-12-17 sex 00:40

Valid XHTML 1.0 Strict