Firewall Linux - iptables - Parte 2


Conceitos: Tabelas, Chains, Targets e Política Padrão.

Tabelas:
No iptables, o tratamento dos pacotes é realizado em tabelas. Cada tabela realiza basicamente um tipo operação nos pacotes, conforme vemos a seguir:

1) Tabela filter: Filtragem de pacotes (quem pode acessar o quê, e sob quais condições)
2) Tabela nat: Modificações nos endereços e/ou portas de origem e de destino dos pacotes.
3) Tabela mangle: Alterações avançadas no pacote: inserção de marcas (tags), alteração da prioridade do pacote na "fila" de envio da placa de rede, etc (não vai ser coberta aqui.)

Chains (cadeias, no sentido de correntes ou fluxos):
São contêineres para as regras. O iptables vem com um grupo padrão de chains em cada tabela, e os usuários podem criar chains adicionais, para facilitar a gerência das regras. As chains padrão são (nem todas as tabelas possuem todas as chains):

INPUT: trata os pacotes que estão entrando na máquina e não vão sair, ou seja, o destino final do pacote é a própria máquina firewall.

OUTPUT: trata dos pacotes que foram criados na própria máquina e vão sair dela.

FORWARD: trata os pacotes que atravessam a máquina (entram por uma placa de rede e saem por outra. Ex: pacotes com origem na rede local com destino à Internet ou vice-versa).

PREROUTING: trata os pacotes antes (PRE) da decisão de roteamento (ROUTING). É utilizada para alterar o DESTINO dos pacotes (DNAT) na tabela nat.

POSTROUTING: trata os pacotes após (POST) a decisão de roteamento (ROUTING). É utilizada para alterar a ORIGEM dos pacotes (SNAT) na tabela nat.

Observação: o nome das chains padrão sempre é em letras maiusculas.

Targets (ou alvos):
Define o que é feito com o pacote que combine com a regra. Alguns targets (os que fazem alterações nos pacotes) só podem ser utilizados na tabela NAT.

Observação: é possível a criação de regras sem target. Um pacote que combine com essas regras apenas incrementa a contagem de bytes e pacotes da regra (útil para contabilidade de pacotes.) Para visualizar a contagem de pacotes das

ACCEPT: Aceita os pacotes que batam com a descrição da regra

REJECT: Rejeita os pacotes que batam com a regra. É enviada uma mensagem de rejeição ao emissor do pacote.

DROP: Ignora os pacotes que batam com a regra. É semelhante ao REJECT, porém não é enviada nenhuma mensagem ao emissor.

RETURN: Cancela o processamento do pacote na chain atual e o envia de volta à chain onde estava anteriormente.

SNAT: Altera o campo de origem (source) do pacote IP, podendo alterar também a porta de origem.

DNAT: Altera o campo de destino (destination) do pacote IP, podendo alterar também a porta de destino.

REDIRECT: Faz um DNAT onde apenas a porta de destino pode ser escolhida. O endereço IP de destino sempre é o da própria máquina firewall. Utilizado para proxy tranparente.

MASQUERADE: Mascaramento de IP. Tipo especial de SNAT, utilizado principalmente para compartilhar conexões com IPs dinâmicos, como conexões dial-up (internet discada) e ADSL (Velox, por exemplo).

MARK: "Marca" o pacote com uma etiqueta, para processamento posterior (inclusive por outros programas que não o iptables). A "marca" existe apenas no próprio firewall (programas em outras máquinas não conseguem visualizar a marcação).

TCPMSS: Permite alterar o tamanho máximo do pacote, para solucionar (ou prevenir) problemas de transmissão de dados. Só pode ser utilizada com o protocolo TCP (opção -p tcp)

TOS: Permite alterar o campo TOS (Type Of Service) do cabeçalho IP.

QUEUE/NFQUEUE: Permite enviar o pacote para programas compilados com suporte a biblioteca libipq. Os programas podem manipular o pacote e devolvê-lo ao iptables.

