Quatro tipos de erros mais comuns em programação PHP

Erros são inevitáveis. Sempre, a falta de tempo que ronda os programadores, está relacionada não com a geração de códigos em si, mas com a eliminação de erros no código (debuging); uma longa e árdua tarefa. Não pense em erros como problemas, mas como oportunidades de melhorar seu código para certificar a funcionalidade do projeto final.

Esse artigo examina 4 tipos de erros na Internet, como reconhecê-los e, finalmente, como concertá-los rapidamente. Depois, eu dou uma olhada em erros do PHP em específico, incluindo como eles ocorrem.

Os 4 tipos de erros mais comuns em programação.

Normalmente, os erros na Internet podem ser divididos em 4 categorias. Vamos dar uma olhada em cada uma delas, mostrando um exemplo.

1. Erros de Sintaxe

Esses são erros de digitação ou outro erro no código que bloqueiam a execução de um script. Vamos ver um exemplo:

$i = 0

echo $i;

O código acima produz um erro, pois todas as linhas executáveis em PHP devem terminar em ponto-e-vírgula.

São também erros sintaxe o não fechamento de parênteses ou colchetes, erro de digitação de palavras-chaves, chaves sobrando, entre vários outros. Muitas vezes, erros de sintaxe são fáceis de diagnosticar por que as mensagens de erro mostram o problema e também sua localização.

2. Erros de Semântica

Erros de semântica envolvem códigos técnicamente corretos que contêm problemas com o significado do código. Já que os compiladores sempre apontam os erros, erros de semântica podem ser encontrados e diagnosticados, na maioria das vezes, sem muita dor de cabeça.

Olhe o exemplo:

include(“arquivo.txt”);

… seria um erro de semântica se o arquivo.txt não existisse e, dessa forma, não poderia ser incluído no documento. Note que erros de semântica podem se confundir facilmente com erros de sintaxe, porém, um script pode ser executado até o ponto onde está o erro, diferentemente dos scripts que contém erros de sintaxe. Isso se deve ao fato de conterem códigos corretos, como no exemplo acima. O que acontece é que o arquivo.txt não existe, mas o compilador não tem como saber disso enquanto ele não atingir a linha específica.

3. Erros de Lógica

São os mais difíceis de diagnosticar, erros de lógica contém códigos sintática e semanticamente corretos, mas não executam da maneira que o programador quer. Isso é o que deixa os programadores malucos, especialmente quando os códigos são extensos e complexos.

Erros de lógica podem ser simplesmente uso incorreto de operadores (+ no lugar de -, || no lugar de &&). Erros de lógica podem ser tão complexos quanto chamadas a registros de bancos de dados com SQLs mais elaborados. Podemos exemplificar uma lógica errada em PHP assim:

$estados = array (“MG”, “DF”, “SP”, “RS”, “CE”);

echo “O primeiro registro no array de Estados é ” . $estados[1];

Os 5 estados listados são gravados em um array chamado “estados”. O erro de lógica vem na segunda linha, quando queremos exibir o primeiro registro do array, ou MG. Programadores experientes notariam esse erro imediatamente, mas para aqueles que não tem muito conhecimento em programação, pode ser mais complicado. Essa forma de declaração de array faz com que o primeiro registro seja 0 e não 1. Para corrigir esse erro, basta modificar a saída estados[1] para estados[0].

Outro erro de lógica pode ser uma inclusão de um arquivo incorreto, deixar de tratar uma data, entre outros. Compiladores não podem encontrar erros de lógica, já que não tem conhecimento sobre o que o programador deseja fazer. No pequeno trecho de código acima, não há nada errado em exibir o registro número 1 do array, então o compilador executou sem problemas. Dessa forma, erros de lógica só podem ser encontrados e remediados pelo programador.

4. Erros de ambiente

Erros de ambiente são sempre desprezados, mas são bastante preocupantes na Internet. Erros de ambiente são erros que estão além do controle do programador, pode ser qualquer coisa além dos componentes de linguagem como, por exemplo, o valor da register_globals estar setado para off no php.ini. Notamos que erros de ambiente ocorrem com muito menos freqüência do que os outros tipos.

Erros Específicos do PHP

As mensagens de erro do PHP, na maior parte dos casos, são bastante amigáveis. Vamos dar uma olhada em algumas e qual código as produziu.

Código:

includ(“arquivo.txt”);

Erro:

Fatal error: Call to undefined function: includ() in c:program filesapache groupapachehtdocs estserveroperator.php on line 21

Comentário:

Assumindo que includ() seja uma função indefinida, um erro semântico ocorre e a execução pára. Como você pode ver, o PHP mostra o erro e alguns detalhes (função indefinida), além de fornecer a linha onde ocorreu o erro.

Código:

$i = 1

echo $i;

Erro:

Parse error: parse error in c:apache htdocs esteoperadores.php on line 13

Comentário:

Usando o erro de sintaxe acima, o compilador sem dúvida irá achar a falta do ponto-e-vírgula na primeira linha do código. Contudo o erro não diz especificamente “Está faltando um ponto-e-vírgula”, um parse error diz ao programador que ocorreu um erro de sintaxe. Isso permite ao programador afiar sua habilidade de ‘debugar’ um tipo de erro específico.

Devemos lembrar que se o parse error for erro de sintaxe, nada será executado no script. Uma vez adicionado o ponto-e-vírgula à primeira linha do código, o script funcionará com sucesso.

Código:

// $j nem foi declarado ainda…

echo $j;

Erro:

Warning: Undefined variable: j in c:apache htdocs esteoperadores.php on line 12

Comentário:

Como você pode ver, isso é um aviso, não um erro (neste caso, a mensagem de atenção – warning – também é conhecida como nota – notice). Warnings ocorrem quando o PHP determina que alguma coisa está errada com o script, mas não é grave o suficiente para parar a sua execução.

É essencial entender que warnings não param a execução de um script. Quando um warning é encontrado, uma mensagem será exibida junto da saída do script, onde a linha do código contiver o problema. O PHP continuará a executar o restante do código até o fim.

Por exemplo, o código seguinte:

$i = 1;

echo $x;

echo $i;

Produzirá essa saída:

Warning: Undefined variable: x in c:apache htdocs esteoperadores.php on line 21

Servidor Dedicado Promocional Seattle – WA

A Server Media agora conta com um mais novo parceiro Datacenter em Seattle – WA e para não quebrar a tradição estamos oferecendo o melhor hardware com o melhor custo benefício do mercado! Confira já nossas ofertas inicias para servidores dedicados em Seattle – WA:

Em Caso de dúvidas, entre em contato conosco através do nosso canal de atendimento info@servermedia.com.br

Processador CPU Memória Disco Rígido Tráfego Uplink Mês
Servidor DedicadoIntel Xeon L5420 4 x 2.5GHz 16 GB 500 GB 10,000 GB 100 Mbps R$253
Servidor DedicadoIntel Xeon L5420 4 x 2.5GHz 20 GB 500 GB 10,000 GB 100 Mbps R$280
Servidor DedicadoDual Intel Xeon L5520 8 x 2.26GHz 72 GB 1,000 GB 10,000 GB 100 Mbps R$399
Servidor DedicadoDual Intel Xeon L5639 12 x 2.13GHz 72 GB 500 GB 10,000 GB 100 Mbps R$459
Servidor DedicadoXeon E3-1230v1 8 x 3.2GHz 16 GB 500 GB 10,000 GB 100 Mbps R$315

Microsoft aposenta marca ‘Nokia’, substituída por ‘Microsoft Lumia’

Após adquirir a área de celulares da fabricante finlandesa Nokia por US$ 7,2 bilhões em 2013, a Microsoft vai aposentar a marca e substituí-la por “Microsoft Lumia”.

A informação foi confirmada nesta terça-feira (21) pela Nokia em sua página no Facebook para a França. “Nos próximos dias, vocês receberão uma mensagem do Facebook sobre a renomeação dessa página. Nós estamos prestes a nos tornar ‘Microsoft Lumia’”, informou a empresa.

Ao site “The Verge” a Microsoft confirmou que outros países passaram pela repaginação da marca. A França foi apenas a primeira subsidiária a substituir o “Nokia” pela nova marca em seus canais nas redes sociais.

A decisão da Microsoft, no entanto, não encerra de vez a marca Nokia, que ainda continuará a ser utilizada pela empresa finlandesa, agora focada apenas em aparelhos de infraestrutura de rede.

A decisão não chega a ser uma surpresa, porque, quando anunciou que a Microsoft deixaria de fabricar celular que rodam Android, o vice-presidente da empresa Stephen Elop afirmou que “Nokia” já não seria usada como marca.

Comandos Básicos Linux

“Muito embora o Linux possua diversas e ótimas interfaces gráfica (GUI’s – Graphical User Interfaces) bastante amigáveis, dentre as quais destacamos o Gnome e KDE, como de resto todos os sistemas operacionais Unix, ainda requerem por vezes que façamos uso da linha de comando. O ambiente tradicional do Unix é o CLI (Command Line Interface), onde você digita os comandos para dizer ao computador o que ele deve fazer. Esse modo é extremamente poderoso e rápido, porém implica que você saiba para que serve cada comando e seus diversos parâmetros.”

terminal.png

Usando essa página

  • Essa página ira fazer você se familiarizar com os comandos básicos do GNU/Linux.
  • Não é sua intenção ser um guia completo de comandos, somente uma introdução para complementar as ferramentas gráficas do Ubuntu.
  • Todos os nomes dos comandos estarão em negrito.

  • Os comandos que você precisará digitar estarão sempre em “negrito com aspas”.

  • Todos os comandos nesta página devem ser usados em um terminal ou diretamente no shell.

Icones/erro.png

ATENÇÃO: Lembre-se o Linux diferencia maiúsculas de minúsculas. Portanto, comando e COMANDO são coisas totalmente diferentes.

Iniciando o Interpretador de Comandos

Abrindo um Terminal

No Gnome vá ao menu Aplicações > Acessórios > Terminal ou pressione simultaneamente as teclas Alt+F2, e na caixa de texto digite “gnome-terminal” e tecle “Enter”.

Abrindo uma seção shell

Tecle simultaneamente Crtl+Alt+F1(…F6) que uma console modo texto será exibido solicitando um login, onde você deverá entrar com seu usuário e senha para ter acesso ao prompt de comando.

Os Comandos do Linux

Como já descrito anteriormente, não temos a pretensão de ser um guia completo de comandos, mais uma fonte de referência que irá abranger os principais comandos separados por categorias de acordo com as tarefas que executam.

Um comando do Linux é uma palavra especial que representa uma ou mais ações. Um interpretador de comandos também é conhecido como shell ou modo texto. Ele é o programa responsável por interpretar essas instruções enviadas pelo usuário e seus programas para o kernel. No Linux, você poderá ter vários interpretadores de comandos (ao contrário do que acontece no Windows que só tem o command.com).

O interpretador de comandos é que executa comandos lidos do teclado ou de um arquivo executável. É a principal ligação entre o usuário. Entre os programas interpretadores de comandos podemos destacar o bash, csh e sh entre outros.

Entre eles o mais usado é o Bash (Bourne Again Shell), criado por S.R. Bourne. Os comandos podem ser enviados de duas maneiras para o interpretador:

  • Interativa – Os comandos são digitados no teclado pelo usuário e passados ao interpretador de comandos um a um. Neste modo o computador depende do usuário para executar uma tarefa ou o próximo comando.

  • Não-interativa – São usados arquivos de comandos (scripts) criados pelo usuário para o computador executar os comandos na ordem encontrada no arquivo. Neste modo, o computador executa os comandos do arquivo um por um, e dependendo do término do comando, o script pode verificar qual será próximo comando que será executado e dar continuidade ou não ao processamento.

Esse sistema é muito útil quando temos que digitar por várias vezes seguidas um mesmo comando ou para compilar algum programa complexo.

Uma característica interessante do bash é que ele possui a função de auto-completar os nomes de comandos que foram digitados via entrada padrão. Isso é feito pressionando-se a tecla TAB; o comando é completado e acrescentando um espaço.

Isso funciona sem problemas para comandos internos; caso o comando não seja encontrado, o bash emite um beep. Por exemplo, na sua pasta raiz tente digitar cd pro (aperte TAB)+as( aperte TAB)+os( aperte TAB)+d(aperte TAB) e veja como foi fácil digitar um caminho para entrar no local: /proc/asound/oss/devices.

Outro recurso muito interessante do bash, é que você pode repetir um comando executado sem ter que digitá-lo novamente. Isso é possível utilizando o caractere “!” na frente do comando que você deseja repetir. O bash vai buscar aquele comando no histórico e se lá tiver algo parecido o comando será executado. Veja o exemplo abaixo com esta seqüência de comandos:

tail -f /var/log/squid/access.log
cd /etc/
ls -hl
!tail

O comando “!tail” irá informar ao shell (bash) para executar o último comando tail executado, no caso, “tail -f /var/log/squid/access.log”, e você passara a ver novamente os LOG’s do Squid em tempo real.

Para execução de muitos comandos é necessário ter privilégios de administrador, então como no Ubuntu o usuário root por questões de segurança se encontra desabilitado, será necessário o uso do “sudo”. Assim sendo sempre que um comando necessitar deste privilégio, o mesmo estará precedido do sudo.

Adicione também o comando sudo na frente de todos os comandos, caso esteja trabalhando em um diretório ou em arquivos que não lhe pertencem (arquivos do sistema, por exemplo). Veja RootSudo para maiores informações sobre o sudo.

Documentação

  • man – Formata e exibe uma página man (man page) O comando man é usado para mostrar o manual de outros comandos. Tente “man man” para ver a página do manual do próprio man. Veja a seção “Man & Getting Help” para mais informações.

  • help – Exibe informações sobre os comandos internos do Bash. Ex.: ”help logout”

  • info – Exibe documentação no formato Info, sendo que a navegação pelo documento é feito por meio de comandos internos do Info. Ex.: ”info emacs”

Data e Hora

  • date – Exibe e edita a data e a hora atuais do sistema.

    • ”date” para exibir a data e hora atual.

    • ”sudo date 032914502007” para alterar a data e hora para 14:50 h de 29/03/2007.

  • cal – Exibe um simples calendário.

  • hwclock – Consulta ou define o relógio do hardware (Hardware Clock).

    • “sudo hwclock -s” para atribuir ao sistema a data e hora do hardware (BIOS).

    • “sudo hwclock –set –date=032914502007” para definir a data e hora do hardware como 14:50 h de 29/03/2007.

Informações do Sistema (Hardware e Processos)

  • df – Mostra o espaço em disco do sistema de arquivos usado por todas as partições. “df -h” é provavelmente o mais útil – usa megabytes (M) e gigabytes (G) em vez de blocos para relatar o tamanhos. (-h significa “human-readable”).

  • du – Exibe o tamanho de arquivos e/ou diretórios. Se nenhum arquivo ou diretório for passado como argumento, será assumido o diretório atual. O uso da opção du -h tornará a apresentação mais simples de ser interpretada.

    • Para verificar o tamanho dos subdiretórios ao invés dos arquivos, utilize o comando abaixo.

      “du -k -h –max-depth=1”

  • free – Este comando exibe a quantidade de memória livre e usada no sistema. “free -m” fornece a informação usando megabytes, que é provavelmente mais útil para computadores atuais.

  • arch – Exibe a arquitetura do computador. Equivale ao comando ”uname -m”.

  • lsdev – Lista o hardware instalado no computador, especificando os endereços de E/S (Entrada/Saída), IRQ e canais DMA que cada dispositivo esta utilizando.

  • lspci – Exibe informações sobre os barramentos PCI do computador e sobre os dispositivos a ele conectados.

  • lsusb – Lista informações sobre os barramentos USB do computador e sobre os dispositivos a eles conectados.

  • uname – Este comando exibe várias informações sobre o sistema, incluindo o nome da maquina, nome e versão do Kernel e alguns outros detalhes. É muito útil para verificar qual é o Kernel usado por você.

    • ”uname -a” para exibir todas as informações.

    • ”uname -m” para exibir a arquitetura da maquina. (Equivale ao ”arch”).

    • ”uname -r” para exibir o release do sistema operacional.

  • lsb_release – Este comando fornece informações básicas do sistema operacional (LSB – Linux Standard Base) e sua distribuição.

    • ”lsb_release -a” para exibir as informações completas do sistema conforme abaixo exemplificado.

user@computer:~$ lsb_release -a
LSB Version:    n/a
Distributor ID: Ubuntu
Description:    Ubuntu (The Edgy Eft Release)
Release:        6.10
Codename:       edgy
  • top – Este comando exibe em tempo real informações sobre seu sistema Linux, processos em andamento e recursos do sistema, incluídos CPU, memória RAM e uso do swap, além do número total de tarefas sendo executadas.

    • O ”top” também nos permite a manipulação dos processos por meio de comandos interativos. Veja abaixo alguns dos comandos interativos mais importantes do ”top”.

      • ”k” – Finaliza, ou seja, “mata” um processo.

      • ”m” – Ativa/Desativa a exibição de informações da memória.

      • ”M” – Ordena os processos pelo uso da memória residente.

      • ”N” – Ordena os processos pelos seus PIDs.

      • ”P” – Ordena os processos pelo uso da CPU (este é o padrão).

      • ”ESPAÇO” – Atualiza imediatamente a visualização do quadro de processos.

      • ”h” – Exibe a ajuda dos comandos interativos do ”top”.

      • ”q” – Abandona o comando ”top”.

  • ps – Apresenta um quadro atual, porém estático dos processos que estão sendo executados no sistema.

    • ”ps aux” para apresentar todos processos sendo executados, de todos usuários, incluído o nome do usuário a qual o processo pertence, mesmo os desvinculados de TTYs.

  • kill – Finaliza, ou no popular, “mata” processos sendo executados pelo seu PID, lhes enviando um sinal.

    • ”kill -9 1345” para finalizar o processo de PID número 1345. Para saber qual PID de determinado processo que esta sendo executado pode ser utilizado o comando ps.

  • killall – Finaliza processos pelo nome ao invés do PID como faz o comando kill. Também assim como o comando kill, o killall envia um sinal para o processo.

    • ”killall mozilla-firefox” para finalizar o processo mozilla-firefox, fechando com isso o navegador web Mozilla Firefox. O nome dos processos ativos pode ser observado com uso do comando ps.