LOG: Cria uma entrada de LOG do pacote que combina com a regra. A entrada é registrada através do SYSLOG. Após ser registrado no sistema de log, o pacote continua seguindo pela chain, para ser processado por outras regras.

ULOG: Uma mistura de QUEUE com LOG, onde o pacote é enviado para um programa para fins de LOG. Isso permite, por exemplo, logar pacotes em bancos de dados (como o MySQL) para facilitar a geração de relatórios.

Caso especial: nome de uma chain personalizada. Faz com que o pacote que bata com aquela regra seja redirecionado para uma chain personalizada (criada pelo usuário) para ser tratado pelas regras desta chain.

Policy (política padrão):
Por mais completas que sejam, suas regras de firewall nunca irão cobrir todas as possibilidades. Por isso, alteramos a POLICY (política padrão) da chain. Um pacote que atravesse toda uma CHAIN sem combinar com nenhuma REGRA é tratado pela POLICY padrão da chain. As POLICY são ACCEPT, REJECT e DROP, e têm o mesmo comportamento dos TARGETS definidos anteriormente. A POLICY padrão das CHAINS é ACCEPT (se um pacote não bater com nenhuma regra ele é aceito)  Normalmente, coloca-se a política padrão de chains como INPUT e FORWARD como DROP. Com isso, tudo o que não for explícitamente liberado será bloqueado.

Continue lendo >>

Firewall Linux - iptables - Parte 1


Introdução

Historia do Firewall Linux:
Kernel 2.0 (Jan/1999): ipfwadm
Kernel 2.2 (Dez/1999): ipchains, stateless, dependia de programas externos para realizar NAT
Kernel 2.4 (Jan/2001) e
Kernel 2.6 (Dez/2003): iptables, stateful, realiza nat independente de programas externos.

Statefull X Stateless:
Uma conexão normalmente é composta de diversos pacotes. O firewall statefull associa o primeiro pacote da conexão aos demais, e consegue distinguir qual a relação desse pacote com os demais (ex: se o pacote é de uma conexão nova (NEW) ou já estabelecida (ESTABLISHED), entre outros tipos). Isso facilita as regras e checagens, além de permitir maior controle sobre operações como geração de LOGs.

Iptables ou Netfilter?
Algumas vezes vemos escrito que o firewall do Linux é o iptables. Outras vezes, que é o netfilter. Afinal, qual o correto? Na verdade, ambas as definições estão corretas:

Netfilter é a tecnologia de firewall integrada ao kernel.
Iptables é a ferramenta (programa) que configura essa tecnologia.

Outras ferramentas:
O iptables é parte de uma "família" de ferramentas que configuram diferentes protocolos de rede:
iptables: protocolo IPv4.
ip6tables: protocolo IPv6.
arptables: protocolo ARP.
ebtables: protocolo ethernet (utilizado em bridges).

Continue lendo >>

SSH Forwarding

Uma das funções  freqüentemente negligenciadas do protocolo SSH é o encaminhamento (ou forwarding ou ainda tunelamento) de conexões.
Exemplos de uso:

  • Administração remota de serviços que só permitem acesso através do endereço localhost (127.0.0.1). Dois serviços com esse comportamento por padrão são o Webmin e o CUPS. (redirecionamento local -> remoto)
  • Acesso seguro a serviços que normalmente não suportam criptografia, como o VNC (redirecionamento remoto-> local).
  • Acesso seguro (criptografado) a emails e sites através de redes públicas e não criptografadas. (redirecionamento local -> remoto)
  • Permitir o acesso de máquinas remotas à sua rede. (redirecionamento remoto-> local)
  • Exibir a tela de um programa gráfico em outra estação. (redirecionamento X11)

Caso 1: Redirecionamento local -> remoto

Nesse caso, vamos especificar uma porta TCP local (na máquina onde é executado o cliente ssh). Todo o tráfego que atingir essa porta será encaminhado pelo túnel SSH para um endereço na rede remota. Esse endereço pode ser a própria máquina onde roda o servidor SSH ou outra, desde que acessível pelo servidor SSH. A porta local precisa estar disponível. Para fechar o túnel, encerra-se a conexão.

A sintaxe do comando SSH para esse caso é:


ssh -L [endereço local]:porta local:host remoto:porta remota servidor_ssh

Onde:
Endereço Local: Endereço IP que será associado a essa conexão. Esse parâmetro é opcional. Se for omitido, a conexão será criada em todos os endereços/interfaces de rede do computador. Se for informado um endereço IP diferente de 127.0.0.1 (ou localhost), outras máquinas poderão utilizar-se do túnel. Caso  seja informado o endereço 127.0.0.1 o túnel ficará disponível apenas para a própria máquina cliente.
Porta Local: Porta TCP que receberá as conexões na máquina cliente e as encaminhará para a máquina remota. Esta porta precisa estar disponível.
Host Remoto: Endereço na rede do servidor SSH  para onde as requisições serão encaminhadas.
Porta Remota: Porta no Host Remoto para onde as conexões serão encaminhadas.
Servidor SSH: Endereço ou nome do servidor SSH que receberá as conexões.
Obs: outros parâmetros (como nome de usuário, porta SSH, etc) podem ser informados normalmente.

Exemplos:
acessando remotamente a administração de impressoras do CUPS (porta 631):
Vamos direcionar o trafego na porta local 5555 para a porta 631 do servidor 192.168.0.12, através de uma conexão SSH nesse mesmo servidor:

ssh -L 5555:192.168.0.12:631 192.168.0.12

Caso fosse necessário utilizar um usuário específico (por exemplo: joao), o comando ficaria assim:

ssh -L 5555:192.168.0.12:631 joao@192.168.0.12

Caso o servidor SSH estivesse em uma porta diferente da padrão (22), digamos porta 2222, faríamos dessa maneira:

ssh -p 2222 -L 5555:192.168.0.12:631 joao@192.168.0.12

Caso você deseje que as máquinas que se conectarem à sua estação possam utilizar o tunel, o comando seria (supondo que o IP de sua estação seja 10.0.0.28):
ssh -p 2222 -L 10.0.0.28:5555:192.168.0.12:631 joao@192.168.0.12

Com a conexão estabelecia, bastaria abrir o navegador web e acessar o endereço
http://localhost:631 (ou http://10.0.0.28:631 no caso de outras máquinas) para realizar o acesso.

Outro exemplo prático: Suponhamos que você está com seu notebook em um CyberCafe, com conexão WiFi Open (sem criptografia) e deseja acessar os emails no servidor POP de sua empresa de forma segura. Para isso, você precisaria ter acesso SSH a um dos equipamentos da empresa, como um firewall ou outro servidor. Supondo-se que que dados de conexão sejam:
Firewall (com acesso SSH na porta 7788): 200.200.200.200
Servidor de Email (rodando POP na porta 110) : 172.16.100.50
Usuário para acesso SSH: antonio

o comando seria: 

ssh -p 7788 -L 110:172.16.100.50: antonio@200.200.200.200

Agora, basta configurar seu cliente de email para acessar o servidor POP-3 no endereço 127.0.0.1, porta 110 e acessar suas mensagens de forma criptografada.

Caso 2: Redirecionamento remoto -> local
Esse redirecionamento é pouco usado, mas mesmo assim bastante útil. Já o utilizei algumas vezes da seguinte maneira: na empresa onde trabalhava, eu administrava algumas máquinas que ficavam dentro da rede dos clientes. Essas máquinas normalmente não tinham acesso à internet, e o processo de liberação de internet para esses equipamentos era muito burocrático, o que causava problemas na hora de fazer alguma atualização ou instalar novos programas. Minha solução foi utilizar um redirecionamento SSH remoto, permitindo que os equipamentos utilizassem o proxy da minha empresa, e saíssem para a internet através do meu link. Em um caso como esse, o comando ficaria assim:

ssh -R 3128:192.168.0.210:8080 juca@200.200.200.200

No exemplo acima, eu conectei com o usuário juca no servidor 200.200.200.200. Após conectar, basta configurar o programa para utilizar um proxy no endereço localhost, porta 3128. Tudo que a máquina remota "jogar" nesta porta será redirecionado para a porta 8080 do IP 192.168.0.210 na minha rede local.

Caso 3: Redirecionamento do X Server (X11 Forwarding)

Esse é um dos mais simples, e ao mesmo tempo mais úteis: é possível "puxar" a tela de um programa de outro servidor Linux. Nesse caso, o programa estará rodando na máquina remota e apenas as informações de mouse, teclado e tela são trafegadas via rede. É semelhante ao próprio protocolo SSH (onde é realizado um acesso a uma máquina remota, e todo o processamento ocorre na máquina acessada. Nossa máquina apenas envia e recebe informações de teclado e tela). A diferença nesse caso é que como é utilizado o protocolo X, as informações de tela são gráficas, ao invés de apenas texto. Para utilizar o redirecionamento, simplesmente abra um terminal modo texto (já dentro do ambiente gráfico) e digite:

ssh -X usuario@192.168.0.1

A opção -X faz toda a mágica para você. Agora basta rodar qualquer aplicativo gráfico, e embora a tela apareça no seu computador, todo o processamento ocorrerá na máquina remota. O aplicativo também estará acessando o hardware (discos, fitas, etc) da máquina remota. Isso é utilizado para acessar consoles de administração remota, para tarefas que seriam muito complexas (ou mesmo inviáveis) em linha de comando. Mais simples impossível!

Continue lendo >>

Resumo dos principais comandos do vi/vim


Opções da linha de comando:
-R abre arquivo como somente leitura
-r/-L lista os arquivos swap no diretório atual, bem como em diretórios chave e sai.
+ começa na última linha
+numero começa na linha determinada. Ex: vim +15 arq.txt começa na linha 15 de arq.txt, ao invés da primeira
-o abre os arquivos em "janelas" (a tela fica dividida horizontalmente). Útil para comparar arquivos.
-O abre os arquivos em "janelas verticais" (a tela fica dividida verticalmente).
-X não conecta em um servidor X
Modos de operação:
O vim possui dois modos de operação:

Modo de inserção de texto:
nesse modo, o vim comporta-se como um editor de texto normal, ou seja, cada tecla pressionada exibirá seu valor na tela normalmente. Para entrar no modo de inserção de texto, pressione a tecla INSERT ou a tecla i.

Modo de comandos:
É o modo inicial do Vim. Nesse modo, cada tecla (ou combinação de teclas) possui uma função especial. Para enttrar no modo de comandos, pressione a tecla ESC.

Arquivos SWAP
Quando você abre um arquivo no vim, ele cria um arquivo oculto de swap. As alterações são registradas inicialmente nesse arquivo de swap e efetivadas no arquivo editado a cada operação de salvamento. Caso haja algum problema durante a edição do arquivo (ex: falta de energia), quando o mesmo arquivo é editado novamente, o vim detecta a presença do arquivo swap e oferece algumas opções:

Operações com arquivos:
Observação: sempre que há a troca do arquivo atual (quando há mais de uma arquivo aberto), quando um arquivo é aberto para edição ou quando o programa for encerrado, é necessário salvar o arquivo, caso o mesmo tenha sofrido alterações. Caso não se deseje salvar as alterações, deve-se acrescentar uma exclamação "!" - para forçar o fechamento/troca do arquivo, desprezando as alterações no arquivo atual.

:e arquivo
abre um arquivo para edição.

:r arquivo
insere o conteúdo de um arquivo na posição atual do cursor