Arquivos e Diretórios

  • pwd – O comando pwd lhe permite saber em qual diretório você está no momento, onde pwd significa “print working directory”.

    • Executando “pwd” no diretório Desktop mostrará “~/Desktop”. Observe que o Terminal do Gnome também mostra esta informação na barra de títulos da janela. Veja a imagem de exemplo no topo desta página.

  • cd – Este comando nos permite se deslocar entre a árvore de diretórios do sistema. Quando abrimos um terminal ou seção shell, você entra direto no seu diretório pessoal. Para mover-se pelo sistema de arquivos você deve usar o cd.

    • “cd /” para ir ao diretório raiz.

    • “cd” para ir ao seu diretório pessoal.

    • “cd ..” para acessar um diretório de nível acima do atual.

    • ”cd -” para voltar ao diretório que se encontrava antes de mudar.

    • Para navegar através múltiplos níveis de diretórios em só comando, use por exemplo, “cd /var/www”, que o levará diretamente ao sub-diretório /www do diretório /var.

  • cp – Copia arquivos e diretórios.

    • “cp file foo” para fazer uma cópia exata do arquivo “file” dando-lhe o nome de “foo”.

    • “sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf-bkp” para gerar uma cópia de segurança exata do arquivo “/etc/X11/xorg.conf” dando-lhe o nome de “/etc/X11/xorg.conf-bkp”.

  • mv – Este comando move arquivos e diretórios, sendo muito usado também para renomear um determinado arquivo.

    • ”mv arquivo1 arquivo2” para renomear o arquivo “arquivo1” localizado no diretório pessoal do usuário para “arquivo2” no mesmo local.

    • “mv foo ~/Desktop” moverá o arquivo “foo” para seu diretório Desktop sem alterar seu nome. Você deve especificar um novo nome se quiser renomear um arquivo.

  • ls – Comando utilizado para listar o conteúdo de um diretório. Usado com certas opções, é possível ver o tamanho dos arquivos, quando foram criados, e as permissões de cada um.

    • “ls ~” para mostrar os arquivos que estão em seu diretório pessoal.

    • ”ls -hal ~” para mostrar os arquivos que estão em seu diretório pessoal, inclusive os ocultos (-a) em forma de uma listagem (-l) e com as informações de tamanho mais amigável a nós seres humanos (-h).

  • rm – Utilize este comando para remover (deletar) arquivos e opcionalmente diretórios. Por padrão o comando rm exibe um prompt onde o usuário deve confirmar a exclusão de cada arquivo, digitando a letra “y” seguido de “Enter”.

    • ”rm arquivo1” para remover o arquivo chamado “arquivo1” do diretório corrente após confirmação no prompt.

    • ”rm -f arquivo1” para remover o arquivo chamado “arquivo1” do diretório corrente sem que lhe seja exibido o prompt de confirmação.

    • ”rm -R ~/temp/” para remover de forma recursiva o diretório /temp localizado em sua pasta pessoal e todo seu conteúdo, seja ele arquivos e outras arvores de sub-diretórios.

  • mkdir – Comando cuja finalidade é permitir a criação de um ou mais diretórios.

    • “mkdir musicas” para criar um diretório chamado “musicas” dentro do diretório corrente.

  • chmod – Altera as permissões de acesso de arquivos e diretórios, não alterando estes atributos de links simbólicos passados na linha de comando, mais sim as permissões dos arquivos aos quais eles se referem. Para maiores detalhes sobre o sistema de permissões de arquivos e diretórios no Linux aconselhamos este link aqui do Guia Foca GNU/Linux.

Leitura (r)

Escrita (w)

Execução (x)

Octal

0

0

0

0

0

0

1

1

0

1

0

2

0

1

1

3

1

0

0

4

1

0

1

5

1

1

0

6

1

1

1

7

0  (zero) permissão negada
1   permissão de execução
2   permissão de gravação
3   permissão de gravação e execução
4   permissão de leitura
5   permissão de leitura e execução
6   permissão de leitura e gravação
7   soma de todas as permissões
  • ”chmod 744 file” para alterar as permissões do arquivo “file” de modo ao Dono ter total permissão (leitura, execução e escrita) enquanto que os usuários pertencentes ao Grupo e os Outros terão permissão apenas de leitura.

  • ”chmod -R 744 temp/” para alterar as permissões de forma idêntica ao exemplo anterior, porém do sub-diretório /temp e todo seu conteúdo de forma recursiva.

  • chown – Altera o proprietário e o grupo de arquivos e diretórios.

    • ”chown fulano:vendas file” para alterar o arquivo “file” para ter como Dono o usuário “fulano” e o Grupo como “vendas”.

    • ”chown -R ciclano:compras temp/” para alterar o sub-diretório /temp e todo seu conteúdo de forma recursiva para ter como Dono o usuário “ciclano” e o Grupo como “compras”.

  • diff – Usado para comparar o conteúdo de dois arquivos, exibindo a diferença entre eles.

    • ”diff file foo” para ver a diferença entre o conteúdo do arquivo “file” e o arquivo “foo”.

  • find – Comando utilizado para procurar por arquivos na arvore de diretórios. Se um caminho não for passado ao comando find a busca será feita no diretório corrente.

    • ”find ~/temp/file” para procurar pela ocorrência de um arquivo chamado “file” no sub-diretório /temp do diretório pessoal do usuário.

  • locate – Pesquisa em uma base de dados de nomes de arquivos por nomes que satisfaçam um determinado padrão. O comando slocate é a versão segura do locate, pois não exibe arquivos para os quais o usuário não tenha permissão de acesso. Como a arvore de arquivos e diretórios esta sempre sendo atualizada é necessário que esta base de dados também o seja, por tanto é sempre aconselhável antes de executar estes comandos atualizar a base executando updatedb.

    • ”locate ~/file” para pesquisar por um arquivo que corresponda a expressão “file” no diretório pessoal do usuário. Como este comando pesquisa em um banco de dados, se não for passado ao comando o caminho desejado ele pesquisará em toda sua base de dados, correspondente a toda arvore de diretórios do sistema.

  • tar Usado para armazenar ou extrair arquivos TAR (Tape ARchive). Estes arquivos TAR são os chamados “tarfile” ou “tarball”.

    • ”tar cvf my_ogg_files.tar *.ogg” para criar um arquivo TAR chamado “my_ogg_files.tar” contendo todos os arquivos de extensão “.ogg” do diretório corrente. Notar que a extensão “.tar” não é obrigatória, mais aconselhável para facilitar a identificação do arquivo.

    • ”tar tvf my_ogg_files.tar” para exibir todo o conteúdo do arquivo TAR chamado “my_ogg_files.tar”.

    • ”tar xvf my_ogg_files.tar” para extrair todo conteúdo do arquivo “my_ogg_files.tar” no diretório corrente.

    • ”tar xvf my_ogg_files.tar musica1.ogg” para extrair apenas o arquivo chamado “musica1.ogg” do tarball “my_ogg_files.tar” no diretório corrente.

    • NOTA: Arquivos que possuem a extensão .tar.gz podem ser descompactados e extraídos com as opções xzvf do comando tar. Isto corresponde a usar o comando gunzip para descompactar o arquivo TAR e depois usar o comando tar xvf para extrair os arquivos.

  • gzip Compacta e opcionalmente descompacta arquivos regulares. Os arquivos compactados com o comando são substituídos por outro de menor tamanho com a extensão .gz porém preservando o dono, as permissões e datas de acesso e modificação.

    • ”gzip arq1 arq2” para compactar os arquivos “arq1” e “arq2” gerando os arquivos “arq1.gz” e “arq2.gz” em substituição aos originais.

    • ”gzip -d arq1” para descompactar o arquivo “arq1.gz” trazendo de volta o arquivo original “arq1”. A presença da opção -d equivale ao uso do comando gunzip.

  • bzip2 Compacta e opcionalmente descompacta arquivos regulares. Assim como o gzip, os arquivos compactados com este comando são substituídos por outro de menor tamanho com a extensão .bz2 porém preservando o dono, as permissões e datas de acesso e modificação. O algoritmo empregado por este comando permite uma maior compressão e também segurança dos arquivos gerados, porém o processo se torna um tanto quanto mais demorado.

    • ”bzip2 arq1” para compactar o arquivo “arq1” gerando em substituição o arquivo “arq1.bz2”.

    • ”bzip2 -9 arq2” para compactar o arquivo “arq2” pelo processo de máxima compressão gerando em substituição o arquivo “arq2.bz2”.

    • ”bzip2 -d arquivo.bz2” para descompactar o arquivo “arquivo.bz2” trazendo de volta o(s) arquivo(s) original(is) que tinham sido previamente compactados.

Sistema de Arquivos

  • mount – Monta um sistema de arquivos tornando-o disponível para as operações de E/S (Entrada/Saída) em arquivos, ou exibe uma lista dos sistemas de arquivos atualmente montados.

    • ”mount” para listar os sistemas de arquivos atualmente montados.

    • ”sudo mount -t ext3 /dev/hda3 /media/hda3” para montar a terceira partição primária do disco hda (IDE1) formatado em EXT3 no diretório /media/hda3. É necessário que o diretório /media/hda3 tenha sido previamente criado para que o comando tenha sucesso.

  • umount – Desmonta um sistema de arquivos previamente montado que não esteja em uso.

    • ”sudo umount /dev/hda3” para desmontar o dispositivo /dev/hda3. Para que o comando seja executado com sucesso é importante que o dispositivo não esteja em uso, como por exemplo com arquivos abertos ou mesmo estando dentro do diretório onde o mesmo se encontra montado.

  • fdisk – Gerencia por meio de uma simples interface de texto orientada por menus as partições de um disco. Ao executar o comando fdisk dispositivo basta pressionar a tecla m no prompt para ter acesso ao menu de opções que é bastante auto-explicativo, devendo se usar as setas de direção para movimentar-se pelo mesmo.

    • ”sudo fdisk -l” para listar as tabelas de partições para todos dispositivos.

    • ”sudo fdisk /dev/hda” para gerenciar a partição (ou partições) do dispositivo /dev/hda.

  • fsck – Verifica e opcionalmente repara um ou mais sistemas de arquivos. O fsck na realidade é apenas uma espécie de front-end de comandos específicos de acordo com o sistema de arquivos, que na realidade obedecem em geral ao formato fsck.nome_do_sistema_de_arquivos.

  • ”sudo fsck -t ext3 /dev/hda3” para verificar o sistema de arquivos EXT3 do dispositivo /dev/hda3. O mesmo resultado poderia ser alcançado executando o comando da seguinte forma ”fsck.ext3 /dev/hda3”. O dispositivo deve obrigatoriamente estar desmontado para execução desta operação.

  • mkfs – Formata um dispositivo (geralmente uma partição de disco) criando um novo sistema de arquivos. O mkfs, assim como o fsck é apenas uma espécie de front-end de comandos específicos de acordo com o sistema de arquivos, que na realidade obedecem em geral ao formato mkfs.nome_do_sistema_de_arquivos.

    • ”sudo mkfs -t ext3 /dev/hda3” para formatar o dispositivo /dev/hda3 em um sistema de arquivos EXT3. O mesmo resultado poderia ser alcançado executando o comando da seguinte forma ”mkfs.ext3 /dev/hda3”. O dispositivo deve obrigatoriamente estar desmontado para execução desta operação.

  • badblocks – Procura por blocos ruins em um dispositivo, geralmente uma partição de disco.

    • ”sudo badblocks /dev/hda3” para verificar se o dispositivo /dev/hda3 se encontra com blocos ruins. Normalmente, dependendo do tipo e tamanho do dispositivo este procedimento é um tanto demorado, sendo que se nenhuma informação for retornada é porque blocos ruins não foram encontrados. Uma melhor alternativa ao comando seria ”sudo badblocks -o /tmp/file -n /dev/hda3”, onde o parâmetro -n forçaria um teste de leitura e escrita não-destrutivo e o -o /tmp/file geraria o arquivo /tmp/file com todas mensagens de saída do comando.

Usuários e Grupos

  • useradd – Cria um novo usuário ou atualiza as informações padrão de um usuário no sistema Linux. O comando useradd cria uma entrada para o usuário no arquivo “/etc/passwd” com informações do seu login, UID (user identification), GID (group identification), shell e diretório pessoal, e a senha criptografada deste usuário é armazenada no arquivo “/etc/shadow”.

    • ”sudo useradd fulano” para criar o novo usuário “fulano” no sistema, cujo diretório pessoal do mesmo será “/home/fulano”.

    • ”sudo useradd -d /home/outro_dir fulano” para criar o novo usuário “fulano” no sistema, porém com seu diretório pessoal se localizando em “/home/outro_dir”.

    • ”sudo useradd -s /bin/sh fulano” para criar o usuário “fulano” definindo seu shell como sendo o sh. O shell padrão do Ubuntu, assim como a maioria das outras distribuições é o bash. Com esta opção “-s” é possível criar um usuário sem que o mesmo possa ter acesso a nenhum shell do sistema, bastando executar o seguinte comando ”useradd -s /bin/false fulano”.

    • ”sudo adduser -g 600 -G 500,68 fulano” para criar o usuário “fulano” com grupo padrão de GID 600 e também pertencente aos grupos GID 500 e GID 68. Para saber os GID de cada grupo do sistema consulte o arquivo “/etc/group”.

    • NOTA: Com a mesma finalidade porém com mais opções informativas sobre o usuário a ser cadastrado existe o comando adduser. A configuração padrão usada pelos comandos useradd e adduser é definida em “/etc/default/useradd” e em “/etc/login.defs”.

  • userdel – Usado para remover uma conta de usuário do sistema, deletando todas entradas deste usuário nos arquivos /etc/passwd, /etc/shadow e /etc/group.

    • ”sudo userdel -r fulano” para remover o usuário “fulano” do sistema deletando seu diretório pessoal e todo seu conteúdo.

  • usermod – Altera as informações de um usuário, editando diretamente as informações dos arquivos /etc/passwd, /etc/shadow e /etc/group.

    • ”sudo usermod -d /home/novo_dir fulano” para criar um novo diretório pessoal para o usuário “fulano” em “/home/novo_dir”. Se quiser que o atual diretório do usuário seja movido para o novo diretório utilize a opção “-m” desta forma ”sudo usermod -d /home/novo_dir -m fulano”.

    • ”sudo usermod -g 800 fulano” para alterar o grupo padrão do usuário “fulano” para GID 800.

    • ”sudo usermod -s /bin/false fulano” para alterar o shell do usuário “fulano” para “/bin/false” não mais permitindo que o usuário faça login no sistema.

    • ”sudo usermod -e 03/04/2007 fulano” para alterar a data de expiração da conta do usuário “fulano” para 03/04/2007.

  • finger – Exibe informações dos usuários do sistema. Se um usuário não for passado ao comando o mesmo apresentará informações de todos usuários atualmente logados.

    • ”finger fulano” para exibir informações, como login, diretório pessoal, shell entre outras do usuário “fulano”.

  • passwd – Altera a senha de um usuário exibindo um prompt para que a nova senha seja fornecida, e logo depois repetida para confirmação. O usuário logado pode alterar a própria senha digitando apenas ”passwd”.

    • ”sudo passwd fulano” para alterar a senha do usuário “fulano”.

    • ”sudo passwd -l fulano” para bloquear a conta do usuário “fulano”.

    • ”sudo passwd -u fulano” para desbloquear a conta do usuário “fulano”.

    • ”sudo passwd -d fulano” para desativar a senha do usuário “fulano” deixando-o sem uma senha de acesso.

  • groupadd – Cria um novo grupo no sistema. Deve-se remover os usuários do grupo, antes de apagar o grupo, pois o Linux não faz nenhum tipo de verificação neste sentido.

    • ”sudo groupadd novogrupo” para criar um novo grupo no sistema chamado “novogrupo”.

    • ”sudo groupadd -g 800 novogrupo” para atribuir ao grupo “novogrupo” o GID 800.

  • groupdel – Exclui um grupo no sistema.

    • ”sudo groupdel novogrupo” para excluir o grupo chamado “novogrupo”.

  • groupmod – Altera as informações de um grupo do sistema.

    • ”sudo groupmod -n velho_grupo novo_grupo” para alterar o nome do grupo “velho_grupo” para “novo_grupo”.

    • ”sudo groupmod -g 900 novo_grupo” para alterar o identificador do grupo chamado “novo_grupo” para GID 900.

  • id – Exibe os identificadores (IDs) reais e efetivos de usuário e de grupo de um usuário. Se não for especificado ao comando um usuário será exibido as informações do usuário atual.

    • ”id fulano” para exibir os IDs de usuário e grupo do usuário “fulano”.

Utilitários de Texto

  • cat – Utilizado para concatenar arquivos exibindo o resultado na tela, sendo também utilizado para exibir o conteúdo de arquivos.

    • ”cat arq” para exibir o conteúdo do arquivo chamado “arq”. Se desejar que as linhas do arquivo sejam enumeradas use a opção “-n” junto ao comando, desta forma ”cat -n arq”.

    • ”sudo cat /etc/passwd /etc/group” para exibir na tela o conteúdo dos arquivos “/etc/passwd” e “/etc/group”.

    • ”cat file1 file2 |less” para exibir na tela o conteúdo dos arquivos “file1” e “file2” porém fazendo a paginação das telas. Neste caso a opção “|less”, onde “|” é o chamado pipe, pode ser substituída também por “|more”, sendo que ambos comandos serão vistos posteriormente.

    • ”cat arq arq1 arq2 > arq_final” para concatenar os arquivos “arq”, “arq1” e “arq2” e colocar o resultado em outro arquivo chamado “arq_final”. Notar que neste comando é feito uso do caractere “>” chamado de redirecionador de saída.

    • ”cat arq3 >> arq_final” para inserir o conteúdo do arquivo “arq3” ao final do arquivo “arq_final”.

    • NOTA: O comando cat também pode ser usado para criar arquivos quando usado em conjunto com o “>” redirecionador de saída. Para criar um arquivo execute o comando ”cat > novo_arq” e digite o conteúdo desejado, usando a tecla “Enter” como separador de linhas e “Ctrl+D” para finalizar.

  • less – Faz a paginação de saídas muito extensas exibindo uma tela por vez.

    • ”less arq” para exibir o conteúdo do arquivo “arq” de forma paginada. Para navegação e gerenciamento do comando use as teclas abaixo:

      • Para sair do aplicativo digite q (quit);

      • Use as teclas Page-Down, Ctrl+F ou Space para avançar nas páginas;

      • Use as teclas Page-Up ou Ctrl+B para voltar as páginas;

      • Use Enter para avançar apenas uma linha por vez;

      • Digite h para ver a lista das teclas disponíveis para navegação no comando.

    • NOTA: Para redirecionar a saída de outro comando para o less efetuar a paginação, use o “|” (pipe) conforme exemplo ”ls -hl |less”.

  • more – Semelhante ao comando less também faz a paginação de uma saída muito grande na tela. A sintaxe deste comando é semelhante ao do less, inclusive as teclas de navegação e o redirecionamento com uso do “|” (pipe).

  • grep – Usado para procurar por linhas em um arquivo que contenham expressões que satisfaçam um determinado padrão de busca.

    • ”grep termo arq” para procurar por entradas no arquivo “arq” que correspondam a expressão “termo”.

    • ”grep ‘termo1 termo2’ arq” para procurar por entradas no arquivo “arq” que correspondam as expressões “termo1” e “termo2”. Notar que quando a expressão é composta de mais de uma palavra deve ser usado aspas simples.

    • NOTA: Este comando comumente é utilizado em conjunto com outros comandos canalizados com o “|” (pipe) conforme abaixo exemplificado.

      • ”sudo cat /etc/passwd |grep fulano” para procurar por uma entrada que corresponda a expressão “fulano” no arquivo “/etc/passwd”.

  • tail – Exibe as últimas linhas da saída de um arquivo. Por padrão se nenhum parâmetro diferente for passado ao comando será exibido as últimas 10 linhas do arquivo.

    • ”tail -50 arq” para exibir as últimas 50 linhas do arquivo chamado “arq”.

    • ”sudo tail -f /var/log/messages ” para continuar exibindo indefinidamente as últimas 10 linhas (padrão) do arquivo “/var/log/messages ”. Conforme o exemplo, esta opção “-f” é muito usada para verificar arquivos de log do sistema que estão sendo constantemente atualizados.

    • NOTA: Assim como o tail que exibe as últimas linhas de um arquivo, existe o comando head que faz exibir as primeiras linhas de saída de um arquivo.

Monitoramento de Acesso

  • w – Mostra quem esta logado no sistema e o que esta fazendo. Se não for especificado um usuário ao comando, será exibido informações de todos usuários logados.

    • ”w” para exibir todos usuários logados e o que estão executando neste momento.

    • ”w fulano” para mostrar informações do usuário “fulano” se o mesmo estiver logado no sistema.

  • who – Semelhante ao comando w mostra quais usuários estão logados no sistema.

    • ”who -m” para mostrar o nome do usuário logado no sistema.

    • ”who -q” para mostrar a quantidade total e nomes dos usuário conectados ao sistema.

  • whoami – Este comando fornece o mesmo resultado do comando ”who -m”.

  • last – Mostra todas informações referente as entradas (login) e saídas (logout) de usuários do sistema.

    • ”last -a” para exibir estas informações mostrando o nome da maquina de onde foi efetuado os logins.

    • ”last -d” para exibir estas informações mostrando o endereço IP da maquina de onde foi efetuado os logins.

    • ”last reboot” para exibir um registro de todas as reinicializações efetuadas no sistema.

  • lastlog – Exibe informações referente ao último login de cada usuário cadastrado no sistema. Caso nenhum argumento seja passado, o comando lastlog exibe todas as informações armazenadas no arquivo “/var/log/lastlog” de todos os usuários do sistema.

    • ”sudo lastlog -u fulano” para exibir informações referentes apenas ao último login do usuário “fulano.

    • ”sudo lastlog -t 5” para exibir a lista dos usuários que logaram no sistema nos últimos 5 dias informando o dia e a hora do último acesso de cada um desses usuários.

Rede

  • ifconfig – Permite configurar as interfaces de rede, sendo o comando utilizado na inicialização do sistema para configuração destas interfaces. Caso nenhum argumento seja passado junto ao comando, o mesmo apenas irá exibir o estado das interfaces atualmente definidas.

    • ”sudo ifconfig eth0” para exibir o estado e informações da interface de rede eth0.

    • ”sudo ifconfig eth1 down” para desativar a interface de rede eth1.

    • ”sudo ifconfig eth1 up” para ativar a interface de rede eth1.

    • ”sudo ifconfig eth0 192.168.3.1 netmask 255.255.255.0 up” para configurar a interface de rede eth0 com endereço IP 192.168.3.1 e máscara da rede 255.255.255.0, ativando-a.

    • ”sudo ifconfig eth1 hw ether 00:D0:D0:67:2C:05” para alterar o endereço MAC (MAC Address) da interface de rede eth1 para “ 00:D0:D0:67:2C:05”. É necessário que a placa de rede esteja desativada “sudo ifconfig eth1 down” para esta operação.

    • ”sudo ifconfig eth0:1 10.0.0.2 netmask 255.255.255.0 up” para adicionar um segundo endereço de rede, com IP 10.0.0.2 e máscara 255.255.255.0 a interface eth0.

  • arp – Manipula o cache ARP (Address Resolution Protocol) do kernel.

    • ”sudo arp 192.168.3.1” para exibir as entradas para o host 192.168.3.1. Se um host não for especificado, será exibido todas as entradas do cache.

    • NOTA: Esta ferramenta é muito útil quando se faz necessário descobrir o endereço MAC de um determinado host da rede.

  • ping Envia requisições ICMP para um determinado host. É uma ferramenta largamente utilizada para testar a conectividade entre uma maquina/rede local e maquinas/redes remotas.

    • ”ping -c 5 200.106.28.125” para verificar se a maquina cujo endereço IP é 200.106.28.125 se encontra conectada e alcançável. É importante ressaltar que muitos servidores, principalmente de redes empresariais, podem bloquear requisições de pacotes ICMP em seu firewall, podendo assim parecer que determinada rede não se encontra alcançável.

  • route – Permite exibir a tabela de roteamento (configuração das rotas) IP do kernel, sendo que com uso das opções add e del permite também modificar esta tabela inserindo ou deletando registros.

    • ”sudo route” para exibir a tabela das rotas atualmente ativas.

    • ”sudo route add -net 192.120.10.0 netmask 255.255.255.0 dev eth0” para adicionar uma rota para rede 192.120.10.0 via interface de rede eth0.

    • ”sudo route del -net 192.120.10.0 netmask 255.255.255.0 dev eth0” para remover a rota anteriormente adicionada.

Módulos carregáveis do Kernel

  • lsmod Lista todos módulos do kernel atualmente carregados na memória. Na realidade, o comando lsmod apenas lista o conteúdo do arquivo “/proc/modules”.

  • modinfo – Exibe informações sobre um determinado módulo carregado do kernel.

    • ”sudo modinfo ip_tables” para exibir informações do módulo “ip_tables” que se encontra carregado na memória do sistema.

  • modprobe – Usado para gerenciar, ou seja, adicionar e remover módulos carregáveis do kernel. O modprobe lê o arquivo de dependências de módulos gerado pelo depmod, portanto devemos sempre antes executar o comando ”sudo depmod -a”.

    • ”sudo modprobe iptable_nat” para carregar na memória o módulo “iptable_nat”.

    • ”sudo modprobe -r ndiswrapper” para remover da memória o módulo “ndiswrapper”.