:w
grava o arquivo atual e continua o trabalho.

:w arquivoNovo
salva o arquivo atual com outro nome (arquivNovo) e continua trabalhando no mesmo arquivo (ao contrário de outros editores de texto que passariam a trabalhar com o arquivo recém criado - no caso do exemplo, arquivoNovo).

:q 
sai do programa.

:q!
sai do programa descartando as alterações.

:n 
passa para o proximo arquivo aberto.

:prev
passa para o arquivo anterior

:first 
vai para o primeiro arquivo

:last
vai para o ultimo arquivo

Observação: você pode "juntar" alguns comandos, de modo a realizar duas operações juntas. Por exemplo, para gravar o arquivo e sair do programa, ao invés de executar :w e :q em separado, você pode fazer :wq. Da mesma forma, :wn grava o arquivo atual e vai para o próximo, :wprev grava o arquivo atual e vai para o anterior e assim sucessivamente. Por último, :x é um apelido para :wq (salva e sai).

Comandos para navegação dentro do Texto:

h
um caracter para a esquerda

l
um caracter para a direita


j
uma linha abaixo


k
uma linha acima

método para memorizar: a tecla J lembra uma seta pra baixo, e tem exatamente esta função. A tecla ao seu lado (K) é a seta para cima. A tecla à esquerda das duas (H) faz a seta para a esquerda. E a tecla à direita do conjunto (L) é a seta para a direita. Simples, não?

gg
:1
primeira linha

:numero
vai para a linha desejada. Por exemplo, :50 vai para a 50ª linha.

numero+G
vai para a linha desejada. Por exemplo, 10G vai para a 10ª linha.

G
vai para a última linha. Obs: G maiúsculo.

^
inicio da linha (é preciso digitar um espaço depois do símbolo)

$
final da linha.

Comandos de busca:
f+caracter
avança para a direita até a primeira ocorrência do caracter

F+caracter
retrocede para a esquerda até a primeira ocorrência do caracter

/
pesquisa por string/regex.

?
pesquisa por string/regex. Pesquisa no sentido inverso (para cima).

*
pesquisa pela palavra sobre o cursor.

#
pesquisa pela palavra sobre o cursor. pesquisa no sentido inverso (para cima).

Em quaisquer uma das pesquisas, pressione n para localizar a proxima ocorrência. Pressione N para pesquisar no sentido inverso (ocorrencia anterior - para cima).

Comandos de substituição:
:[range]s/texto\ a\ procurar/[texto a substituir]/[gc]

Onde:
[range] (opcional): range de linhas onde realizar a busca/substituição. Se não informado, faz apenas na linha atual. Caracteres especiais em range:
% - todas as linhas (arquivo todo)
$ - até o fim do arquivo