Shell (Bash) e Utilitários de Terminal

  • alias Tem como finalidade atribuir um “alias” (em inglês, significa outro nome) a outro comando, permitindo nomear um conjunto de comandos, a ser executado pelo sistema por um único nome. Caso nenhum parâmetro seja passado ao comando será listado todos alias atualmente definidos e ativos no sistema.

    • ”alias ls=’ls -hal –color’” para definir uma alias ls para o comando ls -hal que irá mostrar os arquivos que estão no diretório correntel, inclusive os ocultos (-a) em forma de uma listagem (-l) e com as informações de tamanho mais amigável a nós seres humanos (-h) e diferenciado por cores.

    • ”alias fd=’mount /dev/fd0 /mnt/floppy; cd /mnt/floppy && ls’” para criar um alias chamado fd que montará um disquete, acessando e listando seu conteúdo. Observe que, neste exemplo, foram usados dois diferentes separadores de comandos: ponto-e-vírgula e &&. Comandos separados por ; são executados em seqüência. Comandos separados por && são executados de forma condicional, ou seja, o comando após o separador só é executado se o comando anterior tiver sido executado com sucesso.

    • ”alias mcdrom=’mount /mnt/cdrom’” para criar um alias chamado mcdrom que ao ser executado monta o CD em uso.

    • NOTA: Estes aliases são criados apenas para a sessão ativa do usuário, ou seja, ao deslogar do sistema os mesmos se perderão. Para criar aliases permanentes ao sistema edite o arquivo .bashrc de seu diretório pessoal e inclua no mesmo os comando desejados. Em contrapartida ao comando alias existe o comando unalias que faz justamente o inverso, removendo os alias criados.

  • apropos Pesquisa por um padrão na base de dados do comando whatis que veremos logo abaixo, informando quais comandos do Linux correspondem a uma determinada expressão.

    • ”apropos apropos” (1) – search the whatis database for strings (Procura por expressões na base de dados whatis), ou seja exibe todos comandos Linux que tenham alguma correspondência a expressão “apropos”, no caso apenas o comando apropos.

  • login Permite a um usuário efetuar o logon (estabelecer uma conexão) no sistema, bem como ser utilizado para efetuar o logon com um usuário diferente do atual.

    • ”login fulano” para efetuar o login do usuário “fulano”.

    • ”login -p fulano” para efetuar o login do usuário “fulano” sem destruir o ambiente do atual usuário.

  • logout Finaliza um login shell no console ou terminal. No modo gráfico, este comando encerra a sessão do usuário podendo fechar a janela do terminal, e em modo texto encerra a sessão do usuário levando-o de volta ao prompt de login do sistema.

    • ”logout” O mesmo resultado pode ser alcançado executando o comando exit.

  • su Permite alternar entre os usuários cadastrados do sistema, alterando o ID de usuário e grupo do atual usuário para outro usuário especificado.

    • ”su fulano” permite alternar para o usuário “fulano” após senha de login correta.

    • ”su fulano -c ‘vim /home/fulano/arq1’” permite executar o comando vim abrindo o arquivo “/home/fulano/arq1” como sendo o usuário “fulano”. O uso desta opção -c não começa um novo shell, apenas executa um comando como sendo o outro usuário especificado.

  • sudo Permite a um usuário autorizado conforme configurado no arquivo “/etc/sudoers”, a executar comandos como se fosse o super-usuário (root) ou outro usuário qualquer. Veja RootSudo para maiores detalhes.

  • uname Exibe várias informações sobre o sistema. Caso nenhuma opção seja fornecida junto ao comando, apenas o nome do sistema operacional será exibido, equivalente a opção -s.

    • ”uname -a” para exibir todas informações sobre o sistema.

  • whatis Pesquisa em uma base de dados que contem uma curta descrição dos comandos do sistema. Esta base de dados com os comandos do sistema é criada e atualizada com o comando ”sudo makewhatis”

    • ”whatis sudo halt” para obter uma descrição resumida dos comandos sudo e halt.

  • whereis Usado para localizar o binário, o arquivos-fonte e a página man (manual) dos comandos do sistema.

    • ”whereis ls” para descobrir onde se encontra o arquivo binário, os fontes e o manual (man) do comando ls.

  • which Exibe o caminho completo na hierarquia de diretórios para os comandos do sistema.

    • ”which firefox” para exibir o diretório onde se encontra o programa “firefox”.

  • clear Limpa a tela movendo o cursor para primeira linha. Não existem parâmetros passados junto a este comando.

  • echo Permite exibir textos na tela. Este comando também exibe toda estrutura de diretórios e arquivos em ordem alfabética, porém sem formatar em colunas a listagem.

    • ”echo ‘Olá mundo!’” envia para saída de tela a expressão “Olá mundo!”.

    • ”echo /etc/*” para listar todo conteúdo do diretório “/etc”.

  • halt, reboot, shutdown Respectivamente encerra, reinicializa e encerra ou reinicializa o sistema.

    • ”sudo halt” para encerrar o sistema.

    • ”sudo reboot” para reiniciar imediatamente o sistema. Este comando equivale aos comandos ”sudo init 6” e ”sudo shutdown -r now”.

    • ”sudo shutdown -h now” para encerra o sistema imediatamente.

    • ”sudo shutdown -h +15” para encerrar o sistema daqui a 15 minutos.

    • ”sudo shutdown -r 20:30 ‘O sistema será reiniciado as 20:30 horas!’” para reiniciar o sistema as 20:30 horas enviando a mensagem “O sistema será reiniciado as 20:30 horas!” a todos usuários logados.

    • NOTA: O comando ”sudo init 0” também pode ser usado para encerramento do sistema. O comando shutdown é a forma mais segura de reiniciar e finalizar o sistema, advertindo os usuários logados e bloqueando novos logons.

Opções

O comportamento padrão para um comando pode ser modificado por adicionar uma opção para o comando. O comando ls, por exemplo, tem uma opção -s , de forma que “ls -s” incluirá o tamanho dos arquivos na listagem realizada. Há também uma opção -h para que esses dados estejam em um formato “legível para humanos”.

As opções podem ser agrupadas, sendo possível, por exemplo usar “ls -sh”, que funcionará exatamente da mesma forma que “ls -s -h”. Muitas opções têm uma versão longa, prefixadas por dois traços em vez de um, assim “ls –size –human-readable” é o mesmo comando dado anteriormente.

Dicas e Truques

Teclas de controle e atalhos

Teclas

Ação

Ctrl + f

Move o cursor uma palavra para frente

Ctrl + b

Move o cursor uma palavra para trás

Ctrl + a

Para ir ao início da linha de comando

Ctrl + e

Para ir ao final da linha de comando

Ctrl + t

Inverte o caractere sob o cursor com o anterior

Ctrl + u

Limpa a linha de comando corrente

Ctrl + y

Re-insere o último trecho de comando apagado

Ctrl + r

Faz uma busca incremental no histórico de comandos utilizados

Ctrl + c

Termina a execução do comando corrente

Ctrl + d

Encerra entrada de dados pelo teclado fazendo logout

Ctrl + m

Equivalente a tecla Enter

Ctrl + l

Limpa a tela, equivalente ao comando clear

Ctrl + s

Inibe a exibição de informações na tela de saída

Ctrl + q

Ativa a exibição de informações na tela de saída, inibida pelo Ctrl + s

Ctrl + z

Põe o processo corrente em background (segundo plano)

Icones/importante.png

NOTA: Para maiores detalhes, veja aqui nossa página exclusiva sobre atalhos de teclado no bash e Papel de parede das teclas de atalhos para o uso no terminal, clique aqui.

Teclas de emergência do GNU/Linux

Quem é que já não se deparou com um travamento causado por mal-funcionamento de hardware no Linux? Este tópico ensina a usar as teclas de emergência do kernel.

Icones/importante.png

NOTA: As teclas de emergência do kernel são comandos de baixo nível pouco conhecidos que podem desempenhar uma função primordial na vida de usuários Linux.

Desligando o computador

A primeira combinação de emergência é usada para sincronizar os discos e desligar o computador instantaneamente evitando problemas nos sistemas de arquivos. Ela é ideal para quem precisa desligar o computador rapidamente sem danificar seus sistemas de arquivos, ou quando a máquina trava e por qualquer motivo não permite um desligamento natural através do init.

Mantendo ALT pressionado, tecle Print Screen e depois O.

Reiniciando o computador

Assim como o Ctrl+Alt+Del do MS-DOS o kernel do Linux também possui uma chamada de emergência que permite reiniciar a máquina, com a vantagem de sincronizar os discos evitando danos no sistema de arquivos. Veja como fazer:

Mantendo ALT pressionado, tecle Print Screen e depois B.

Sincronizando os discos

Se você acha que a força vai cair e precisa trabalhar até a ultima hora mas tem medo de danificar seu sistema de arquivo, poderá sincronizar seus discos de tempos em tempos.

Para sincronizar discos em caso de emergência:

Mantendo ALT pressionado, tecle Print Screen e depois S.

Segurança

Se por algum motivo algo está ameaçando a segurança do seu sistema, como a execução acidental de um script malicioso como root ou de programa desconhecido, poderá colocar os discos como somente leitura e evitar danos mais sérios.

Mantendo ALT pressionado, tecle Print Screen e depois U.

Otimizando o desempenho do history com navegação contextual

Como sabemos o ambiente shell do GNU/Linux, no caso o bash, mantém no arquivo .bash_history uma lista com o histórico dos últimos comandos digitados. Com isso e o uso das teclas direcionais UP e DOWN nos permitem “navegar” por esta lista, de modo a retornar com um comando já utilizado e que esteja em nosso histórico armazenado.

Porém por padrão esta navegação será por toda gama de comando já utilizados, o que por vezes faz com que percamos até mais tempo necessário do que se digitarmos novamente o comando.

Com uma dica simples veremos então como fazer com que esta navegação seja otimizada de forma a permitir uma filtragem no histórico de comandos bastando inserir alguns caracteres do mesmo antes de usarmos as setas de navegação.

Agora as setas farão uma procura por contexto. Se você não digitar nada, o efeito será o mesmo que antes, mas se você digitar um caractere e pressionar a seta, ele só irá mostrar os comandos que comecem com aquele caractere. Portanto com este ajuste, se você digitar “ls” e pressionar a seta ele vai navegar apenas nos comandos que começam com “ls”.

Para que isso funcione desta forma primeiramente iremos criar no diretório $HOME do usuário desejado o arquivo oculto de nome .inputrc com o seguinte conteúdo abaixo:

“\e[A”: history-search-backward
“\e[B”: history-search-forward

Agora basta fechar a seção atual e abrir uma nova para que a navegação no histórico dos comandos passe a funcionar desta forma mais otimizada.

Notas:

  • Por padrão o Linux armazena no .bash_history os últimos 500 comandos utilizados, mais este número pode ser modificado editando o seu arquivo .bashrc e adicionado as seguintes linhas:

export HISTFILESIZE=XXXX
export HISTSIZE=XXXX

Onde, XXXX deve ser substituído pela quantidade desejada.

  • Como configuração padrão do sistema como um todo existe o arquivo /etc/inputrc, ou seja, caso se deseje que estas novas configurações passem a valer para todos usuários do sistema basta adicionar aquelas 2 linhas do .inputrc neste arquivo.

Usando “grep” com resultados coloridos

Quem costuma usar o grep para fazer filtragens, pode se beneficiar desta pequena e simples dica, fazendo a saída dos resultados ficarem coloridas em destaque.

grep --color=auto

Vamos a um exemplo pratico para entender melhor:

ps aux |grep --color=auto tty

Nota:

Quem gostar do resultado e desejar deixar como padrão, basta editar seu arquivo ~/.bashrc criando um alias para o comando grep conforme abaixo demonstrado.

1. Abra o arquivo em seu editor de texto favorito.

vim ~/.bashrc

2. Adicione a linha baixo no mesmo, e salve o arquivo.

alias grep='grep --color=auto'

3. Agora, basta executar o comando abaixo que este recurso será padrão para este seu usuário.

source ~/.bashrc

Obtendo ajuda

Nosso maior aliado

Warning /!\ Os comandos –help e man podem ser consideradas as duas ferramentas mais importantes em uma linha de comando.

Praticamente todos os comando entendem a opção -h (ou –help), a qual produzirá uma descrição breve e útil do comando e suas opções, e então volta para o terminal. Tente “man -h” ou “man –help” para ver isso em ação.

Todo comando e quase toda aplicação em Linux terá um arquivo man (manual), e encontrá-lo será muito simples. Basta digitar ”man comando” para surgir um manual extenso para o comando especificado. Por exemplo, “man mv” mostrará o manual de mv (Move).

Mova para cima ou para baixo no arquivo man utilizando as teclas Page UP e Page Down ou as setas no teclado, e retorne para a linha de comando teclando q.

“man man” mostrará a entrada do manual para o comando man, e este é um bom lugar para começar!

“man intro” é especialmente útil, pois mostrará a “Introdução para comandos do usuário” que é uma introdução breve e bem escrita sobre a linha de comando.

Além disso, há as páginas de info, que geralmente serão mais detalhados, se aprofundando mais do que as páginas man. Tente “info info” para uma introdução às páginas info.

Procurando por arquivos “man”

Se você não está certo de qual comando ou aplicação você precisa usar, você pode tentar procurando os manuais (arquivos “man”).

  • “man -k foo” irá procurar manuais para foo. Tente “man -k nautilus” para ver como isso funciona.

    • Observe que isso é o mesmo que o comando apropos.

  • “man -f foo” procura apenas os títulos dos manuais do seu sistema. Tente “man -f gnome”, por exemplo.

    • Isso é o mesmo que o comando whatis.

Demonstração do streaming de áudio para celular!

  1. Acesse o link  http://mobile.servermedia.com.br/
  2. Escolha por onde deseja ouvir!

Cientistas criam bateria que recarrega 70% em dois minutos

Uma nova bateria de íon-lítio criada por pesquisadores da Universidade Tecnológica de Nanyang em Cingapura consegue recarregar 70% em apenas dois minutos.

De acordo com a instituição de ensino, a bateria ainda possui 20 anos de vida útil, dez vezes mais ante os atuais modelos.

O ciclo de recarga da bateria também deve aumentar dos atuais 500 (algo em torno de três anos de uso) para 10.000 ciclos.

O grande diferencial da pesquisa é a substituição do grafite que cobre o polo negativo da bateria, por outro elemento feito de nanotubos de dióxido de titânio.  Esses nanotubos são mais finos que o cabelo humano, porém rápidos na transmissão de íons e elétrons, permitindo a “super carga”.

Além disso, os cientistas da universidade apontam que o produto será relativamente mais barato, pois o dióxido de titânio pode ser encontrado no solo.

A bateria também poderá ser usada em outros setores, como carros elétricos e deve chegar no mercado em dois anos.

Backups remotos com rSync e chaves SSH

 

O rSync, assim como o SCP, são ótimas ferramentas para transferências de arquivos entre máquinas, porém, possuem uma deficiência, eles são inseguros.

Originalmente, o rSync não utiliza nenhuma forma de criptografia, o que o torna um tanto ineficaz para backups via Internet. Entretanto, este problema pode ser facilmente resolvido, utilizando o nosso “canivete suíço” SSH como meio de transporte, possibilitando automatizar a tarefa com um script básico.

Neste exemplo, vou me referir a máquina local como (A) e o servidor como (B). O comando com o rsync, seria o seguinte:

$ rsync -av –rsh=”ssh -l bkuser” /mnt/backup/ bkuser@IPServidorRemoto:/home/bkuser/backup/

Onde, no comando anterior:

  • O parâmetro –rsh=ssh, orienta o rSync a utilizar o SSH como meio de transporte.
  • O -l bkuser, informa com qual usuário o SSH deve conectar-se no servidor remoto (B).
  • Adiante, vem a pasta local (A), o endereço IP do servidor remoto (B) e a pasta para onde vão os arquivos.

Naturalmente, para que tudo funcione, é necessário que o serviço SSH esteja em execução nas duas máquinas e que o usuário local (A) tenha um login de acesso na máquina servidora (B).

Os parâmetros -av, fazem com que o rSync grave e atualize novos arquivos na pasta do servidor (B), caso o usuário apague arquivos na pasta local (A) e quiser que essa ação seja sincronizada com o servidor (B), será necessário adicionar o parâmetro –delete.

Outro parâmetro interessante, é o -z, que ativa a compressão na transferência dos arquivos reduzindo o volume de bytes transferidos.

O comando para deleção, seria o seguinte:

$ rsync -av –delete –rsh=”ssh -l bkuser” /mnt/backup/ bkuser@IPremoto:/home/bkuser/backup/

O comando para compressão dos arquivos, seria o seguinte:

$ rsync -avz –rsh=”ssh -l bkuser” /mnt/backup/ bkuser@IPremoto:/home/bkuser/backup/

Outra operação interessante, seria realizar um backup da máquina servidora (B) para a máquina local (A) em uma operação inversa, o comando seria o seguinte:

$ rsync -av –rsh=”ssh -l bkuser” bkuser@IPremoto:/home/bkuser/backup/ /mnt/backup/

Observação: a barra no final do caminho faz toda diferença, sem ela, o comando criará um subdiretório e copiará os arquivos. Com ela, o comando só copiará os arquivos.

Algumas opções comuns dorsync:

  • -r :: cópia recursiva;
  • -a :: modo de arquivamento;
  • -v :: de modo verbose, para mostrar na tela tudo o que ele está fazendo;
  • -z :: para compactar o arquivo durante a transferência (e descompactar no destino);
  • -u :: modo update. Se o arquivo não foi atualizado, pula para o próximo, poupando tempo;
  • -p :: preserva as permissões dos arquivos.

Existem diversas outras opções para o rsync, bastando apenas uma consulta simples com o comando:

$ man rsync

Fatalmente, o usuário precisará fornecer a senha de acesso ao servidor, toda vez que executar o comando, o que impossibilita o uso em scripts de backup automático.Para resolver esse problema, a melhor solução, é utilizar um par de chaves SSH com a passphrase em branco. Dessa forma, o usuário não precisa digitar a senha, tornando a operação automática.

Gerando as chaves SSH e automatizando o acesso

O primeiro passo, caso o administrador ainda não tenha feito, seria criar um usuário na máquina servidora (B). Esse usuário permitirá o acesso aos arquivos por parte da máquina local (A).

Nesse exemplo, foi criado o usuário bkuser na máquina (B), ou seja, no servidor que receberá os arquivos, com o comando:

# adduser bkuser

O passo seguinte será gerar as chaves SSH na máquina local (A), com o comando:

$ ssh-keygen -t rsa

Para isso, utilize um usuário normal do sistema, é recomendado não utilizar o root para essa operação por uma questão de segurança.

No Ubuntu, onde fiz os testes, as chaves nem foram criadas como root. Não precisa nomear o arquivo, deixe tudo em branco, assim como a passphrase.

Serão geradas duas chaves, a privada e a pública. As duas chaves se encontram no diretório home do usuário, com o qual foi dado o comando dentro da pasta oculta .ssh. É importante que as chaves estejam dentro desse diretório.

A chave pública será enviada para o servidor remoto (B), usando o comando:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub bkuser@IPServidorRemoto

Se tudo ocorrer normalmente, o usuário já poderá logar-se no servidor remoto (B) sem precisar fornecer a senha. Isso poderá ser feito, executando o seguinte comando:

$ ssh bkuser@IPServidorRemoto

Isso, supondo que a porta seja a 22, que é a padrão do SSH. Caso não seja, utilize o parâmetro -p e especifique a porta.

Agora, é só gerar o script de backup com algum dos comandos mostrados e inserir uma linha no arquivo crontab, para que a operação seja automatizada.

Fianlizando!

Espero que dê certo com vocês.

Em meus testes, funcionou perfeitamente.

Qualquer dúvida, é só deixar um comentário.

Manual do IPtables – Comentários e sugestões de regras

Introdução

Manual do iptables: IPtables (8) – Manual do IPtables
Nome: iptables – Ferramenta de administração para filtragem de pacotes IPv4 e NAT
Nota do tradutor: Para pacotes IPv6 deve-se utilizar ip6tables.

Sinopse:

iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options…]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches…] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]

Descrição

O iptables é utilizado para configurar, manter e inspecionar as tabelas de regras de filtragem de pacotes IPv4 no kernel do Linux. Várias tabelas diferentes podem ser definidas. Cada tabela contém um número de chains (correntes, cadeias) internas e também pode conter chains definidas pelo usuário.

Cada chain é uma lista de regras que podem combinar com um conjunto de pacotes. Cada regra especifica o que fazer com um pacote que combina com a regra. Isto é chamado de target, que pode ser um salto na mesma tabela para uma chain definida pelo utilizador.

Alvos (Targets)

Uma regra de firewall especifica os critérios para um pacote e um alvo. Se o pacote não corresponder, a regra seguinte na chain é examinada e, se o pacote for igual, então a próxima regra é especificada pelo valor do alvo, o que pode ser o nome de uma chain definida pelo utilizador ou por um dos valores especiais ACCEPT, DROP, QUEUE ou RETURN:

  • ACCEPT: significa deixar o pacote passar.
  • DROP: significa descartar o pacote.
  • QUEUE: significa passar o pacote para o userspace – espaço do usuário – (o modo como o pacote será recebido por um processo de userspace difere de acordo como determinada fila é manipulada. Os kernels 2.4.x e 2.6.x até 2.6.13, incluem o manipulador de fila “ip_queue”. Kernels 2.6.14 e posteriores, incluem o manipulador de fila “nfnetlink_queue”. Pacotes com um alvo de fila serão enviados para a fila número ‘0’. Consulte também o alvo NFQUEUE descrito posteriormente nesta página do manual).
  • RETURN: significa parar de atravessar a chain e continuar na próxima regra da chain anterior. Se o final de uma chain “built-in” (embutida) for alcançado ou uma regra de uma chain “built-in” com alvo RETURN for correspondida, o alvo especificado pela política da chain determina o destino do pacote.

Tabelas (Tables)

Geralmente, há três tabelas independentes (as tabelas que estão presentes em qualquer momento dependem das configurações do kernel e dos módulos que estão presentes).

-t, –table table :: Esta opção especifica a tabela correspondente ao pacote que o comando deve executar. Se o kernel estiver configurado com módulo de carga automático, uma tentativa será feita para carregar o módulo apropriado para essa tabela, se ele já não estiver carregado.

As tabelas são, como se segue:

filter :: Esta é a tabela padrão (se a opção “-t” não definir outra tabela, será utilizada esta tabela). Ela contém a chain “built-in INPUT” (entrada – para pacotes destinados a sockets locais, pacotes destinados para a própria máquina), FORWARD (para pacotes sendo roteados através da máquina, pacotes que passam pela máquina) e OUTPUT (para pacotes gerados localmente, pacotes oriundos da própria máquina com destino para fora dela).

* Nota do tradutor: “máquina” significa o servidor ou o desktop no qual o iptables estiver instalado e configurado. O iptables vem em praticamente todas as distribuições GNU/Linux e para configurá-lo, basta somente criar um arquivo em modo texto, dar permissão de execução e colocá-lo para iniciar junto com o sistema.

A seguir, para os preguiçosos de plantão, três sugestões de ferramentas gráficas (onde aparecem as janelinhas bonitinhas para sair clicando feito um maluco) para administração do iptables:

O iptables lê as regras de cima para baixo, de acordo com cada tabela, ou seja, se uma regra bloquear tudo numa determinada tabela, as exceções (liberações) devem ser colocadas acima desta regra.

Exemplo:

iptables -A INPUT -p tcp –dport 443 -j ACCEPT
iptables -A INPUT -p tcp –dport 443 -j REJECT
iptables -A INPUT -p tcp –dport 443 -j DROP

A primeira regra libera, a segunda rejeita e a terceira regra, nega o acesso. A primeira regra é que terá o privilégio, então, o acesso na porta 443 será liberado para todos, mesmo rejeitando e negando o acesso nas regras subsequentes.

Caso queiramos negar o acesso à porta 443 somente para alguns IPs, por exemplo, devemos colocar essas regras ACIMA da primeira regra.

Lembrando que nas regras acima não foi determinada nenhuma tabela (-t), então, elas serão aplicadas somente na tabela padrão, a filter, e, no caso, somente na chain INPUT.

Lembrando também, que o iptables é um módulo do kernel do Linux, portanto, deve estar sendo executado pelo sistema para que possa funcionar. Ou seja, no início do script do iptables deve constar modprobe: “e_o_nome_do_módulo_o_qual_se_quer_levantar”.

Caso você compilar um novo kernel, uma boa prática é colocar o módulo “IP:netfilter configuration” e suplementares (IPv4 NAT, MASQUERADE target support, NETMAP target support, REDIRECT target support etc) como “built-in (*)”.

* As chains devem ser sempre colocadas em letras maiúsculas.

nat :: Esta tabela é consultada quando for encontrado um pacote que criou uma nova conexão. É composta de três built-ins: PREROUTING (para alterar pacotes no momento que eles chegam, antes do roteamento ou compartilhamento.), OUTPUT (para alterar pacotes gerados localmente antes do roteamento ou compartilhamento), POSTROUTING (para alterar pacotes quando eles estão prestes a sair, depois do roteamento ou compartilhamento).

mangle :: Esta tabela é usada para a alteração especializada do pacote. Até o kernel 2.4.17 tinha duas chains: PREROUTING (para alterar pacotes recebidos antes do roteamento) e OUTPUT (para alterar pacotes gerados localmente antes do roteamento). Desde o kernel 2.4.18, outras três chains embutidas também são suportadas: INPUT (para pacotes entrando na própria máquina), FORWARD (para alterar pacotes sendo roteados/compartilhados através da máquina), POSTROUTING (para alterar pacotes quando eles estão prestes a sair depois do roteamento/compartilhamento).

raw :: Esta tabela é usada principalmente para a configuração de isenções de rastreamento de conexões em combinação com o alvo NOTRACK. Ela registra os ganchos netfilter com maior prioridade e é chamada pelo ip_conntrack, ou quaisquer outras tabelas IP.

Ela oferece as seguintes chains:

  • PREROUTING: Para pacotes que chegam através de qualquer interface de rede.
  • OUTPUT: Para pacotes gerados por processos locais.

Opções: As opções que são reconhecidas pelo iptables, podem ser divididas em vários grupos diferentes.

Comandos

Estas opções especificam a ação que se quer executar. Apenas uma delas pode ser especificada na linha de comando, a menos que seja indicado de outra forma abaixo no script do iptables.

Para versões longas dos nomes de comandos e opções, você precisa usar apenas letras suficientes para garantir que o iptables pode diferenciá-los de todas as outras opções.

-A, –append chain rule-specification :: Anexa uma ou mais regras para o final da chain. Quando a origem e/ou nomes de destino resolverem mais de um endereço, uma regra será adicionada para cada combinação de endereços possíveis.

-D, –delete chain rule-specification
-D, –delete chain rulenum
:: Exclui uma ou mais regras da chain especificada. Existem duas versões deste comando: a regra pode ser especificada como um número na chain (rulenum – começando em 1 para a primeira regra) ou o nome da regra para combinar (rule-specification).

-I, –insert chain [rulenum] rule-specification :: Insire uma ou mais regras na chain especificada, pode ser um número para determinada regra. Assim, se o número da regra é um, a regra ou as regras serão inseridas no topo da chain. Este é o padrão se nenhum número de regra for especificado.

-R, –replace chain rulenum rule-specification :: Substitui uma regra na chain especificada. Se a fonte e/ou nomes de destino resolvem vários endereços, o comando irá falhar. As regras são numeradas a partir de 1.

-L, –list [chain] :: Lista todas as regras da chain especificada. Se nenhuma chain for especificada, todas as chains serão listadas. Como qualquer outro comando iptables, é aplicado na tabela especificada (a tabela filter é o padrão).

Então, as regras NAT serão listadas por:

# iptables -t nat -n -L

Note que é geralmente usado com a opção “-n” a fim de evitar longas consultas de DNS reverso. É interessante especificar a opção “-Z” (zero), daí a(s) chain(s) serão atomicamente listadas e zeradas. A saída exata é afetada pelos outros argumentos utilizados.

As regras exatas são então suprimidas até utilizar:

# iptables -L -v

-S, –list-rules [chain] :: Mostra todas as regras da chain especificada. Se nenhuma chain for especificada, todas as chains serão mostradas como o comando iptables-save. Como qualquer outro comando iptables, é aplicado na tabela especificada (a tabela filter é a padrão).

-F, –flush [chain] :: Limpa a chain especificada (limpa todas as chains da tabela se não for passado nenhum argumento). Isto é equivalente a apagar todas as regras, uma por uma.

-Z, –zero [chain [rulenum]] :: Zera os contadores de pacotes e bytes em todas as chains, ou apenas na chain de dados, ou apenas na regra dada em uma chain. É aconselhável usar a opção -L, –list para ver os contadores imediatamente antes das regras serem apagadas (veja acima).

-N, –new-chain chain :: Cria uma nova chain definida pelo usuário. Não deve haver nenhuma chain com o mesmo nome.

-X, –delete-chain [chain] :: Elimina uma específica chain criada pelo usuário. Não deve haver referências na chain. Se houver, você deve excluir ou substituir as regras referentes antes da chain ser excluída. A chain deve estar vazia, ou seja, não pode conter quaisquer regras. Se nenhum argumento for passado, o comando tentará apagar cada chain não embutida na tabela.

-P, –policy chain target

Define a política da chain para o alvo especificado. Veja seção TARGETS para os alvos possíveis. Apenas chains “built-in” (não definidas pelo usuário) podem ter políticas. Chains definidas pelo usuário não podem ser alvo de políticas.

-E, –rename-chain old-chain new-chain :: Muda o nome da chain especificada pelo usuário para um novo nome. Trata-se de uma perfumaria e não tem efeito sobre a estrutura da tabela.

-h :: Ajuda. Dá uma descrição (geralmente muito breve) da sintaxe do comando.

Parâmetros

Os parâmetros a seguir, constituem uma especificação de regras (são utilizados como os comandos: add, delete, insert, replace e append).

[!] -p, –protocol protocol :: Especifica o protocolo da regra ou do pacote. O protocolo especificado pode ser:

  • tcp,
  • udp,
  • udplite,
  • icmp,
  • esp,
  • ah,
  • sctp,
  • all.

Ou, pode ser um valor numérico representando um destes protocolos ou um outro protocolo. Um nome de protocolo do arquivo /etc/protocols também é permitido. O argumento “!”, antes do protocolo, inverte a regra. O número zero é equivalente a “all”. O protocolo “all” combina todos os protocolos e é tomado como padrão quando esta opção for omitida.

[!] -s, –source address[/mask][,…] :: Especificação da origem. “Address” pode ser um nome de rede, um host, um endereço IP de rede (com “/mask”, máscara), ou um endereço IP simples.

Os hostnames serão resolvidos apenas uma vez antes da regra ser apresentada ao kernel. Note que especificar qualquer nome a ser resolvido com uma consulta remota, como ao DNS, é uma ideia muito ruim.

A máscara pode ser uma máscara de uma rede ou um número simples especificando o número no lado esquerdo da máscara de rede. Assim, uma máscara “/24” é equivalente a 255.255.255.0.

O argumento “!” antes da especificação de endereço, inverte a regra. A flag “–src” é um alias para esta opção. Vários endereços podem ser especificados, mas isso vai se expandir para várias regras (quando for acrescentado “-A”) ou causará várias regras a serem excluídas (com “-D”).

[!] -d, –destination address[/mask][,…] :: Especificação do destino. Ver a descrição do sinalizador “-s” (source, origem) para uma descrição detalhada da sintaxe. A flag (bandeira) “-dst” é um alias para essa opção.

-j, –jump target :: Especifica o alvo da regra, isto é, o que fazer se o pacote combinar com a regra. O alvo pode ser uma chain definida pelo usuário, pode ser um dos alvos embutidos especiais (chains que vem por padrão) que decidem o destino do pacote imediatamente ou pode ser uma extensão (ver EXTENSIONS abaixo).

Se esta opção for omitida em uma regra (e “-g” não for usado com a regra) não terá efeito sobre o destino do pacote, mas os contadores sobre a regra serão incrementados.

-g, –goto chain :: Especifica que o processamento deve continuar em uma chain especificada. Ao contrário da opção “–jump”, não vai continuar o processamento nesta chain, mas sim na chain que chamou via “–jump”.

[!] -i, –in-interface name :: Nome de uma interface através da qual um pacote foi recebido (somente para pacotes que entram nas chains INPUT, FORWARD e PREROUTING).

Quando o argumento “!” for utilizado antes do nome da interface, o sentido é invertido. Se o nome da interface termina em “+”, então qualquer interface que começa com o mesmo nome irá corresponder. Se esta opção for omitida, qualquer nome de interface irá corresponder.

Nota do tradutor: “eth+” refere-se a eth0, eth1, eth2, etc. Ou seja, a todas as placas de rede da máquina que começam com eth. Wireless seria “wlan+”.

[!] -o, –out-interface name :: Nome de uma interface através da qual um pacote vai ser enviado (para pacotes que entram nas chains OUTPUT, FORWARD e POSTROUTING).

Quando o argumento “!” for utilizado antes do nome da interface, o sentido é invertido. Se o nome da interface termina em “+”, então qualquer interface que começa com este nome irá corresponder. Se esta opção for omitida, qualquer nome de interface irá corresponder.

[!] -f, –fragment :: Significa que a regra se refere ao segundo fragmento em diante dos pacotes fragmentados. Como não há maneira de dizer as portas de origem ou destino de um tal pacote (tipo ICMP), tal pacote não irá corresponder a todas as regras especificadas.

Quando o argumento “!” precede a flag “-f”, a regra só vai coincidir com o cabeçalho dos fragmentos ou dos pacotes não fragmentados.

-c, –set-counters packets bytes :: Isso permite que o administrador inicialize os contadores de pacotes e os bytes de uma regra (durante as operações INSERT, APPEND e REPLACE).

Outras opções / Match Extensions

Outras opções

As seguintes opções adicionais podem ser especificadas:

-v, –verbose :: Saída detalhada. Esta opção faz com que o comando “-L” (list) mostre o nome da interface, as opções de regras (se houver) e as máscaras de ToS (Type of Service – Tipo de Serviço, RFC791).

Os contadores de pacotes e bytes serão listados com os sufixos ‘K’, ‘M’ ou ‘G’ para multiplicadores 1000, 1.000.000 e 1.000.000.000, respectivamente (veja a flag “-x” para mudar isso). Para APPEND, INSERT, DELETE e REPLACE, isso faz com que sejam mostradas informações detalhadas sobre a regra ou regras.

-n, –numeric :: Saída numérica. Endereços IP e números de porta serão mostrados em formato numérico. Por padrão, o programa vai tentar mostrá-los como nomes de host, nomes de rede, ou serviços (quando aplicável).

-x, –exact :: Expande números. Mostra o valor exato dos contadores de pacotes e bytes em vez de apenas o número arredondado em K (múltiplos de 1000), M (múltiplos de 1000K) ou G (múltiplos de 1000M). Esta opção só é relevante para o comando “-L”.

–line-numbers :: Ao listar regras, este comando adiciona números de linhas para o início de cada regra, correspondendo à posição da regra na chain.

–modprobe=command :: Ao adicionar ou inserir regras em uma chain, use este comando para carregar os módulos necessários (targtes, match extensions, etc.)

Match Extensions

O iptables pode usar módulos correspondentes para pacotes grandes. Estes são carregados de duas maneiras: implicitamente, quando “-p” ou “-protocol” for especificado; ou com as opções “-m” ou “–match” seguidas pelo nome do módulo correspondente.

Após várias opções de linha de comando adicionais tornam-se disponíveis, dependendo do módulo especificado. Você pode especificar vários módulos em uma linha e você pode usar a opção “-h” ou “–help”, ajuda, após o módulo especificado, para receber ajuda específica para o módulo.

Os módulos a seguir, estão incluídos no pacote de base e a maioria deles podem ser precedidos por um “!”, para inverter o sentido da regra:

addrtype :: Este módulo combina pacotes baseado no address type. Tipos de endereços são utilizados dentro da pilha de rede do kernel e categorizam endereços em vários grupos. A definição exata desse grupo específico depende do protocolo de três camadas.

Os tipos de endereços possíveis são:

  • unspec :: Um endereço indeterminado (ou seja 0.0.0.0)
  • unicast :: Um endereço unicast
  • local :: Um endereço local
  • broadcast :: Um endereço de broadcast
  • anycast :: Um pacote de anycast
  • multicast :: Um endereço de multicast
  • blackhole :: Um endereço de blackhole
  • unreachable :: Um endereço inacessível
  • prohibit :: Um endereço proibido
  • throw fixme
  • nat fixme
  • xresolve
  • [!] –src-type type :: Combina se o endereço de origem é de determinado tipo
  • [!] –dst-type type :: Combina se o endereço de destino é de determinado tipo
  • –limit-iface-in :: A verificação do tipo de endereço pode ser limitada à interface do pacote que está entrando. Esta opção só é válida com prerouting, input e forward. Ela não pode ser especificada com a opção “–limit-iface-out”.
  • –limit-iface-out :: A verificação do tipo de endereço pode ser limitada à interface do pacote que está saindo. Esta opção é válida apenas com postrouting, output e forward. Ela não pode ser especificada com a opção “–limite-iface-in”.

ah :: Este módulo corresponde ao spis no cabeçalho de autenticação de pacotes ipsec. [!] –ahspi spi[:spi]

cluster :: Permite implantar gateway e back-end de carga de compartilhamento de grupos sem a necessidade de balanceadores de carga.

Requer que todos os nós enxerguem os mesmos pacotes. Assim, o grupo decide se o nó tem de lidar com um determinado pacote, seguindo as seguintes opções:

–cluster-total-nodes num :: Define o número de nós totais em cluster.
[!] –cluster-local-node num :: Define o número de identificação do nó local.
[!] –cluster-local-nodemask mask :: Define o número id da máscara do nó local. Você pode usar esta opção em vez de “–cluster-local-node”.
–cluster-hash-seed value :: Define o valor do hash jenkins.

Exemplo:

# iptables -a prerouting -t mangle -i eth1 -m cluster –cluster-total-nodes 2 –cluster-local-node 1 –cluster-hash-seed 0xdeadbeef -j mark –set-mark 0xffff
# iptables -a prerouting -t mangle -i eth2 -m cluster –cluster-total-nodes 2 –cluster-local-node 1 –cluster-hash-seed 0xdeadbeef -j mark –set-mark 0xffff
# iptables -a prerouting -t mangle -i eth1 -m mark ! –mark 0xffff -j drop
# iptables -a prerouting -t mangle -i eth2 -m mark ! –mark 0xffff -j drop

E os seguintes comandos para fazer todos os nós verem os mesmos pacotes:

# ip maddr add 01:00:5e:00:01:01 dev eth1
# ip maddr add 01:00:5e:00:01:02 dev eth2
# arptables -a output -o eth1 –h-length 6 -j mangle –mangle-mac-s 01:00:5e:00:01:01
# arptables -a input -i eth1 –h-length 6 –destination-mac 01:00:5e:00:01:01 -j mangle –mangle-mac-d 00:zz:yy:xx:5a:27
# arptables -a output -o eth2 –h-length 6 -j mangle –mangle-mac-s 01:00:5e:00:01:02
# arptables -a input -i eth2 –h-length 6 –destination-mac 01:00:5e:00:01:02 -j mangle –mangle-mac-d 00:zz:yy:xx:5a:27

No caso de conexões TCP, a facilidade de captação (pickup facility) tem que ser desativada para evitar a marcação de pacotes TCP ACK que venham como resposta direta válida:

# echo 0 > /proc/sys/net/netfilter/nf_conntrack_tcp_loose

comment :: Permite adicionar comentários (até 256 caracteres) para qualquer regra:

–comment comment

Exemplo:

# iptables -a input -s 192.168.0.0/16 -m comment –comment “a privatized ip block”

connbytes :: Significa que o número de bytes, ou pacotes, de uma conexão (ou um dos dois fluxos que constituem a conexão) foi transferido para longe, ou por média de bytes por pacote.

Os contadores são de 64 bits e, portanto, espera-se que não dê overflow. 😉

O uso principal é detectar vida longa de downloads e marcá-los para serem agendados usando uma faixa de menor prioridade no controle de tráfego.

Os bytes transferidos por conexão também podem ser vistos através de “conntrack -l” e acessado via ctnetlink.

Note que, para conexões que não têm contadores de informações, sempre retornará falso. O controle de flag sysctl “net.netfilter.nf_conntrack_acct” será utilizado se as novas conexões forem de bytes/pacotes contados. Fluxos de conexão existentes não serão gaining/losing se a estrutura do contador estiver com a flag sysctl invertida.

[!] –connbytes from[:to] :: Coincide pacotes a partir de uma conexão cuja pacotes/bytes/média do tamanho do pacote for mais do que “from” e menos do que to bytes/pacotes. Se to for omitido, apenas a verificação “from” é feita. “!” é utilizado para combinar com pacotes que não se incluam no intervalo.

–connbytes-dir {original|reply|both} :: Define quais os pacotes a serem considerados.

–connbytes-mode {packets|bytes|avgpkt} :: Verifica a quantidade de pacotes, o número de bytes transferidos ou o tamanho médio (em bytes) de todos os pacotes recebidos até o momento.

Note-se que quando “both” é utilizado em conjunto com “avgpkt”, e os dados vão (principalmente) apenas num sentido (por exemplo HTTP), o tamanho do pacote médio será de cerca de metade dos pacotes de dados reais.

Exemplo:

# iptables .. -m connbytes –connbytes 10000:100000 –connbytes-dir both –connbytes-mode bytes …

connlimit :: Permite restringir o número de conexões paralelas para um servidor por endereço IP do cliente (ou bloco de endereços do cliente).

[!] –connlimit-above n :: Combina se o número de conexões existentes for (não) acima de “n”.

–connlimit-mask prefix_length :: Grupo de hosts utilizando o tamanho do prefixo. Para o IPv4, este deve ser um número entre 0 (inclusive) e 32. Para o IPv6, entre 0 e 128.

Exemplos:

#Permite duas conexões telnet por host cliente
iptables -a input -p tcp –syn –dport 23 -m connlimit –connlimit-above 2 -j reject

#Você também pode definir o contrário utilizando “!” e accept
iptables -a input -p tcp –syn –dport 23 -m connlimit ! –connlimit-above 2 -j accept

#Limita o número de solicitações paralelas HTTP para 16 por rede classe c porte (24 netmask bit)
iptables -p tcp –syn –dport 80 -m connlimit –connlimit-above 16 –connlimit-mask 24 -j reject

#Limita o número para 16 solicitações HTTP paralelas para a rede de conexão local (ipv6)
ip6tables -p tcp –syn –dport 80 -s fe80::/64 -m connlimit –connlimit-above 16 –connlimit-mask 64 -j reject

connmark :: Este módulo corresponde ao campo netfilter associado a uma conexão (que pode ser definido com o alvo “connmark” abaixo).

[!] –mark value[/mask] :: Pacotes em conexões com o valor de marca dada (se uma máscara é especificada, esta é, logicamente, “anded” (concatenada, operador “and”) com a marca antes da comparação).

conntrack :: Este módulo, quando combinado com rastreamento de conexão, permite o acesso ao estado de rastreamento da conexão para este pacote/conexão.

[!] –ctstate statelist :: statelist é uma lista separada por vírgulas dos estados de conexão para combinar. Estados possíveis estão listados abaixo:

  • [!] –ctproto l4proto layer-4 :: Protocolo para combinar (por número ou nome)
  • [!] –ctorigsrc address[/mask]
  • [!] –ctorigdst address[/mask]
  • [!] –ctreplsrc address[/mask]
  • [!] –ctrepldst address[/mask] :: Combina contra o endereço original/reply source/destination
  • [!] –ctorigsrcport port
  • [!] –ctorigdstport port
  • [!] –ctreplsrcport port
  • [!] –ctrepldstport port :: Combina contra original/reply source/destination (tcp/udp/etc.) ou a tecla “gre”.
  • [!] –ctstatus statelist :: Statelist é uma lista separada por vírgula dos status de conexão para combinar. Os status possíveis estão listados abaixo.
  • [!] –ctexpire time[:time] :: Combina tempo restante de vida em segundos contra determinado valor ou intervalo de valores (inclusive)
  • –ctdir {original|reply} :: Corresponde a pacotes que estão fluindo na direção especificada. Se este sinalizador não for especificado, corresponde pacotes em ambas as direções.

Estados para “–ctstate”:

  • invalid :: Significa que o pacote está associado com nenhuma conexão conhecida.
  • new :: Significa que o pacote começou uma nova conexão ou está associado a uma conexão que não tem pacotes vindos de ambas as direções.
  • established :: Significa que o pacote está associado com uma conexão que tem pacotes vindos de ambas direções.
  • related :: Significa que o pacote está começando uma nova conexão, mas está associado a uma conexão existente, como uma transferência de dados de FTP, ou um erro ICMP.
  • untracked :: Significa que o pacote não é seguido em tudo. Isso acontece se você usa o alvo notrack na tabela raw.
  • snat :: É um estado virtual, combina se o endereço de origem for diferente do endereço de destino.
  • dnat :: É um estado virtual, combina se o endereço de destino difere do endereço de origem.

Estados para “–ctstatus”:

  • none :: Nenhum dos abaixo.
  • expected :: Esta é uma conexão esperada (ou seja, um conntrack pode configurar)
  • seen_reply :: conntrack viu pacotes em ambas as direções.
  • assured :: Entrada conntrack nunca deve ser precocemente expirada.
  • confirmed :: Conexão confirmada: pacote originário deixou a caixa.

dccp

  • [!] –source-port,–sport port[:port]
  • [!] –destination-port,–dport port[:port]
  • [!] –dccp-types mask :: Combina quando o tipo de pacote DCCP é uma das ‘mask’. ‘mask’ é uma lista dos tipos de pacotes, separada por vírgula. Os tipos de pacotes são: request response data ack dataack closereq close reset sync syncack invalid.
  • [!] –dccp-option number :: Combina se DCP for um conjunto de opções.

dscp :: Este módulo corresponde ao campo de 6 bits DSCP dentro do campo ToS no cabeçalho IP. dscp substituiu ToS na IETF (Internet Engineering Task Force):

  • [!] –dscp value :: Combina contra um valor numérico (decimal ou hexadecimal) o valor [0-63].
  • [!] –dscp-class class :: Coincide com a classe diffserv. Este valor pode ser qualquer uma das classes: be, ef, afxx ou csx. Será, então, convertido de acordo com seu valor numérico.

ecn :: Permite combinar os bits ecn do IPv4 com o cabeçalho TCP. ecn é o mecanismo de notificação explícita de congestionamento, como especificado na rfc3168:

  • [!] –ecn-tcp-cwr :: Combina se o tcp ecn cwr (janela de congestionamento recebida) bit é definido.
  • [!] –ecn-tcp-ece :: Combina se o tcp ecn ece (ecn echo) bit está definido.
  • [!] –ecn-ip-ect num :: Corresponde a um determinado ipv4 ect (ecn- capable transport). Você tem que especificar um número entre ‘0 ‘e ‘3’.

esp :: Este módulo corresponde às spis dos cabeçalhos ESP dos pacotes IPsec:

  • [!] –espspi spi[:spi]

hashlimit :: hashlimit usa hash para expressar uma taxa limite (como limit) para um grupo de conexões, usando uma única regra do iptables. O agrupamento pode ser feito por hostgroup (source and/or destination address) e/ou por porta.

Dá a capacidade de expressar “-n” pacotes por quantum de tempo por grupo:

  • matching on source host “1000 packets per second for every host in 192.168.0.0/16”
  • matching on source prot “100 packets per second for every service of 192.168.1.1”
  • matching on subnet “10000 packets per minute for every /28 subnet in 10.0.0.0/8”

As opções “–hashlimit-upto”, “–hashlimit-above” e “–hashlimit-name” são requeridas.

–hashlimit-upto amount[/second|/minute|/hour|/day] :: Combina se a taxa é menor ou igual a amount/quantum. É especificado como um número, com um sufixo opcional quantum de tempo, o padrão é 3/hour.

–hashlimit-above amount[/second|/minute|/hour|/day] :: Combina se a taxa está acima de amount/quantum.

–hashlimit-burst amount :: Número inicial máximo de pacotes: este número é recarregado por um cada vez que o limite especificado não for atingido, o padrão é 5.

–hashlimit-mode {srcip|srcport|dstip|dstport},… :: É uma lista separada por vírgulas de objetos para levar em consideração. Se nenhuma opção “–hashlimit-mode” for dada, o hashlimit age como limite para fazer a limpeza de hash.

–hashlimit-srcmask prefix :: Quando “–hashlimit-mode srcip” for utilizado, todos os endereços de origem encontrados serão agrupados de acordo com o tamanho do prefixo dado e a sub-rede estará sujeita a hashlimit. O prefix tem de ser entre 0 (inclusive) e 32.

Note que “–hashlimit-srcmask 0” é basicamente fazer a mesma coisa que não for especificada para “–hashlimit-mode srcip”, mas é tecnicamente mais caro.

–hashlimit-dstmask prefix :: É como “–hashlimit-srcmask”, mas para endereços de destino.

–hashlimit-name foo :: Nome para a entrada /proc/net/ipt_hashlimit/foo.

–hashlimit-htable-size buckets :: Número de buckets (baldes) da tabela hash

–hashlimit-htable-max entries :: Máximo de entradas no hash.

–hashlimit-htable-expire msec :: Agrupar depois de tantos milissegundos se as entradas de hash expirarem.

–hashlimit-htable-gcinterval msec :: Quantos milissegundos entre intervalos de coleta de lixo.

helper :: Este módulo corresponde aos pacotes relativos a um determinado conntrack-helper.

[!] –helper string :: Combina pacotes relacionados com o especificado no conntrack-helper.

chain :: Pode ser “ftp” para os pacotes relacionados a uma sessão FTP na porta padrão. Para outras portas acrescentar “-portnr” ao valor, ou seja. “ftp-2121”.

As mesmas regras se aplicam a outros conntrack-helpers.

icmp :: Esta extensão pode ser usada se ‘–protocolo icmp’ for especificada. Ela oferece a seguinte opção:

[!] –icmp-type {type[/code]|typename} :: Permite a especificação do tipo ICMP, que pode ser um tipo numérico ICMP, par tipo/código, ou um dos nomes ICMP mostrados pelo comando:

# iptables -p icmp -h

iprange :: Combina um determinado intervalo arbitrário de endereços IP:

  • [!] –src-range from[-to] :: Combina IP de origem no intervalo especificado.
  • [!] –dst-range from[-to] :: Combina o IP de destino com o intervalo especificado.

length :: Este módulo corresponde ao tamanho da carga de camada 3 (por exemplo, camada 4 de pacotes) de um pacote de encontro a um valor específico, ou intervalo de valores.

[!] –length length[:length]

limit :: Este módulo corresponde a uma taxa limite usando um filtro de token bucket. Uma regra usando esta extensão irá corresponder até este limite ser atingido (a menos que a flag ‘!’ seja usada). Ele pode ser utilizado em combinação com o alvo log para dar o log limitado.

Por exemplo:

  • –limit rate[/second|/minute|/hour|/day] :: Taxa média máxima de correspondência: especificada como um número com um opcional ‘/second’, ‘/minute’, ‘/hour’, or ‘/day’, o padrão é 3/hour.
  • –limit-burst number :: Número inicial máximo de pacotes: este número é recarregado por um cada vez que o limite especificado acima não for atingido, o padrão é 5.
  • mac – [!] –mac-source address :: Corresponde ao endereço MAC de origem. Deve ser na forma: xx: xx: xx: xx: xx:xx. Note-se que isso só faz sentido para os pacotes provenientes de um dispositivo ethernet que entram nas chains prerouting, forward ou input.

mark :: Este módulo corresponde ao campo netfilter associado com um pacote (que pode ser definido com o alvo “mark” abaixo).

[!] –mark value[/mask] :: Combina pacotes com o valor de marca unsigned (não assinado) (se uma máscara é especificada, esta é logicamente anded com a máscara antes da comparação).

multiport :: Este módulo corresponde à um conjunto de portas de origem ou destino. Até 15 portas podem ser especificadas. A faixa de porta (port:port) conta como duas portas. Ela apenas pode ser utilizada em conjunto com “-p tcp” ou “-p udp”.

[!] –source-ports,–sports port[,port|,port:port]… :: Combina se a porta de origem é uma das portas especificadas. A flag “–sports” é um apelido conveniente para essa opção.

Várias portas ou intervalos de portas são separados usando uma vírgula e um intervalo de portas é especificado usando dois pontos. O conjunto 53,1024:65535, portanto, combina a porta 53 e todo o intervalo entre 1024 a 65535.

[!] –destination-ports,–dports port[,port|,port:port]… :: Combina se a porta de destino é uma das portas dadas. A flag “–dports” é um álias conveniente para essa opção.

[!] –ports port[,port|,port:port]… :: Combina se a porta de origem ou destino são iguais a uma das portas especificadas.

Nota do tradutor: O módulo multiport permite que seja especificado múltiplas portas para um alvo. Podem ser especificadas até 15 portas em um único parâmetro e basta que uma porta confira para que a regra entre em ação, pois a comparação é feita usando o operador “or.

iptables -a forward -p udp -m multiport –dport 80,1024:65535 -j drop :: Esta regra bloqueia todos os pacotes vindo de todas interfaces para as portas 80 e todo o intervalo entre as portas 1024 e 65535.

osf :: O módulo “osf” faz fingerprinting passivo no sistema operacional. Este módulo compara alguns dados (tamanho da janela, mss, opções e sua ordem, TTL, df, e outros) a partir de pacotes com o conjunto de bits syn.

[!] –genre string :: Combina um operacional utilizando fingerprint (impressão digital) passiva.

–ttl level :: Faz verificações adicionais ttl sobre o pacote para determinar o sistema operacional.

Pode ser um dos seguintes valores:

  • 0 → Verdadeiro endereço IP e comparação fingerprint TTL. Geralmente feito em lans.
  • 1 → Verifica se o TTL do cabeçalho IP é menor do que a fingerprint. Geralmente feito para endereços globalmente roteáveis (wans, mans etc).
  • 2 → Não comparar o TTL.

–log level :: Loga determinado gêneros dentro do dmesg mesmo que não correspondam ao que se quer. O nível pode ser um dos seguintes valores:

  • 0 → Log de tudo ou das assinaturas desconhecidas
  • 1 → Acesse apenas o primeiro
  • 2 → Registra todas as assinaturas conhecidas correspondentes

Nota do tradutor: O módulo “osf” é bastante interessante para descobrir qual o sistema operacional de onde estão vindo os pacotes. Exemplo:

iptables -i input -j accept -p tcp -m osf –genre linux –log 0 –ttl 2

Este comando gera uma entrada no syslog parecida com esta abaixo:

windows [2000:sp3:windows xp pro sp1, 2000  sp3]:  11.22.33.55:4024  ->
       11.22.33.44:139  hops=3  linux [2.5-2.6:] : 1.2.3.4:42624 -> 1.2.3.5:22
       hops=4

Os fingerprints do sistema operacional são carregáveis utilizando o programa “nfnl_osf”. Para carregar as fingerprints de um arquivo, utilize:

# nfnl_osf -f /usr/share/xtables/pf.os

Para remover:

# nfnl_osf -f /usr/share/xtables/pf.os -d

O banco de dados de fingerprints pode ser baixado de:

owner :: Este módulo tenta combinar várias características do criador do pacote, para pacotes gerados localmente. É válido apenas nas chains output e postrouting.

Pacotes enviados não têm qualquer socket associado a eles. Pacotes de threads do kernel têm um soquete, mas geralmente não proprietário:

  • [!] –uid-owner username
  • [!] –uid-owner userid[-userid] :: Combina se a estrutura do socket de pacotes de arquivos (se tiver uma) é de propriedade do usuário fornecido. Você também pode especificar um uid numérico ou um intervalo uid.
  • [!] –gid-owner groupname
  • [!] –gid-owner groupid[-groupid] :: Combina se a estrutura do socket para um pacote de arquivos é de propriedade de um grupo determinado. Você também pode especificar um gid numérico ou um intervalo gid.
  • [!] –socket-exists :: Combina se o pacote é associado com um soquete.

Nota do tradutor: O módulo “owner” só examina pacotes que possuem detalhes suficientes no cabeçalho, pacotes que não possuem detalhes suficientes de cabeçalho nunca serão conferidos!

iptables -a output -m owner –gid-owner 1 -p udp -j drop :: Esta regra rejeita conexões indo para portas UDP de pacotes criados pelos usuários pertencentes ao grupo 1.

physdev :: Este módulo corresponde à porta de entrada da ponte e dos dispositivos de saída escravizados num dispositivo de ponte. Este módulo é uma parte da infra-estrutura e permite um transparent bridging ip firewall e só é útil para as versões do kernel 2.5.44 e acima:

  • [!] –physdev-in name :: Nome de uma ponte de portas através do qual um pacote é recebido (somente para pacotes que entram nas chains input, forward e prerouting). Se o nome da interface termina em um “+”, então qualquer interface que começa com este nome irá corresponder. Se o pacote não chegou por meio de um dispositivo de ponte, este pacote não irá corresponder a esta opção, a menos que ‘!’ seja utilizado.
  • [!] –physdev-out name :: Nome de uma ponte de portas através da qual um pacote vai ser enviado (para pacotes que entram nas chains output, forward e postrouting).

    Se o nome da interface termina em um “+”, então qualquer interface que começa com este nome irá corresponder. Note-se que a chain output de nat e mangle, não pode coincidir com a porta de saída da ponte, no entanto pode coincidir se for na chain output de filter. Se o pacote não sair por um dispositivo de ponte ou se o dispositivo é ainda desconhecido o pacote não irá corresponder a esta opção, a menos que ‘!’ seja utilizado.

  • [!] –physdev-is-in :: Combina se o pacote entrou através de uma interface de ponte.
  • [!] –physdev-is-out :: Combina se o pacote vai sair através de uma interface de ponte.
  • [!] –physdev-is-bridged :: Combina se o pacote está sendo superado e, portanto, não está sendo roteado. Isto só é útil nas chains forward e postrouting.

pkttype :: Este módulo corresponde ao tipo de pacote da camada de enlace.

[!] –pkt-type {unicast|broadcast|multicast}

policy :: Este módulo corresponde à política utilizada por IPsec para o tratamento de um pacote:

  • –dir {in|out} :: Utilizado para selecionar a política usada para decapsulation ou para a política que será usada para encapsulamento. “in” é válido nas chains “prerouting, input” e “forward”; “out” é válido nas cahins “postrouting, output” e “forward”.
  • –pol {none|ipsec} :: Combina se o pacote está sujeito a processamento IPsec.
  • –strict :: Combina se para corresponder à política exata ou se alguma regra da política coincide com a política determinada.
  • [!] –reqid id :: Corresponde ao reqid da regra de política. O reqid pode ser especificado com setkey(8) usando unique:id como nível.
  • [!] –spi spi :: Combina com o spi da sa.
  • [!] –proto {ah|esp|ipcomp} :: Coincide com o protocolo de encapsulamento.
  • [!] –mode {tunnel|transport} :: Coincide com o modo de encapsulamento.
  • [!] –tunnel-src addr[/mask] :: Corresponde à fonte de ponto final endereço de um modo túnel sa. Só é válida com “–mode tunnel”.
  • [!] –tunnel-dst addr[/mask] :: Coincide com o endereço de destino do ponto final de um túnel de modo sa. Só é válida com –mode tunnel.
  • –next :: Inicia o próximo elemento da política especificada. Só pode ser utilizado com “–strict”.

quota :: Implementa cotas de rede, diminuindo um contador de bytes em cada pacote:

  • –quota bytes :: Quota em bytes.

rateest :: O estimador de taxa pode corresponder com taxas estimadas coletadas pelo alvo “rateest”. Ele suporta valores absolutos em bps/pps, comparando dois estimadores de taxa e de correspondência sobre a diferença entre dois estimadores de taxa:

  • –rateest1 name :: Nome do estimador de primeira.
  • –rateest2 name :: Nome do estimador de segunda (se a diferença deve ser calculado).
  • –rateest-delta :: Comparar difference(s) de determinadas rate(s)
  • –rateest1-bps value
  • –rateest2-bps value :: Compare bytes por segundo.
  • –rateest1-pps value
  • –rateest2-pps value :: Compare pacotes por segundo.
  • [!] –rateest-lt :: Combina se a taxa é menor do que a taxa dada rate/estimator.
  • [!] –rateest-gt :: Combina se a taxa é maior do que a taxa dada rate/estimator.
  • [!] –rateest-eq :: Combina se a taxa é igual à taxa dada rate/estimator.

Exemplo: Este é o que pode ser utilizado para conexões de percurso de saída de dados a partir de um servidor de FTP em duas linhas com base na largura de banda, disponível no momento que a conexão de dados foi iniciada:

#Estima as taxas de saída:
iptables -t mangle -a postrouting -o eth0 -j rateest –rateest-name eth0 –rateest-interval 250ms –rateest-ewma 0.5s
iptables -t mangle -a postrouting -o ppp0 -j rateest –rateest-name ppp0 –rateest-interval 250ms –rateest-ewma 0.5s
#Marca baseado na largura de banda disponível:
iptables -t mangle -a balance -m conntrack –ctstate new -m helper –helper ftp -m rateest –rateest-delta –rateest1 eth0 –rateest-bps1 2.5mbit –rateest-gt –rateest2 ppp0 –rateest-bps2 2mbit -j connmark –set-mark 1
iptables -t mangle -a balance -m conntrack –ctstate new -m helper –helper ftp -m rateest –rateest-delta –rateest1 ppp0 –rateest-bps1 2mbit –rateest-gt –rateest2 eth0 –rateest-bps2 2.5mbit -j connmark –set-mark 2
iptables -t mangle -a balance -j connmark –restore-mark

Match Extensions (Parte 1)

 
realm :: Combina com o domínio de roteamento. “realms” de roteamento são utilizados em configurações de roteamento complexas envolvendo protocolos de roteamento dinâmico como o bgp:

  • [!] –realm value[/mask] :: Corresponde a um número de domínio dado (e, opcionalmente, máscara). Se não for um número, o valor pode ser um campo de nome /etc/iproute2/rt_realms (a máscara não pode ser usada neste caso).
  • recent :: Permite criar dinamicamente uma lista de endereços ip e, em seguida, combina contra essa lista de algumas maneiras diferentes.

    Por exemplo, você pode criar uma lista de pessoas “badguy” que tentam se conectar na porta 139 no firewall e, em seguida, usar drop para bloquear os pacotes.

    “–set”, “–rcheck”, “–update” e “–remove” são mutuamente exclusivos.

  • –name name :: Especifica a lista para usar os comandos. Se nenhum nome for dado, então o padrão será utilizado.
  • [!] –set :: Isto irá adicionar o endereço de origem do pacote para a lista. Se o endereço de origem já está na lista isso irá atualizar a entrada existente. Sempre vai retornar sucesso (ou fracasso se “!” for setado).
  • –rsource :: Combina/salva o endereço de origem de cada pacote na tabela de lista recente. Este é o padrão.
  • –rdest :: Combina/salva o endereço de destino de cada pacote na tabela da lista recente.
  • [!] –rcheck :: Verifico se o endereço de origem do pacote está atualmente na lista.
  • [!] –update :: É como “–rcheck”, exceto que ele irá atualizar o timestamp “last seen” se ele corresponder.
  • [!] –remove :: Verifica se o endereço de origem do pacote está atualmente na lista; se o endereço for removido da lista, irá retornar true. Se o endereço não for encontrado, é retornado false.
  • –seconds seconds :: Esta opção pode ser utilizada em conjunto com um –rcheck ou –update. Quando usada, vai diminuir a regra para acontecer somente se o endereço estiver na lista e dentro do número de segundos especificados (seconds).
  • –hitcount hits :: Esta opção pode ser utilizada em conjunto com um de “–rcheck” ou “–update”. Quando usada, vai diminuir apenas quando o endereço estiver na lista e os pacotes forem recebidos maior ou igual ao valor dado (hits).

    Esta opção pode ser usada junto com “–seconds” para criar uma regra ainda mais estreita exigindo um certo número de visitas dentro de um prazo específico. O valor máximo para o parâmetro hitcount é dado pelo parâmetro “ip_pkt_list_tot” do módulo de kernel xt_recent. Superior a esse valor na linha de comando fará com que a regra seja rejeitada.

  • –rttl :: Esta opção pode ser usada somente em conjunto com “–rcheck” ou “–update”. Quando usada, vai diminuir a regra apenas quando o endereço estiver na lista e o TTL dos atuais pacotes marcados com “–set”.

    Isto pode ser útil se você tiver problemas com as pessoas simulando o endereço de origem a fim de ataque DoS. Através deste módulo você não permite o acesso de outros a seu site através do envio de pacotes falsos.

Exemplos:

iptables -a forward -m recent –name badguy –rcheck –seconds 60 -j drop
iptables -a forward -p tcp -i eth0 –dport 139 -m recent –name badguy –set -j drop

No site de steve ipt_recent também tem alguns exemplos de uso.

/proc/net/xt_recent/* :: São as atuais listas de endereços e informações sobre cada entrada de cada lista.

/proc/net/xt_recent/ :: Pode ser lido para ver a lista atual ou gravar dois usando os seguintes comandos para modificar a lista:

Adicionar “addr” à lista padrão.

# echo +addr >/proc/net/xt_recent/default

Para remover “addr” da lista padrão:

# echo -addr >/proc/net/xt_recent/default

Para limpar a lista padrão (remover todas as entradas):

# echo / &t;/proc/net/xt_recent/default

O próprio módulo aceita parâmetros, padrões indicados:

  • ip_list_tot=100 :: Número de endereços lembrados por tabela.
  • ip_pkt_list_tot=20 :: Número de pacotes por endereço lembrado.
  • ip_list_hash_size=0 :: Tamanho da tabela hash. 0 (zero) significa calcular com base no padrão ip_list_tot,: 512.
  • ip_list_perms=0644 :: Permissões para /proc/net/xt_recent/*.
  • ip_list_uid=0 :: UID numérico para as propriedades de /proc/net/xt_recent/*.
  • ip_list_gid=0 :: GID numérico para as propriedades de /proc/net/xt_recent/*.

sctp

[!] –source-port,–sport port[:port]
[!] –destination-port,–dport port[:port]
[!] –chunk-types {all|any|only} chunktype[:flags] […]

As flags acima, indicam as flags que combinam, se definidas, na parte inferior do caso indica a combinar se não estiverem definidas.

Tipos chunk: data init init_ack sack heartbeat heartbeat_ack abort shutdown shutdown_ack error cookie_echo cookie_ack ecn_ecne ecn_cwr shutdown_complete asconf asconf_ack

Tipos de chunk flags disponíveis:

data u b e u b e
abort t t
shutdown_complete t t

Obs.: Flags minúsculas significam “off”, em letras maiúsculas significam “on”.

Exemplos:

iptables -a input -p sctp –dport 80 -j drop
iptables -a input -p sctp –chunk-types any data,init -j drop
iptables -a input -p sctp –chunk-types any data:be -j accept

set :: Este módulo corresponde à conjuntos de IP, que podem ser definidos por ipset(8):

  • [!] –match-set setname flag[,flag]… :: Onde as flags formam uma lista separada por vírgula de src e/ou especificações dst e não pode haver mais de seis especificações.

Daí o comando:

# iptables -a forward -m set –match-set test src,dst

Irá corresponder pacotes para os quais (se o tipo fixado for ipportmap) o endereço de origem e de destino da porta pode ser encontrado no conjunto especificado. Se o tipo de conjunto especificado é de única dimensão (ipmap exemplo), então o comando irá corresponder pacotes para os quais o endereço de origem pode ser encontrado no conjunto especificado.

A opção “–match-set” pode ser substituída por “–set” se não colidir com uma opção de outras extensões. O uso de “-m” exige que o módulo ipset do kernel esteja levantado. Como kernels padrões não fornecem ainda, o pacote ipset ou xtables-addons precisa ser instalado.

socket :: Isso corresponde se um socket aberto puder ser encontrado fazendo uma pesquisa de sockets no pacote.

–transparent :: Ignorar sockets não transparentes.

state :: Este módulo, quando combinado com rastreamento de conexão, permite o acesso ao estado de rastreamento de conexão para este pacote.

[!] –state state :: Onde o estado é uma lista separada por vírgulas dos estados de conexão. Estados possíveis são invalid significa que o pacote não pode ser identificado por alguma razão, que inclui falta de memória e erros ICMP que não correspondem a qualquer conexão conhecida. “established” significa que o pacote está associado a uma conexão que viu pacotes em ambas direções, new significa que o pacote começou uma nova conexão, ou de outra forma associado a uma conexão que não viu pacotes em ambos os sentidos e related significa que o pacote está começando uma nova conexão, mas está associado a uma conexão existente, como um ftp de transferência de dados, ou um erro ICMP.

statistic :: Este módulo corresponde pacotes com base em alguma condição estatística. Ele suporta dois modos distintos configuráveis com a opção “–mode”.

As opções suportadas:

  • –mode mode :: Define o modo correspondente da regra correspondente, os modos suportados são “random” e “nth”.
  • –probability p :: Define a probabilidade 0 para 1 de um pacote ser aleatoriamente combinado. Ele só funciona com o modo random.
  • –every n :: Combinar um pacote a cada pacote nth. Ele só funciona com o modo nth (ver também a opção “–packet”).
  • –packet p :: Define o valor inicial do contador (0 <= p <= n-1, padrão 0) para o modo de “nth”.

string :: Este módulo corresponde a uma dada chain usando alguma estratégia de padrões. Ele requer um kernel linux >= 2.6.14.

  • –algo {bm|kmp} :: Seleciona a estratégia padrão de correspondência ((bm = boyer-moore, kmp = knuth-pratt-morris).
  • –from offset :: Define o deslocamento a partir do qual ele começa a verificar qualquer correspondência. Se não for especificado, o padrão é 0.
  • –to offset :: Define o deslocamento a partir do qual ele começa a verificar qualquer correspondência. Se não for especificado, o padrão é o tamanho do pacote.
  • [!] –string pattern :: Coincide com o padrão determinado.
  • [!] –hex-string pattern :: Corresponde ao padrão dado, porém, em notação hexadecimal.

Nota do tradutor: Utilizar strings é interessante como ponto de checagem para permitir ou descartar um pacote. É uma técnica utilizada tanto para segurança como para economia de banda dentro da rede. O iptables checa se a string especificada está dentro do pacote.

Exemplo:

# iptables -a forward -m string –algo bm –string “sexo” -j drop

Nesta regra, ele irá bloquear (drop) o pacote que tiver a string “sexo” na chain forward. A opção “–algo” determina o algoritmo de busca utilizado, “boyer-moore” ou “knuth-pratt-morris”.

A utilização de um ou outro depende da busca que se quer. O “bm” é mais adequado para quando a string procurada se assemelha ao “texto natural” (no caso, em português, logo, depende de onde está vindo o pacote) e faz suas comparações da direita para a esquerda; e o “kmp” é mais adequado para palavras curtas, sendo que ele procura uma palavra dentro de uma cadeia de texto principal e faz suas comparações da esquerda para a direita.

# iptables -a input -m string –string ! “.exe” -j accept

Esta regra somente permite a passagem de pacotes que não contém “.exe” em seu conteúdo.

tcp :: Esta extensão pode ser utilizada se ‘–protocolo tcp’ estiver especificada. Ela oferece as seguintes opções:

  • [!] –source-port,–sport port[:port] :: Porta de origem ou especificação de intervalo de portas. Isso pode ser um nome de serviço ou de um número de porta. Uma faixa também pode ser especificada usando o formato first:last. Se a primeira porta for omitida, “0” é assumido, se a última for omitida, “65535” é assumido. Se a primeira porta é maior do que a segunda, elas serão trocadas. A flag “–sport” é um apelido conveniente para essa opção.
  • [!] –destination-port,–dport port[:port] :: Porta de destino ou especificação de intervalo de portas. A flag –dport é um álias conveniente para essa opção.
  • [!] –tcp-flags mask comp :: Combina quando as flags TCP estão especificadas. O primeiro argumento mask é a flag que devemos examinar, escrito como uma lista separada por vírgulas, e o segundo argumento deve ser uma lista de flags separadas por vírgula. As flags são: syn ack fin rst urg psh all none.

    Daí o comando:

    # iptables -a forward -p tcp –tcp-flags syn,ack,fin,rst syn

    Só irá corresponder pacotes com a flag syn e as flags fin, ack e rst não serão setadas.

  • [!] –syn :: Somente corresponde pacotes TCP com o bit SYN e com os bits RST, ACK e FIN limpos. Esses pacotes são utilizados para solicitar o início da conexão TCP, por exemplo, bloquear esses pacotes em uma interface vai evitar conexões TCP de entrada, mas as conexões TCP de saída não serão afetadas. É equivalente a –tcp-flags syn, rst, ack, fin syn. Se o “!” precede a flag “–syn”, o sentido da opção é invertido.
  • [!] –tcp-option number :: Combina se a opção TCP está setada.

tcpmss :: Combina com o TCP MSS (tamanho máximo do segmento) campo do cabeçalho TCP. Você só pode usar isso em TCP SYN ou SYN/ACK, já que o MSS só é negociado durante o handshake TCP em tempo de inicialização de conexão.

[!] –mss value[:value] :: Corresponde a um dado valor TCP MSS ou intervalo.

time :: Combina se a chegada de pacotes de time/date está dentro de um determinado intervalo. Todas as opções são opcionais, mas serão anded quando especificadas:

  • –datestart yyyy[-mm[-dd[thh[:mm[:ss]]]]]
  • –datestop yyyy[-mm[-dd[thh[:mm[:ss]]]]] :: Somente corresponde durante o tempo determinado, que deve ser em notação iso 8601 “t”. O intervalo de tempo possível é 1970-01-01t00: 00:00 a 2038-01-19t04: 17:07.

    Se “–datestart” ou “–datestop” não estiverem especificados, o padrão será 1970/01/01 e 2038/01/19, respectivamente.

  • –timestart hh:mm[:ss]
  • –timestop hh:mm[:ss] :: Somente corresponde durante o dia determinado. O intervalo de tempo possível é de 00:00:00 a 23:59:59. Zeros à esquerda são permitidos (por exemplo, “06:03”) e será corretamente interpretado como base-10.
  • [!] –monthdays day[,day…] :: Corresponde aos dias do mês. Os valores possíveis são de 1 a 31. Note que especificar 31 não é funciona em meses que não têm um dia 31, o mesmo vale para 28 ou 29 de fevereiro.
  • [!] –weekdays day[,day…] :: Corresponde aos dias da semana. Os valores possíveis são mon, tue, wed, thu, fri, sat, sun, ou valores de 1 a 7, respectivamente. Você também pode usar dois caracteres variantes (mo, tu, etc.)
  • –utc :: Interpreta os tempos indicados para –datestart, –datestop, –timestart e –timestop em utc.
  • –localtz :: Interpreta os tempos indicados para –datestart, –datestop, –timestart e –timestop se for hora do kernel local (padrão).

Exemplos: Para corresponder aos fins de semana, utilize:

-m time –weekdays sa,su

Ou, para combinar com (uma vez) em um bloco de feriado nacional:

-m time –datestart 2007-12-24 –datestop 2007-12-27

Desde que o “datestop” seja atualmente inclusivo, é necessário o datestop a seguir para não coincidir com o primeiro segundo do novo dia:

-m time –datestart 2007-01-01t17:00 –datestop 2007-01-01t23:59:59

Durante a hora do almoço:

-m time –timestart 12:30 –timestop 13:30

A quarta sexta-feira do mês:

-m time –weekdays fr –monthdays 22,23,24,25,26,27,28

Obs.: Note que explora uma determinada propriedade matemática. Não é possível especificar “quarta quinta-feira ou sexta-feira quarta” em uma regra. Somente é possível com várias regras.

Match Extensions (Parte 2)

tos :: Este módulo corresponde ao tipo de 8 bits do campo service no cabeçalho IPv4 (ou seja, incluindo o “precedence” bits) ou o campo priority (também de 8 bits) no cabeçalho IPv6.

  • [!] –tos value[/mask] :: Combina pacotes com o valor ToS dado. Se a máscara for especificada, é logicamente anded com a marca tos antes da comparação.
  • [!] –tos symbol :: Você pode especificar um nome simbólico ao usar a partida tos para IPv4. A lista de nomes reconhecidos tos pode ser obtidas chamando iptables com -m tos -h. Note que isto implica uma máscara de 0x3f, ou seja, todos os bits ecn.

Nota do tradutor: ao utilizar ToS, podemos estabelecer prioridades dos pacotes pelo tipo de serviço, por exemplo, SSH, com isso o ToS torna-se uma forma eficiente de controle de prioridade sobre o tráfego de entrada e saída da sua rede.

Exemplo de uma regra:

# iptables -t mangle -a output -o eth0 -p tcp –dport 22 tos –set-tos 16

Esta regra define que os pacotes emitidos (chain output da tabela mangle saindo pela eth0 na porta 22, porta padrão do SSH) pela máquina através do protocolo SSH terão prioridade sobre os demais pacotes. O número 16 significa “espera mínima” (minimize-delay) e refere-se ao bit ToS.

Linux: Manual do IPtables - Comentários e sugestões de regras

Porém, o ToS não substitui o QoS do roteador. É sempre preferível utilizar o QoS do roteador.

ttl :: Este módulo corresponde ao campo tempo de vida no cabeçalho IP.

  • –ttl-eq ttl :: Corresponde ao valor dado TTL.
  • –ttl-gt ttl :: Corresponde se TTL é maior do que o valor dado TTL.
  • –ttl-lt ttl :: Combina se TTL é menor do que o valor ttl dado.

u32 :: Testa se as quantidades de até 4 bytes extraídos de um pacote tem valores especificados. A especificação do que extrair geralmente é suficiente para localizar dados em deslocamentos de cabeçalhos TCP ou cargas.

  • [!] –u32 tests :: O argumento equivale a um programa em linguagem pequena descrito abaixo.
  • tests := location “=” value | tests “&&” location “=” value
  • value := range | value “,” range
  • range := number | number “:” number

Um único número, n, é interpretado como n:n. O intervalo n:m é interpretado como o intervalo de números de > = n e <= m.

  • location := number | location operator number
  • operator := “&” | “<<” | “>>” | “@”

Os operadores &, <<, >> e && significam o mesmo que na linguagem C. O “=” é realmente um operador de membro de um conjunto e o valor da sintaxe descreve um conjunto. O operador “@” é o que permite mover-se para o próximo cabeçalho e está descrito mais abaixo. Existem atualmente alguns limites artificiais na implementação do tamanho dos testes:

  • Não mais do que 10 de “=” (e 9 “&&” s) no argumento u32.
  • Não mais de 10 faixas (e 9 vírgulas) por valor.
  • Não mais de 10 números (e 9 operadores) por localização.

Para descrever o significado, existem três registros:

  • “a” é do tipo char *, inicialmente, o endereço do cabeçalho IP
  • “b” e “c” são integer de 32 bits unsigned, iniciando em zero.

As instruções são:

number b = number;
c = (*(a+b)<<24) + (*(a+b+1)<<16) + (*(a+b+2)<<8) + *(a+b+3)
&number c = c & number
<< number c = c << number
>> number c = c >> number
@ número a = a + c, em seguida, fazer o número da instrução

Qualquer acesso de memória fora de [skb-> data, skb-> end] faz com que dê falha. Caso contrário, o resultado do cálculo é o valor final de c. Espaço em branco é permitido, mas não exigido. Entretanto, a sintaxe é semelhante ao shell, por isso é uma boa ideia colocar os argumentos entre aspas.

Exemplo:

Coincidir com pacotes IP com tamanho total >= 256
O cabeçalho IP contém um campo de tamanho total em bytes 2-3.

–u32 “0 & 0xffff = 0x100:0xffff”

Leia bytes 0-3

E que, com 0xffff (dando bytes 2-3), e testar se que esteja no intervalo [0x100: 0xffff].

Exemplo (mais realista, portanto, mais complicado):

Coincidir com pacotes ICMP com ICMP tipo 0
Primeiro teste que é um pacote ICMP, byte verdadeira se 9 (protocol) = 1

–u32 “6 & 0xff = 1 && …
Leia bytes 6-9, utilize & para jogar fora bytes 6-8 e comparar o resultado a 1. Teste seguinte, que não é um fragmento (se assim for, pode ser parte de um tal pacote, mas nem sempre podemos contar). Nota: este teste é geralmente necessário se você quiser combinar qualquer coisa além do cabeçalho IP. Os últimos 6 bits do byte 6 e todos byte 7 são 0, se for um pacote completo (não de um fragmento). Alternativamente, você pode permitir primeiros fragmentos apenas testando os últimos 5 bits do byte 6.

… 4 & 0x3fff = 0 && …
Último teste: o primeiro byte após o cabeçalho IP (do tipo) é 0. Aqui temos que usar a sintaxe @. O tamanho do cabeçalho IP (ihl), de 32 bits, é armazenado na metade direita do byte 0 do cabeçalho do IP.

… 0 >> 22 & 0x3c @ 0 >> 24 = 0”
O primeiro 0 significa ler bytes de 0-3; >> 22 significa mudança de 22 bits para a direita. Deslocando 24 bits daria o primeiro byte, portanto, apenas 22 bits são quatro vezes mais que alguns bits. & 3c, em seguida, elimina os dois bits extras no lado direito e os quatro primeiros bits do primeiro byte. Por exemplo, se ihl = 5, então o cabeçalho IP tem 20 (4 x 5) bytes. Neste caso, os bytes 0-1 são (em binário) xxxx0101 yyzzzzzz, >> 22 dá o valor de 10 bits xxxx0101yy e &3c proporciona 010100. @ significa usar esse número como um novo deslocamento para o pacote e lê quatro bytes. Estes são os primeiros 4 bytes do ICMP payload, dos quais o byte 0 é do tipo ICMP. Portanto, nós simplesmente transferimos o valor 24 para a direita do primeiro byte e comparamos o resultado com 0.

Exemplo:

bytes de carga útil de TCP 8-12 é qualquer um de 1, 2, 5 ou 8
Primeiro, testar se o pacote é um pacote TCP (semelhante ao ICMP).

–u32 “6 & 0xff = 6 && …

Em seguida, teste que não é um fragmento (o mesmo que acima).

… 0 >> 22 & 0x3c @ 12 >> 26 & 0x3c @ 8 = 1,2,5,8”
0 >> 22 & 3c acima calcula o número de bytes no cabeçalho IP. @ faz novo deslocamento para o pacote, que é o início do cabeçalho do TCP. O tamanho do cabeçalho do TCP (32 bits) é a metade esquerda do byte 12 do cabeçalho de TCP. A instrução >> 12 26 3c & computa esse tamanho em bytes (semelhante ao cabeçalho IP de antes). “@” faz novo deslocamento, o qual é o começo da carga de TCP. Finalmente, o número 8 lê os bytes 8-12 dos controles de carga útil e compara se o resultado é 1, 2, 5 ou 8.

udp :: Estas extensões podem ser utilizados, se ‘–protocol udp’ estiver especificado. Ele oferece as seguintes opções:

  • [!] –source-port,–sport port[:port] :: Porta de origem ou especificação de intervalo de portas. Consulte a descrição da opção –source-port da extensão TCP para mais detalhes.
  • [!] –destination-port,–dport port[:port] :: Porta de destino ou especificação de intervalo de portas. Consulte a descrição da opção –destination-port da extensão TCP para mais detalhes.

unclean :: Este módulo tem nenhuma opção, mas tenta combinar pacotes que parecem mal formados ou incomuns. Está em fase de teste.

Extensões alvo

 
O iptables pode usar módulos estendidos: a seguir estão incluídos na distribuição padrão.

classify :: Este módulo permite que você defina o “skb->priority value” (e assim, classificar o pacote em uma classe cbq específica).

–set-class major:minor :: Define os valores maior e menor da classe. Os valores são sempre interpretados como hexadecimal mesmo sem o prefixo 0x.

clusterip :: Este módulo permite que você configure um conjunto simples de nós que compartilham um determinado IP e um endereço MAC sem um balanceador de carga explícito. As conexões são estaticamente distribuídas entre os nós do cluster (aglomerado).

  • –new :: Cria um clusterip novo. Você sempre tem que setar isso na primeira regra de um clusterip.
  • –hashmode mode :: Especifica o modo de hash. Tem que ser um dos sourceip, sourceip-sourceport, sourceip-sourceport-destport.
  • –clustermac mac :: Especifica o clusterip do endereço MAC. Tem que ser um endereço de multicast da camada de enlace.
  • –total-nodes num :: Número de nós totais dentro deste cluster.
  • –local-node num :: Número do nó local neste cluster.
  • –hash-init rnd :: Especifica o random seed utilizado para inicialização de hash.

connmark :: Este módulo define o valor de marca netfilter associado a uma conexão. A marca tem 32 bits de tamanho.

  • –set-xmark value[/mask] :: Zera os bits de dados por máscara e valor xor no ctmark.
  • –save-mark [–nfmask nfmask] [–ctmask ctmask] :: Copia a marca do pacote (nfmark) para a marca de conexão (ctmark) usando as máscaras especificadas.

    O valor nfmark novo é determinado como se segue:

    ctmark = (ctmark & ctmask ~) ^ (& nfmark nfmask)

    Ou seja, ctmask define os bits para limpar e nfmask os bits do nfmark em xor no ctmark. Para ctmask e nfmask o padrão é 0xffffffff.

  • –restore-mark [–nfmask nfmask] [–ctmask ctmask] :: Copia a marca da conexão (ctmark) para a marca de pacotes (nfmark) usando as máscaras especificadas.

    O valor ctmark novo é determinado como se segue:

    nfmark = (nfmark & ~ nfmask) ^ (& ctmark ctmask);

    Ou seja, nfmask define quais bits limpar e ctmask define quais bits do ctmark fazem xor em nfmark. Para ctmask e nfmask o padrão é 0xffffffff.

  • –restore-mark :: Só é válido na tabela mangle.

Os mnemônicos a seguir estão disponíveis para “–set-xmark”:

  • –and-mark bits :: Faz um “and do ctmark” com os bits (mnemônico para “–set-xmark 0/invbits”, onde invbits é a negação binária dos bits).
  • –or-mark bits :: Faz um or do ctmark com os bits (mnemônico para “–set-xmark bits/bits”).
  • –xor-mark bits :: Faz um xor do ctmark com os bits (mnemônico para “–set-xmark bits/0”).
  • –set-mark value[/mask] :: Define a marca da conexão. Se uma máscara for especificada, apenas os bits definidos na máscara são modificados.
  • –save-mark [–mask mask] :: Copia a nfmark para a ctmark. Se uma máscara for especificada, apenas os bits são copiados.
  • –restore-mark [–mask mask] :: Copia a ctmark para a nfmark. Se uma máscara for especificada, apenas os bits são copiados. Isso só é válido na tabela mangle.

connsecmark :: Este módulo copia as marcas de segurança dos pacotes para as conexões (se não marcados), e de conexões de volta para os pacotes (também se não marcados). Normalmente é utilizado em conjunto com secmark, só é válido na tabela mangle.

  • –save :: Se o pacote tem uma marcação de segurança, copia para a conexão se a conexão não está marcada.
  • –restore :: Se o pacote não tiver uma marca de segurança e a conexão está feita, copia a marca de segurança da conexão para o pacote.

ct :: O alvo “ct” permite definir parâmetros para um pacote ou para as suas conexões. O alvo atribui um “template” para a entrada de conexão de rastreamento do pacote, que é então utilizado pelo núcleo conntrack ao inicializar uma nova entrada no ct. Este alvo, portanto, só é válida na tabela raw.

  • –notrack :: Desativa o rastreamento de conexão dos pacotes.
  • –helper name :: Use a ajuda identificando a conexão pelo nome. É mais flexível do que utilizar os módulos conntrack helper com portas predefinidas.
  • –ctevents event[,…] :: Apenas gera os eventos conntrack especificados para a conexão. Tipos de eventos possíveis são: : new, related, destroy, reply, assured, protoinfo, helper, mark (refere-se a ctmark, notnfmark), natseqinfo, secmark (ctsecmark).
  • –expevents event[,…] :: Apenas gera os eventos especificados para a conexão. Tipos de eventos possíveis são: new.
  • –zone id :: Atribui o pacote para a zona id e só faz pesquisas nesta zona. Por padrão, os pacotes têm zona 0.

dnat :: Este alvo só é válido na tabela nat, nas chains prerouting e output e chains definidas pelo usuário que são chamadas somente a partir dessas chains. Ele especifica que o endereço de destino do pacote deve ser modificado (e todos os outros pacotes, neste contexto, também serão modificados) e as regras deixam de ser examinadas. É preciso um tipo de opção:

  • –to-destination [ipaddr][-ipaddr][:port[-port]] :: Que pode especificar um novo endereço IP de destino único, uma gama abrangente de endereços IP e, opcionalmente, uma gama de portas (que só são válidas se a regra também especifica -p tcp ou -p udp). Se nenhum intervalo de porta for especificado, então a porta de destino nunca será modificada. Se nenhum endereço IP for especificado, então somente a porta de destino será modificada.

    Em kernels até 2.6.10 você pode adicionar várias opções –to-destination. Para esses kernels, se você especificar mais de um endereço de destino, quer através de um intervalo de endereços onde múltiplas opções “–to-destination”, um simples round-robin (um após o outro no ciclo) com balanceamento de carga ocorre entre esses endereços. kernels posteriores (>= 2.6.11-rc1) não têm mais a capacidade de nat para vários intervalos.

  • –random :: Se a opção –random for usada, então o mapeamento de porta será randomizado (kernel >= 2.6.22).
  • –persistent :: Entrega para um cliente o mesmo source-/destination-address para cada conexão. Substitui o alvo same. O suporte para mapeamentos persistentes está disponível a partir do kernel 2.6.29-rc2.

Nota do tradutor: Com o “dnat” é possível alterar o endereço de destino dos pacotes que combinarem com a regra criada.

iptables -t nat prerouting -i eth0 -j dnat –to 172.16.1.123

Nesta regra, todos os pacotes que entrarem pela interface de rede eth0 terão o endereço de destino alterados para 172.16.1.123.

dscp :: Este alvo permite alterar o valor dos bits DSCP dentro do cabeçalho tos do pacote IPv4. Como manipula um pacote, pode ser utilizado apenas na tabela mangle.

  • –set-dscp value :: Define o campo DSCP para um valor numérico (pode ser hexadecimal ou decimal)
  • –set-dscp-class class :: Define o campo DSCP para a uma classe diffserv.

ecn :: Esse alvo permite contornar seletivamente os blackholes ecn conhecidos. Ele pode ser utilizado apenas na tabela mangle.

  • –ecn-tcp-remove :: Remove todos os bits ECN do cabeçalho TCP. Só pode ser utilizado em conjunto com -p tcp.

log :: Ativa o log do kernel para os pacotes. Quando esta opção está definida em uma regra, o kernel Linux irá mostrar algumas informações sobre todos os pacotes correspondentes (como os campos do cabeçalho IP) através do registro no kernel (onde pode ser lido com dmesg ou syslogd (8)).

Este é um “alvo não-terminante”, isto é, uma regra continua na próxima regra. Então, se você deseja registrar os pacotes que você recusa, use duas regras separadas com os mesmos critérios de correspondência, primeiro usando log, então drop (ou reject).

  • –log-level level :: Nível de log (numérico ou veja syslog.conf (5)).
  • –log-prefix prefix :: Prefixo mensagens de log com o prefixo especificado; até 29 letras, é útil para distinguir mensagens nos logs.
  • –log-tcp-sequence :: Acessa os números de sequência TCP. Este é um risco de segurança se o registro for acessado por usuários.
  • –log-tcp-options :: Acessa as opções do cabeçalho do pacote TCP.
  • –log-ip-options :: Acessa as opções do cabeçalho do pacote IP.
  • –log-uid :: Acessa o userid do processo que gerou o pacote.

Nota do tradutor: uma regra básica para gerar um arquivo de log dos acessos pela porta 22, SSH:

iptables -a input -p tcp –dport 22 -i eth0 -j log –log-prefix “firewall-ssh”

Alterando a porta você tem o log do serviço desejado.

mark :: Este alvo é utilizado para definir o valor do netfilter associado com o pacote. O alvo pode ser utilizado apenas na tabela mangle. Ele pode, por exemplo, ser utilizado em conjunto com o roteamento baseado em fwmark (precisa iproute2). Tem tamanho de 32 bits.

  • –set-xmark value[/mask] :: Zera os bits dados pela máscara e faz um xor com o valor da marca do pacote (“nfmark”). Se a máscara for omitida, 0xffffffff é assumido.
  • –set-mark value[/mask] :: Zera os bits dados pela máscara e faz um or com o valor da marca do pacote. Se a máscara for omitida, 0xffffffff é assumido.

Os mnemônicos a seguir, estão disponíveis:

  • –and-mark bits :: Faz um and da nfmark com os bits (mnemônico para “–set-xmark 0/invbits”, onde “invbits” é a negação binária dos bits).
  • –or-mark bits :: Faz um or da nfmark com os bits (mnemônico para–set-xmark bits/bits).
  • –xor-mark bits :: Faz um xor da nfmark com os bits (mnemônico para–set-xmark bits/o).

masquerade :: Este alvo só é válido na tabela nat na chain postrouting. Ele só deve ser utilizado com IP atribuído dinamicamente (dialup): se você tem um endereço IP estático, você deve usar o alvo snat.

O mascaramento é equivalente a especificar um mapeamento do endereço de IP dos pacotes da interface de saída. Quando a interface estiver desligada a conexão é perdida. Este é o comportamento correto quando a conexão seguinte seja pouco provável que tenha o endereço mesma interface (e, portanto, todas as conexões estabelecidas serão perdidas de qualquer maneira).

É preciso uma opção:

  • –to-ports port[-port] :: Especifica uma faixa de portas de origem, substituindo o padrão snat de seleção heurística de porta (ver acima). Isso só é válido se a regra também especifica -p tcp ou -p udp.
  • –random :: Randomiza o mapeamento da porta de origem (kernel >= 2.6.21).

mirror :: É uma demonstração experimental que inverte a origem e os campos de destino do cabeçalho IP e retransmite o pacote. Só é válido nas chains input, forward e prerouting e nas chains definidas pelo usuário que são chamadas somente a partir dessas chains.

Note que os pacotes de saída não são vistos por qualquer filtragem de pacotes, roteamento de conexões ou nat para evitar loops e outros problemas.

netmap :: Esse alvo permite mapear estaticamente toda uma rede de endereços para outra rede de endereços. Ele só pode ser utilizado a partir de regras na tabela nat.

  • –to address[/mask] :: Endereço de rede para mapear. O endereço resultante será construído da seguinte maneira: todos os bits 1 da máscara são preenchidos a partir do ‘endereço’ novo. Todos os bits zero na máscara são preenchidos a partir do endereço de origem.

nflog :: Este alvo fornece logging dos pacotes. Quando este alvo está definido para uma regra, o kernel do Linux vai passar o pacote para o registro back-end para registrar o pacote.

Isso geralmente é utilizado em combinação com “nfnetlink_log” como back-end de registro, que será o pacote multicast através de um soquete netlink para um grupo específico de multicast.

Processos userspace podem se inscrever para o grupo para receber os pacotes. Como o log, este é um alvo não-terminante, ou seja, a regra atual continua na próxima regra.

  • –nflog-group nlgroup :: Define o grupo de netlink (1 – 2 ^ 32-1) a que os pacotes pertencem (aplicável apenas para nfnetlink_log). O valor padrão é 0.
  • –nflog-prefix prefix :: chain de prefixo para incluir na mensagem de registo, até 64 caracteres, útil para distinguir mensagens nos logs.
  • –nflog-range size :: Número de bytes a serem copiados para o userspace (aplicável apenas para nfnetlink_log). Caso o nfnetlink_log especificar seu próprio range, esta opção o substitui.
  • –nflog-threshold size :: Número fila de pacotes do kernel antes de enviá-los para o userspace (aplicável apenas para nfnetlink_log). Valores mais altos resultam em menos sobrecarga por pacote, mas demora mais até que os pacotes procurem o userspace. O valor padrão é 1.

nfqueue :: Este alvo é uma extensão do alvo “queue”. Ao contrário de queue, ele permite que você coloque um pacote em qualquer fila específica, identificada pelo seu número de fila de 16 bits.

Ele só pode ser utilizado com as versões do kernel 2.6.14 ou acima, uma vez que exige o apoio do kernel nfnetlink_queue. A opção “queue-balance” foi adicionada no linux 2.6.31.

  • –queue-num value :: Isso especifica o número da fila. Números de fila válidos são de 0 a 65535. O valor padrão é 0.
  • –queue-balance value:value :: Isto especifica uma série de filas. Os pacotes são então equilibrados entre as filas de dados. Isso é útil para sistemas multicore: inicia várias instâncias do programa userspace em queues x, x+1, .. x+n and use “–queue-balance x:x+n”. Pacotes pertencentes à mesma conexão são colocados na mesma nfqueue.

notrack :: Este alvo desativa o rastreamento de conexões. Ela pode apenas ser utilizado na tabela raw.

rateest :: O alvo rateest coleta estatísticas, realiza cálculo de estimativa de taxas e salva os resultados para posterior avaliação.

  • –rateest-name name :: Conta os pacotes combinados no pool referido pelo nome, que é de escolha livre.
  • –rateest-interval amount{s|ms|us} :: Intervalo de taxa de medição em segundos, milissegundos ou microssegundos.
  • –rateest-ewmalog value :: Medição da taxa média de tempo constante.

redirect :: Este alvo só é válido na tabela nat nas chains prerouting e output e nas chains definidas pelo usuário que são chamadas somente a partir dessas chains. Ele redireciona o pacote para a própria máquina, alterando o IP de destino para o endereço principal da interface de entrada (pacotes gerados localmente são mapeados para o endereço 127.0.0.1).

  • –to-ports port[-port] :: Especifica uma porta de destino ou intervalo de portas: sem isso a porta de destino nunca é alterada. Isso só é válido se a regra também especifica “-p tcp”, ou “-p udp”.
  • –random :: Se a opção “–random” for usada, então os mapeamentos de portas serão randomizados (kernel >= 2.6.22).

reject :: É utilizado para enviar de volta um pacote de erro em resposta ao pacote combinado: caso contrário, é equivalente a drop por isso é um target terminado, finalizando a regra em execução.

Esse alvo é válido apenas nas chains input, forward e output e nas chains definidas pelo usuário que são chamadas somente a partir dessas chains. A seguinte opção controla a natureza do pacote de erros retornados:

  • –reject-with type :: O tipo de dado pode ser icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited ou icmp-admin-prohibited (*) que retorna a mensagem de erro icmp apropriada (port-unreachable é o padrão).

A opção “tcp-reset” pode ser usada em regras que correspondem apenas ao protocolo TCP: isso faz com que um pacote TCP RST seja enviado de volta. Isto é principalmente útil para bloquear sondagem ident (113/TCP) que frequentemente ocorrem ao enviar e-mail para hosts de correio quebrados (que não vai aceitar o e-mail de qualquer maneira).

(*) Usando icmp-admin-prohibited com kernels que não suportam irá resultar em drop ao invés de reject.

same :: Similar ao snat/dnat dependendo da chain: é preciso um intervalo de endereços (“–to 1.2.3.4-1.2.3.7”) e dá ao cliente o mesmo source-/destination-address para cada conexão.

  • nb :: o alvo dnat com a opção “–persistent” substitui alvo “same”.
  • –to ipaddr[-ipaddr] :: Endereços para mapear a origem. Pode ser especificado mais de uma vez para vários intervalos.
  • –nodst :: Não utiliza IP de destino nos cálculos quando seleciona um novo endereço IP de origem.
  • –random :: O mapeamento de portas será forçosamente randomizado para evitar ataques baseados na previsão de porta (kernel >= 2.6.21).

secmark :: Isto é utilizado para definir o valor da marca de segurança associado com o pacote para uso de subsistemas de segurança, tais como o SELinux. Só é válido na tabela mangle. Tem 32 bits de tamanho.

  • –selctx security_context

set :: Este módulo adiciona e/ou exclui entradas de conjuntos de IP que podem ser definidas pelo ipset (8).

  • –add-set setname flag[,flag…] :: Adiciona o(s) endereço(s)/porta(s) do pacote para os conjuntos.
  • –del-set setname flag[,flag…] :: Apaga o(s) endereço(s)/porta(s) do pacote a partir dos conjuntos onde as flags são especificações src e/ou dst e não pode haver mais do que seis delas.

O uso de “-j” set exige que o kernel tenha suporte para ipset. Como kernels padrões não possuem, o pacote ipset ou xtables-addons precisa ser instalado.

snat :: Este alvo só é válido na tabela nat na chain postrouting. Ele especifica que o endereço de origem do pacote deve ser modificado (e todos os outros pacotes, neste contexto, também serão modificados), e as regras deixam de ser examinadas. É preciso um tipo de opção:

  • –to-source ipaddr[-ipaddr][:port[-port]] :: Que pode especificar um novo endereço IP de origem único, um range abrangente de endereços IP e, opcionalmente, um range de portas (que só é válido se a regra também especifica -p tcp ou -p udp).

    Se nenhum intervalo de porta for especificado, então as portas de origem abaixo de 512 serão mapeadas para outras portas abaixo de 512; aquelas entre 512 e 1023, inclusive, serão mapeadas para portas abaixo de 1024, e outras portas serão mapeadas para portas acima de 1024, inclusive.

    Sempre que possível, nenhuma alteração de porta será feita em kernels até 2.6.10, você pode adicionar várias opções “–to-source”. Para esses kernels, se você especificar mais de um endereço de origem, quer através de um intervalo de endereços ou múltiplas opções “–to-source”, um simples round-robin (um após o outro no ciclo) ocorre entre esses endereços. kernels posteriores (>= 2.6.11-rc1) não têm mais a capacidade de nat para vários intervalos.

  • –random :: Se a opção “–random” for usada, então os mapeamentos de portas serão randomizados (kernel >= 2.6.21).
  • –persistent :: Dá a um cliente o mesmo “source-/destination-address” para cada conexão. Substitui o alvo same. O suporte para mapeamentos persistentes está disponível a partir de 2.6.29-rc2.

Nota do tradutor: Com o snat ( source nat ) é possível alterar o endereço de origem no cabeçalho (header) dos pacotes que combinam com a regra criada.

# iptables -t nat -a postrouting -o eth0 -j snat –to 172.16.1.123

Nesta regra, todos os pacotes que saírem pela interface de rede eth0 terão os endereços de origem alterados para 172.16.1.123.

tcpmss :: Esse alvo permite alterar o valor MSS de pacotes TCP SYN para controlar o tamanho máximo da conexão (geralmente limitando a MTU de sua interface de saída para menos 40 no IPv4 ou 60 para IPv6). É claro, que só pode ser utilizado em conjunto com -p tcp e só é válido na tabela mangle.

Este alvo é utilizado para levar a melhor sobre “isps braindead” mal intencionados, ou para servidores que bloqueiam “icmp fragmentation needed” ou pacotes “icmpv6 packet too big”.

Os sintomas deste problema são que tudo funciona bem a partir do seu GNU/Linux firewall/router, mas as máquinas por trás dele nunca pode trocar pacotes grandes:

  1. Os navegadores da web conectam, mas não recebem dados.
  2. E-mails pequenos funcionam bem, mas e-mails grandes travam.
  3. SSH funciona bem, mas o SCP trava depois do handshaking inicial.

A solução é ativar essa opção e adicionar a seguinte regra na configuração do firewall:

iptables -t mangle -a forward -p tcp –tcp-flags syn,rst syn -j tcpmss –clamp-mss-to-pmtu
–set-mss value

Ela define explicitamente a opção MSS para o valor especificado. Se o MSS do pacote é menor do que o valor, então não vai ser aumentado (de Linux 2.6.25 em diante). Evitar problemas com hosts depende de um MSS adequado.

–clamp-mss-to-pmtu :: O valor MSS é ajustado automaticamente para path_mtu -40 para IPv4 e -60 para IPv6. Isto pode não funcionar como desejado, pois onde existem rotas assimétricas com diferentes caminhos MTU, o kernel utiliza o caminho MTU que iria utilizar para enviar pacotes de si mesmo para endereços IP de origem e destino.

Antes do Linux 2.6.25, apenas o caminho MTU para o endereço IP de destino era considerado para esta opção; kernels subsequentes também consideram o caminho MTU para o endereço IP de origem. Estas opções são mutuamente exclusivas.

tcpoptstrip :: Este alvo tira as opções TCP fora de um pacote TCP (ela vai substituí-las por no-ops) você vai precisar adicionar os parâmetros “-p tcp”.

  • –strip-options option[,option…] :: Tira a(s) opções dada(s). As opções podem ser especificadas pela opção de número do TCP ou pelo nome simbólico.

A lista de opções reconhecidas podem ser obtidas com:

iptables with -j tcpoptstrip -h

tos :: Este módulo define o campo tipo de serviço no cabeçalho IPv4 (incluindo o “precedence” bits) ou define o campo “priority”no cabeçalho IPv6. Note que os tos compartilham os mesmos bits DSCP e ECN. O alvo tos só é válido na tabela mangle.

  • –set-tos value[/mask] :: Zera os bits dados pela máscara e faz um xor nos campos ToS/priority. Se a máscara for omitida, 0xff é assumido.
  • –set-tos symbol :: Especifica um nome simbólico quando utiliza o alvo tos para IPv4. Ele implica uma máscara de 0xff.

A lista de nomes reconhecidos ToS, pode ser obtida pelo:

# iptables with -j tos -h

Os mnemônicos a seguir, estão disponíveis:

  • –and-tos bits :: Faz um and do valor tos com os bits (mnemônico para –set-tos 0/invbits, onde invbits é a negação binária dos bits).
  • –or-tos bits :: Faz um “or” do valor tos com os bits (mnemônico para –set-tos bits/bits).
  • –xor-tos bits :: Faz um “xor” do valor tos com os bits (mnemônico para “–set-tos bits/0”).

tproxy :: Este alvo só é válido na tabela mangle na chain prerouting e nas chains definidas pelo usuário que são chamadas somente a partir desta chain. Ele redireciona o pacote para um socket local sem alterar o cabeçalho do pacote. Pode também alterar o valor da marca que pode então ser usado em regras avançadas de roteamento. Leva três opções:

  • –on-port port :: Especifica uma porta de destino a ser usada. É uma opção desejada, 0 significa que a porta de destino é a mesma que a original. Isso só é válido se a regra também especifica “-p tcp”, ou “-p udp”.
  • –on-ip address :: Especifica um endereço de destino. Por padrão, é o endereço IP da interface de entrada. Isso só é válido se a regra também especificar “-p tcp”, ou “-p udp”.
  • –tproxy-mark value[/mask] :: Marca os pacotes com value/mask. O valor ajustado fwmark pode ser utilizado para roteamento avançado (necessário para o proxy transparente trabalhar, caso contrário estes pacotes serão encaminhados, o que provavelmente não é o que você quer).

trace :: Este alvo marca pacotes para o kernel registrar cada regra com os pacotes que atravessam as tabelas, as chains e as regras (os módulo ipt_log ou ip6t_log são necessários).

Os pacotes são registrados com o prefixo string: “trace: tablename:chainname:type:rulenum” onde o tipo pode ser “rule” para a regra simples, “return” para regra implícita no final de uma chain definida pelo usuário e “policy” para a política construída nas chains. Ele pode apenas ser utilizado na tabela raw.

ttl :: É utilizado para modificar o campo TTL do cabeçalho IPv4. O campo TTL determina quantos saltos (roteadores) que um pacote pode atravessar até o tempo de vida.

Definir ou incrementar o campo TTL pode ser potencialmente muito perigoso por isso deve ser evitado a qualquer custo.

Nunca defina ou incremente o valor dos pacotes que deixam sua rede local!

mangle table.
–ttl-set value – Define o valor TTL para ‘valor’.
–ttl-dec value – Decrementa o valor do campo TTL.
–ttl-inc value – Incrementa o valor do campo TTL.

ulog :: Este alvo fornece o log do userspace dos pacotes. Quando está definido para uma regra, o kernel do Linux será multicast para este pacote através de um soquete netlink.

Um ou mais processos do usuário podem então inscrever vários grupos de multicast e receber os pacotes. Tal como log, este é um “alvo não-terminante”, isto é, a regra atual continua na próxima regra.

  • –ulog-nlgroup nlgroup :: Isto especifica o grupo netlink (1-32) para o qual o pacote é enviado. O valor padrão é 1.
  • –ulog-prefix prefix :: Estabelece o prefixo das mensagens de log; até 32 caracteres, é útil para distinguir mensagens nos logs.
  • –ulog-cprange size :: Número de bytes a serem copiados para o espaço do usuário. O valor de 0 sempre copia o pacote inteiro, independentemente de seu tamanho. O padrão é 0.
  • –ulog-qthreshold size :: Número de pacotes para a fila dentro do kernel. Definir esse valor como, por exemplo, 10, acumula 10 pacotes dentro do kernel e os transmite como uma mensagem netlink multipart para o userspace. O padrão é 1 (para compatibilidade com versões anteriores).

Diagnósticos / Compatibilidade / Autores

Diagnósticos

Várias mensagens de erro são mostradas para os erros padrões. O código de saída é 0 para o funcionamento correto.

Erros que podem ser causados por parâmetros de linha de comandos inválidos causam um código de saída 2 e outros erros causam um código com a saída 1.

Bugs: Bugs? O que é isso? 😉

Bem, você pode querer olhar para: http://bugzilla.netfilter.org/

Compatibilidade com ipchains

Este iptables, é muito semelhante ao ipchains do rusty russell. A principal diferença é que as chains input e output somente são atravessadas pelos pacotes entrando na máquina local e originários do host local, respectivamente.

Por isso, cada pacote somente passa através de uma das três chains (exceto o tráfego de loopback que envolve as chains input e output); anteriormente, um pacote encaminhado iria passar por todos as três.

A outra diferença principal é que “-i” refere-se à interface de entrada e “-o” refere-se à interface de saída e ambas estão disponíveis para os pacotes que entram na chain forward.

As várias formas de nat foram separadas; iptables é um filtro de pacotes puro quando utiliza a tabela “filter” padrão com módulos de extensão opcionais. Isso deve simplificar muito da confusão anterior sobre a combinação de mascaramento de IP e filtragem de pacotes.

Assim, as opções são tratadas de forma diferente:

  • -j masq
  • -m -s
  • -m -l

Existem várias outras mudanças no iptables.

Veja também:

  • iptables-save (8), o iptables-restore (8), ip6tables (8), ip6tables-save (8), ip6tables-restore (8), libipq (3).
  • The packet-filtering-howto details iptables usage for packet filtering, the nat-howto details nat, the netfilter-extensions-howto details the extensions that are not in the standard distribution, and the netfilter-hacking-howto details the netfilter internals.
  • http://www.netfilter.org/

Autores

  • Rusty Russell originally wrote iptables, in early consultation with Michael Neuling.
  • Marc Boucher made rusty abandon ipnatctl by lobbying for a generic packet selection framework in iptables, then wrote the mangle table, the owner match, the mark stuff, and ran around doing cool stuff everywhere.
  • James Morris wrote the tos target, and tos match.
  • Jozsef Kadlecsik wrote the reject target.
  • Harald Welte wrote the ulog and nfqueue target, the new libiptc, as well as the ttl, dscp, ecn matches and targets.
  • The netfilter core team is: Marc Boucher, Martin Josefsson, Yasuyuki Kozakai, Jozsef Kadlecsik, Patrick Mchardy, James Morris, Pablo Neira Ayuso, Harald Welte and Rusty Russell.
  • Man page originally written by Herve Eychenne <rv@wallfire.org>. iptables 1.4.8 iptables(8)

A importância do Linux na Nuvem!

Em abril, Brad Anderson, CVP da Microsoft, escreveu um texto em seu blog “In The Cloud” destacando um recente artigo da revista Linux Pro sobre Linux Integration Services (LIS) e o suporte da Microsoft para profissionais de TI em Linux.

Nas palavras de Anderson, “este artigo da Linux Pro enfatiza o quão importante LIS é para a Microsoft. Ninguém aqui em Redmond é ignorante sobre o fato de que o mundo corporativo é heterogêneo, mas isso não significa que você quer rodar duas infraestruturas de hypervisor completamente diferentes, ou até duas nuvens privadas distintas”.

Leia o artigo completo aqui e você pode seguir Brad no Twitter em @InTheCloudMSFT. Você também pode aprender mais sobre LIS na nossa cobertura do lançamento da versão 3.5 e na entrevista do Open Door Policy com K.Y Srinivasan da Microsoft.

Configurando Streaming Flash TV

A plataforma Flash Streaming surgiu como uma alternativa bem interessante frente ao Windows Media Services, considerando o fato do Flash Player ser customizável e as diversas integrações que podem ser realizadas com outras soluções da Adobe. Segue abaixo tutorial para transmisão ao vivo de áudio e vídeo utilizando o Adobe Flash Media Live Encoder.

1- Baixe o Adobe Flash Media Live Encoder

2- Inicie o Flash Encoder;

3- Todas as opções do Encoder são mostradas em uma única tela.

4- No canto esquerdo, marque a aba “Video” (caso deseje transmitir vídeo) e configure os principais campos abaixo:

– Device: escolha o dispositivo de vídeo
– Format: codec do vídeo (sugerimos ecolher H.264)
– Bit Rate: marque e digite ou selecione a qualidade de transmissão desejada para o vídeo (considerando a realidade no Brasil não recomendamos ultrapassar 256 kbps)

5- Ao lado direito da aba “Video”, marque a aba “Áudio” (caso deseje transmitir áudio) e configure os principais campos:

– Device: escolha o dispositivo de áudio
– Bit Rate: selecione a qualidade de transmissão desejada para o áudio

Obs: lembre-se que a qualidade de transmissão final será a soma da qualidade escolhida do vídeo e a qualidade do áudio. Não recomendamos transmitir acima de 200 kbps, para não comprometer a sua internet e das pessoas que irão assistir a transmissão.

6- No canto direito, marque a opção “Stream to Flash Media Server” e digite os dados fornecidos pela ServerMedia nos campos “FMS URL” e “Stream”. Depois clique em “Connect”, aguarde alguns instantes e clique em seguida em “Start” na parte inferior do painel.

 

Em caso de dúvidas sobre este tutorial entre em contato com nosso suporte técnico, teremos o prazer em ajudá-lo!