texto\ a\ procurar: texto que será buscado. Caracteres especiais (que têem significado devem ser protegidos (ou escapados) com "\" (sem aspas), como no exemplo. Para pesquisar por uma "\" utilize "\\".
[texto a substituir] (opcional): texto que será trocado pelo que for encontrado. Se não for informado, o texto encontrado é removido e nada é posto em seu lugar.
g: substitui todas as ocorrencias do texto encontrado. Se não estiver presente, apenas a primeira ocorrência de cada linha é substituida.
c: pede confirmação antes de fazer a substituição


Exemplos de ranges:
:%s/brasil/Brasil/        (arquivo todo)
:50,60s/brasil/Brasil/   (da linha 50 até a 60)
:20,$s/brasil/Brasil/      (da linha 20 até o fim do arquivo)



Mais exemplos:
:%s/brasil/Brasil/gc

Comandos para alteração de caracteres:
~
inverte a caixa do caracter (converte maiusculas em minusculas e vice-versa)

x
d+espaço
exclui o caracter sobre o cursor

r+caracter
troca o caracter sobre o cursor pelo digitado.

Comandos para operações com Buffer (área de transferência)
D
dd
recorta toda a linha e coloca no buffer

Y
yy
copia toda a linha para o buffer, sem removê-la do local atual.

p
cola o conteúdo do buffer na posição atual do cursor.

P
cola o conteúdo do buffer na linha acima da posição atual do cursor.

Repetição de comandos:
numero+comando
executa o comando um certo numero de vezes. Exemplos:

10x
exclui 10 caracteres (o que está sob o cursor mais nove à direita)

3yy
copia 3 linhas para o buffer (a linha atual mais duas abaixo)

5l
"anda" 3 caracteres para a direita

Mistureba (misturando comandos):
dG
recorta tudo entre a posição atual do cursor e o fim do arquivo. Mistura de d (recortar) com G (ir para o final do arquivo)

dgg
recorta tudo entre a posição atual do cursor e o começo do arquivo. Mistura de d (recortar) com gg (ir para o começo do arquivo)

:r !cmd
executa o comando cmd e insere sua saída no texto.

:wq
salva e sai

:wn
salva e avança para o próximo arquivo

:wlast
salva e avança para o último arquivo

Modos Visuais:
Permitem selecionar trechos do texto, para definir o local que será afetado pelo próximo comando (uma busca e substituição ou copiar/recortar, por exemplo).
Existem dois tipos:
Visual (ativado com a tecla v): permite selecionar trechos de linhas, linhas inteiras ou uma combinação disso (uma linha interira e um pedaço de outra abaixo ou acima, por exemplo). Após selecionar, é possível recortar (com d), copiar (com y) ou substituir por outro conteúdo (com p).
Visual Block (ativado com ctrl+v): similar ao modo visual, porém permite selecionar blocos de texto. Por exemplo, é possível selecionar apenas a primeira coluna de cada linha (útil para descomentar várias linhas de uma vez em arquivos de configuração).

Opções úteis
Obs: a maioria dessas opções pode ser colocada diretamente no arquivo de configuração do vim, /etc/vim/vimrc

:set ai
:set noai
Liga/desliga autoidentação. Normalmente é desejavel deixar a identação ligada, principalmente quando se está escrevendo programas/scripts (deixa o texto mais organizado). Porém, em algumas situações pode atrapalhar. Por exemplo, quando se cola texto no PuTTY (a partir do Windows) e essa opção está ativada, o texto fica com um aspecto de "escada" (veja imagem abaixo).

:set bg=dark
:set bg=light
Informa ao vim qual se a cor de fundo da tela é clara ou escura, para que ele possa utilizar um esquema de cores agradável. Normalmente conexões via console e SSH tem fundo escuro, enquanto que em emuladores de console dos ambientes gráficos (kterm no KDE, gterm no Gnome, etc) costumam ter o fundo claro.

:set showcmd
:set noshowcmd
Faz com que os comandos digitados, bem como os modificadores numéricos apareçam, à esquerda da informação de posição do cursor.

:set number
:set nonumber
Exibe/oculta o numero de cada linha

:help assunto
Mostra o help do vim sobre o assunto/comando informado. Será aberta uma nova "janela" (a tela ficará dividida horizontalmente em duas). Para alternar entre as janelas, pressione CTRL+W CTRL+W (duas vezes). Assim, você pode alternar entre a navegação no texto do help e no seu próprio texto. Para sair do help, pressione :q. Você voltará à edição do seu arquivo.

:! cmd
executa o comando cmd no shell dentro do vim, e mostra o resultado na tela (mas não altera o arquivo). Útil para compilar código/realizar testes durante a programação sem precisar sair do editor. Ou para trocar a permissão do arquivo sendo editado, para permitir salvar as alterações.
Ex:
:! gcc -o main main.c
:!php arquivo.php
:chmod u+w arquivo.txt

Continue lendo >>

  ©Pragas Digitais - Todos os direitos reservados.

Template by Dicas Blogger | Topo