nov
23

Aula de Squid

Como prometido, aula de squid em http://www.fix.inf.br/wiki/doku.php?id=squid_sarg. Honestamente, tenho me divertido e aprendido muito compilando este material. Está sendo uma fonte básica de pesquisa, além de um guia prático. As matérias tem sido simples, mas farei atualizações nas aulas para que elas sejam mais abrangentes, como por exemplo, o iptables que ficou só na parte de firewall.

Peço também que me ajudem com as correções do material. Sei que muita coisa não deve estar exatamente como deveria, portanto ficaria grato se vocês me ajudassem na correção.

Como antes, aqui vai um ctrl+v ctrl+c do texto, mas a leitura fica melhor na wiki.

Table of Contents
Conceitos básicos de Squid
Instalando
Um arquivo de configuração básico
Entendendo as configurações
ACLs
Lista de opções das ACLs
HTTP_ACCESS
A Ordem importa
Bloqueando endereços
Autenticação
Delimitando horários
Deixando coisas de fora do squid
Cache local
Proxy Transparente
Referências
Conceitos básicos de Squid

O Squid é um servidor proxy e cache de web. A sua utilização mais comum é a aceleração de acesso web, através de um cache de dados acessados com frequência. Também pode ser utilizado para realizar controle de acesso a internet, impedindo ou liberando o acesso através de ACLs (Listas de Controle de Acesso). Desenvolvido inicialmente para Unix, roda agora também em sistemas windows.

A melhor fonte de informações sobre o squid é a Squid Wiki, do próprio squid: http://wiki.squid-cache.org/SquidFaq/

Instalando

Em distribuições baseadas em redhat, instalaremos o squid com a ferramenta yum:

yum install squid
Em distribuções baseadas em debian, usamos o apt-get:

apt-get install squid

Além dele, precisamos também do pacote httpd-tools.
E precisamos fazer uma alteração no sistema para permitir o redirecionamento de pacotes
Podemos fazer isso da seguinte forma:

echo 1 > /proc/sys/net/ipv4/ip_forward
Ou podemos editar o arquivo /etc/sysctl.conf e mudar a opção net.ipv4.ip_forward = 0 para 1

Um arquivo de configuração básico

O arquivo de configuração fica em /etc/squid/squid.conf por padrão na maioria das distribuições:

#
# Recommended minimum configuration:
#
#Tradução livre do squid.conf do fedora # Regra de exemplo permitindo acesso de sua rede interna
# Adapte ela para o endereço de ip da sua rede, onde a navegação será liberada
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
#
# Configurações recomendadas para permissão de acesso
# Somente permitir acesso ao cachemgr pela localhost
http_access allow localhost manager
http_access deny manager
# Negar acesso a certas portas não seguras
http_access deny !Safe_ports
# Negar conexão a outras portas que não sejam de SSL
http_access deny CONNECT !SSL_ports

#
# Insira suas próprias regras aqui para permitir acesso de seus clientes
#
# Regra de exemplo permitindo acesso de sua rede local
# Adapte para o que for necessário para funcionar na sua rede
http_access allow localnet
http_access allow localhost
# E finalmente, negar todos os outros acessoas a este proxy
http_access deny all
# O Squid normalmente escuta na porta 3128
http_port 3128
# Descomente e ajuste a linha seguinte para adicionar o diretório de cache
cache_dir ufs /var/spool/squid 100 16 256
# Deixe coredumps no primeiro diretório do cache
coredump_dir /var/spool/squid
# Adicione suas próprias entradas de refresh abaixo dessas
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

Entendendo as configurações

ACLs

A tag ACL é a lista de acesso, ou regra, que definimos para o nosso servidor. É através delas que vamos fazer as limitações/permissões de uso. As ACLs do squid são compostas sempre por um par. Uma definição de ACL no estilo

acl nomedaacl tipodaacl opção/localdaacl
Então, uma acl chamada Safe_ports que especifique a porta 80, seria a seguinte.

acl Safe_ports port 80
Esta regra, no momento, não bloqueia nem libera essa porta. Simplesmente diz que temos uma ACL chamada Safe_ports que rege sobre a porta 80. As ACLs são somente as listas de acesso. Depois nós iremos dizer se elas deverão ser liberadas ou não.

Uma mesma ACL pode conter mais de uma informação, como por exemplo:

acl Safe_ports port 80
acl Safe_ports port 3128
Chamamos a mesma ACL duas vezes, mas com valores diferentes.

Lista de opções das ACLs

src: source (client) IP addresses
dst: destination (server) IP addresses
myip: the local IP address of a client's connection
arp: Ethernet (MAC) address matching
srcdomain: source (client) domain name
dstdomain: destination (server) domain name
srcdom_regex: source (client) regular expression pattern matching
dstdom_regex: destination (server) regular expression pattern matching
src_as: source (client) Autonomous System number
dst_as: destination (server) Autonomous System number
peername: name tag assigned to the cache_peer where request is expected to be sent.
time: time of day, and day of week
url_regex: URL regular expression pattern matching
urlpath_regex: URL-path regular expression pattern matching, leaves out the protocol and hostname
port: destination (server) port number
myport: local port number that client connected to
myportname: name tag assigned to the squid listening port that client connected to
proto: transfer protocol (http, ftp, etc)
method: HTTP request method (get, post, etc)
http_status: HTTP response status (200 302 404 etc.)
browser: regular expression pattern matching on the request user-agent header
referer_regex: regular expression pattern matching on the request http-referer header
ident: string matching on the user's name
ident_regex: regular expression pattern matching on the user's name
proxy_auth: user authentication via external processes
proxy_auth_regex: regular expression pattern matching on user authentication via external processes
snmp_community: SNMP community string matching
maxconn: a limit on the maximum number of connections from a single client IP address
max_user_ip: a limit on the maximum number of IP addresses one user can login from
req_mime_type: regular expression pattern matching on the request content-type header
req_header: regular expression pattern matching on a request header content
rep_mime_type: regular expression pattern matching on the reply (downloaded content) content-type header. This is only usable in the http_reply_access directive, not http_access.
rep_header: regular expression pattern matching on a reply header content. This is only usable in the http_reply_access directive, not http_access.
external: lookup via external acl helper defined by external_acl_type
user_cert: match against attributes in a user SSL certificate
ca_cert: match against attributes a users issuing CA SSL certificate
ext_user: match on user= field returned by external acl helper defined by external_acl_type
ext_user_regex: regular expression pattern matching on user= field returned by external acl helper defined by external_acl_type

HTTP_ACCESS

A tag “http_access” é quem define o que será feito com a regra que listamos anteriormente, as ACLs. Ela é quem vai dizer se o acesso será liberado ou bloqueado. Para tanto, devemos utilizar a seguinte forma:

http_access allow/deny nomedaacl
A opção allow ou deny é quem vai dizer se iremos liberar ou negar o acesso a aquela ACL. É possível utilizar o caracter ”!” para realizar uma ACL ao contrário. O seguinte código:

http_access allow Safe_ports
libera o acesso para as portas definidas na ACL Safe_ports. Mas o código:

http_access allow !Safe_ports
Liberar para todas as portas MENOS as definidas em Safe_ports

A Ordem importa

As permissões são lidas na ordem que são colocadas. Se primeiros bloquearmos algo e depois liberarmos, não funcionará. É importante colocar a ordem corretamente. Para isso, mantenha seu arquivo de configuração sempre limpo

Bloqueando endereços

Vamos agora ver como podemos fazer para bloquear sites, baseado em uma lista de sites proibidos.

acl proibidos url_regex "/etc/squid/sitesproibidos"
http_access deny proibidos
Vejamos: Na primeira linha, chamamos uma ACL com nome de “proibidos”. A opção url_regex diz ao squid pesquisar dentro do arquivo /etc/squid/sitesproibidos a lista de endereços que queremos bloquear ou liberar. Na segunda linha, o comando http_access deny nos diz que queremos negar o acesso a esta ACL. Depois, é só criar o arquivo /etc/squid/sitesproibidos e adicionar os endereços que queremos. Lembre-se que o squid é case sensitive, ou seja, ele vai ler os endereços na lista da forma que forem digitados. WWW.GOOGLE.COM é diferente de www.google.com ou WwW.GoOgLe.CoM. Para evitar este detalhe , utilize a opção ”-i” como no exemplo:

acl proibidos url_regex -i "/etc/squid/sitesproibidos"
http_access deny proibidos
O que estiver na lista será bloqueado. Podemos colocar endereços inteiros, ou podemos bloquear sites baseado em uma palavra. Se em nosso /etc/squid/sitesproibidos estiver a seguinte listagem:

www.google.com

www.fix.inf.br

somente os sites www.google.com e www.fix.inf.br serão bloqueados. foo.google.com e bar.fix.inf.br não serão bloqueados.

Mas se colocarmos na nossa lista o seguinte:

google

fix

Todos os sites que contiverem essas palavras serão bloqueados. foo.google.com será bloqueado, assim como google.exemplo.com.br

Autenticação

Uma das outras possibilidades do squid é o bloqueio por usuário. Podemos criar uma lista de logins e senhas, ou integrar com outros métodos, como uma base de dados LDAP ou um servidor mysql. Veremos aqui como montar um sistema de autenticação básico, com uma lista de usuários e senhas em um arquivo de texto. Precisamos adicionar a linha

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
em nosso arquivo /etc/squid/squid.conf se nosso linux for 64 bits e a linha:

auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
em nosso arquivo /etc/squid/squid.conf se nosso linux for 32 bits. A localização do arquivo basic_ncsa_auth pode ser diferente em seu sistema. Utilize um comando como o whereis ou um find para encontrar o arquivo.

Esta linha ativa o sistema de autenticação “basic_ncsa_auth”, com o arquivo /etc/squid/passwd sendo nosso arquivo de usuários e senhas.

Vejamos:

acl todos proxy_auth REQUIRED
http_access allow todos
http_access deny all
Na primeira linha, definimos que uma ACL chamada todos que é de autenticação (proxy_auth). O REQUIRED diz que qualquer usuário autenticado irá se encaixar nessa ACL.
Na segunda linha, o http_access allow todos libera o acesso aos usuários autenticados. Na terceira linha o http_access deny all nega o acesso a todo o resto dos usuários.

O Squid nos permite um controle sobre os usuários que podem ou não acessar a rede, através de ACLs tipo:

acl diretoria proxy_auth usuario1 usuario2 usuario3
Aqui, temos uma acl chamada diretoria, onde serão lidados somente com os usuários chamados usuario1, usuario2 e usuario3.
Podemos ainda, criar um arquivo com esses usuários, assim como criamos um arquivo com sites bloqueados.

acl diretoria proxy_auth "/etc/squid/diretoria"
http_access allow diretoria

Delimitando horários

Agora, iremos limitar o acesso a rede por horário. Que tal deixarmos o acesso aos usuários comuns somente durante o horário comercial?

acl usuarios proxy_auth REQUIRED
acl diretoria proxy_auth "/etc/squid/diretores
acl horariocomercial time 08:00-18:00
http_access allow diretoria
http_access allow usuarios horariocomercial
http_access deny all
Pronto. Definimos a ACL dos usuários, dos diretores e na terceira linha a ACL do horário, dando o nome para ela de “horariocomercial” e definindo ela das 8 até as 18. Depois, liberamos o acesso da diretoria e na quinta linha, liberamos o acesso aos usuários de acordo com a ACL horariocomercial. Finalmente, negamos o resto. Simples, não é?

Deixando coisas de fora do squid

Algumas vezes queremos deixar algum endereço fora do cache. Alguns sites simplesmente funcionam melhor assim. Neste caso, devemos utilizar o código:

acl hotmail dstdomain .hotmail.com
always_direct allow hotmail
Assim, o hotmail.com será acessado diretamente, sem precisar passar pelo cache.

Cache local

O squid usa uma diretório para armazenamento de seu cache de páginas. Para isso, precisamos utilizar a linha “cache_dir” seguido do tipo de armazenamento, diretório a ser usado, número em megabites, do número de diretórios primários criados e depois do número de diretórios secundários. Sendo assim a linha:

cache_dir ufs /var/spool/squid/ 7000 16 256
diz que, o sistema a ser usado é o ufs, o diretório principal é o /var/spool/squid, serão usados 7Gb, serão criados 16 diretórios dentro do /var/spool/squid e mais 256 diretórios dentro de cada um desses 16. Este tipo de armazenamento em diretórios é o padrão do squid e funciona muito bem.

AVISO: Não deixe o squid ocupar todo o espaço do seu disco. Se for usar uma partição separada, use 20% a menos do que o tamanho total dela. Se for no seu disco primário, calcule baseado no taamnho do seu disco e em quanto livre você quer ter.

Proxy Transparente

Algumas vezes queremos deixa o squid transparente, ou seja, com que o usuário nem saiba da sua existência. Chama-se proxy transparente. Assim, o usuário não tem escolha, senão usar o proxy, sem precisar configurar ele no navegador.

Para ativarmos esta opção precisamos adicionar a opção:

http_port 3128 transparent
Já devemos ter uma linha chamada http_port 3128 no squid.conf. Simplesmente iremos adicionar a opção transparent ao lado.

Mas ainda precisamos de mais. Temos que fazer com que todas as requisições que entrem na porta 80 do nosso servidor (já que é a padrão da web) sejam reencaminhadas para a 3128 (evitando assim de alterar as configurações no navegador). Quem fará esse serviço é o iptables, com o comando:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
Lembrando das configurações de iptables, vemos que nessa linha dizemos ao iptables para utilizar a tabela nat, na chain PREROUTING, utilizando a interface eth0(importante notar se essa é a interface usada), no protocolo tcp, na porta 80, para dar um REDIRECT para a porta 3128. Simples, temos nosso proxy transparente agora.

#echo 1 > /proc/sys/net/ipv4/ip_forward Ou, numa maneira mais “elegante”: #sysctl -w net.ipv4.ip_forward=1

Referências

http://www.picoloto.com.br/linux/squid.php

http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch32_:_Controlling_Web_Access_with_Squid

http://wiki.squid-cache.org/

http://wiki.squid-cache.org/SquidFaq/

http://www.mlaureano.org/guias_tutoriais/GuiaInstSquid.htm

nov
21

Aula sobre NFS

Gostaria de compartilhar com vocês algumas informações sobre NFS.  Como a de iptables, as informações estão na wiki, no link http://www.fix.inf.br/wiki/doku.php?id=nfs

Aconselho que leiam por lá, pois a visualização é bem melhor.

 

 

 

Conceitos básicos de NFS

O NFS é um sistema de compartilhamento de arquivos incialmente desenvolvido pela Sun. A sua função principal é a de compartilhar pastas e arquivos em uma rede de um modo transparente ao usuário, para que os mesmos processos que podem ser realizados em uma pasta local sejam realizados em uma pasta remota. O principal arquivo de configuração dele fica em:

/etc/exports

É neste arquivo que ficarão guardados as informações necessárias para o servidor nfs funcionar.

Explicando o arquivo de configuração

O arquivo de configuração é composto de duas colunas. A primeira corresponde a pasta que será compartilhada em rede. A segunda consiste nas configurações que serão utilizadas para esta pasta. Veja o exemplo abaixo:

/mnt/share1 host1.mydomain.com(ro,root_squash)
/mnt/share2 host2.mydomain.com(ro,root_squash)

Este arquivo está definindo a pasta /mnt/share1 e /mnt/share2 como pastas compartilhadas e nos mostrando as opções definidas para ela.

Instalando o NFS

Verifique com o comando (para derivados de redhat)

rpm -q nfs-utils

Se o nfs está instalado em seu computador. Caso não, instale com o comando

yum install nfs-utils

Configurando o NFS

Volte no arquivo de configuração do NFS, em /etc/exports. Editando ele, coloque a pasta que você deseja compartilhar. Ao lado, devemos colocar o endereço de ip ou faixa de ip que queremos que tenha permissão para acessar esta pasta. Pode ser colocado um nome de host ou um endereço ip. E, finalmente, entre parenteses, as permissões. Caso mais de uma, separamos elas por vírgula.

As permissões possíveis podem ser lidas aqui http://nfs.sourceforge.net/nfs-howto/ar01s03.html, mas as mais comuns são:

ro, ReadOnly - somente leitura
rw, ReadandWrite - gravação e leitura
no_root_squash - Por padrão, o acesso feito por um usuário root remoto é configurado como o usuário "nobody" local.
Com esta opção, o usuário root remoto acessa como se fosse o usuário root local. Isto é uma risco a sua segurança. Não ative esta opção em servidores de produção

Um arquivo de configurações de teste ficaria da seguinte forma:

/mnt/share1     192.168.0.0/255.255.255.0(rw)

este arquivo libera o compartilhamento da pasta /mnt/share1, para toda a rede 192.168.0.0 com leitura e escrita.

Aplicando as configurações

Depois de termos criado as configurações desejadas, devemos reiniciar o servidor nfs com o comando:

service nfs-server restart

Clientes de NFS

Para conectar ao servidor NFS, só precisamos utilizar o comando “mount”, que fará todo o trabalho, apontado para o servidor que queremos montar, da seguinte forma:

mount ipdoservidor:/mnt/share1  /mnt

esta linha vai montar a pasta /mnt/share1 do servidor na pasta local /mnt. Veja que precisamos saber quais pastas estão compartilhadas em um servidor para poder montar corretamente. Com a saída do comando mount podemos identificar se a pasta foi montada corretamente. Veja:

localhost:/mnt/share1 on /mnt/montado type nfs4 (rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,
sec=sys,clientaddr=127.0.0.1,minorversion=0,local_lock=none,addr=127.0.0.1)

Referências

nov
21

Aula sobre Iptables

Caros leitores. Gostaria de compartilhar com vocês algum conteúdo sobre iptables, que estou montando aqui:
http://www.fix.inf.br/wiki/doku.php?id=iptables
É um pequeno tutorial/aula sobre iptables. Espero que seja útil. Sugiro que leiam o tutorial dentro da wiki acima, é bem melhor de visualizar e o conteúdo será atualizado. Ainda não encontrei uma boa forma de mostrar direto o conteúdo da página da wiki no wordpress. Caso alguém conheça, por favor me avise.

Table of Contents

Iptables – O que é:
Primeiro comando: Listar regras em uso.
Limpando o iptables
Comandos básicos
Tabelas
Chains
Sintaxe
Primeira Regra
Liberação de portas e protocolos
Liberar SSH
Liberar Porta 80
Bloqueando o restante
Liberando Loopback
Liberando de um ip específico
Deletando regras
Outras possibilidades
Salvando as regras
Referências

Iptables – O que é:

O Iptables é o firewall mais utilizado em todas as distribuições de linux.Outros sistemas utilizam outras implementações de firewall. Existem muitas informações na internet e a documentação do iptables/netfilter é muito grande, sendo ele uma das mais complexas (senão a mais) ferramentasde firewall. De um modo simples, o iptables pode ser utilizado com poucas regras para criar um bom e efetivo firewall para sua rede.

O sistema todo é composto de duas partes. O módulo do kernel netfilter e o aplicativo que controla as regras, chamado iptables. Quem realmente faz a função é o netfilter, mas é comum encontrar referências ao firewall como iptables, já que é o comando usado. Quando um pacote de rede passa pelo netfilter, ele compara as informações com as regras inseridas pelo iptables. Se alguma regra bater com o pacote, ele faz a ação indicada na regra (aceitar, negar, etc) .
Primeiro comando: Listar regras em uso.

Para ir se familiarizando com o iptables, utiliza o comando

iptables -L

Esta opção lista as regras atualmente em uso.

Caso não exista nenhuma regra, o que você deve ver é algo como isso:

Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Caso alguma regra apareça é porque:
1 – Você criou regras anteriores
2 – Sua distribuição de linux já vem com regras como padrão.
Limpando o iptables

No caso do debian/ubuntu, as regras do iptables vem vazias. No caso das distribuições baseadas em redhat como centos e scientific linux, o arquivo /etc/sysconfig/iptables já vem com algumas regras regras. Neste caso, precisamos começar desabilitando todas elas com os comandos:

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

O comando iptables -F limpa todas as regras do iptables e a opção -X limpa todas as chains personalizadas. Utilizamos o mesmo comando para todas as outras tabelas (aqui, nat e mangle). Depois colocamos as políticas padrão para as chains INPUT, FORWARD e OUTPUT com a opção -P

Estes comandos limpam todas as regras do iptables, em sua tabela filter, mangle e nat. Cuidado, este comando pode eliminar regras necessárias para compartilhamento de internet e outros. Verifique suas regras e faça os testes em uma instalação nova.
Comandos básicos

O iptables aceita, dentre vários, estes comandos mais utilizados (direto do help)

-A – Append this rule to a rule chain. Valid chains for what we’re doing are INPUT, FORWARD and OUTPUT, but we mostly deal with INPUT in this tutorial, which affects only incoming traffic.\\
-L – List the current filter rules.\\
-m conntrack – Allow filter rules to match based on connection state. Permits the use of the –ctstate option.\\
–ctstate – Define the list of states for the rule to match on. Valid states are:\\
NEW – The connection has not yet been seen.\\
RELATED – The connection is new, but is related to another connection already permitted.\\
ESTABLISHED – The connection is already established.\\
INVALID – The traffic couldn’t be identified for some reason.\\
-m limit – Require the rule to match only a limited number of times. Allows the use of the –limit option. Useful for limiting logging rules.\\
–limit – The maximum matching rate, given as a number followed by “/second”, “/minute”, “/hour”, or “/day” depending on how often you want the rule to match. If this option is not used and -m limit is used, the default is “3/hour”.\\
-p – The connection protocol used.\\
–dport – The destination port(s) required for this rule. A single port may be given, or a range may be given as start:end, which will match all ports from start to end, inclusive.\\
-j – Jump to the specified target. By default, iptables allows four targets:\\
ACCEPT – Accept the packet and stop processing rules in this chain.\\
REJECT – Reject the packet and notify the sender that we did so, and stop processing rules in this chain.\\
DROP – Silently ignore the packet, and stop processing rules in this chain.\\
LOG – Log the packet, and continue processing more rules in this chain. Allows the use of the –log-prefix and –log-level options.\\
–log-prefix – When logging, put this text before the log message. Use double quotes around the text to use.\\
–log-level – Log using the specified syslog level. 7 is a good choice unless you specifically need something else.\\
-i – Only match if the packet is coming in on the specified interface.\\
-I – Inserts a rule. Takes two options, the chain to insert the rule into, and the rule number it should be.\\
-I INPUT 5 would insert the rule into the INPUT chain and make it the 5th rule in the list.\\
-v – Display more information in the output. Useful for if you have rules that look similar without using -v.\\
-s –source – address[/mask] source specification\\
-d –destination – address[/mask] destination specification\\
-o –out-interface – output name[+] network interface name ([+] for wildcard)\\

Tabelas

o Iptables trabalha com o conceito de tabelas, cada uma com funções diferentes, dependendo do que queremos fazer com o pacote de dados. As três mais comuns são:

FILTER
NAT
MANGLE
Lembrando que quanto não especificamos qual tabela do iptables iremos usar (com o -t) ele assume por padrão que é a filter. Quando limpas as regras anteriormente, tivemos que executar os comandos para várias tabelas, pois por padrão, ele só limpará a tabela FILTER Para que o iptables faça o papel de firewall, a tabela utilizada é a filter, que cuida justamente da filtragem dos pacotes recebidos.
Chains

Cada tabela possue algumas chains, que são associadas a algum tipo de tráfego de dados. Dentro desta tabela FILTER temos 3 chains principais:

INPUT
FORWARD
OUTPUT

Essas chains tratam justamente da entrada, encaminhamento e saida. Quando precisarmos lidar com um pacote, nós iremos verificar a origem e/ou destino dele e falar ao iptables para aplicar a função que queremos (ACCEPT, REJECT, DROP), aceitar ou negar o pacote.
Sintaxe

A sintaxe do iptables

# iptables -t TABLE -A CADEIA REGRAS -j ALVO Onde:

TABLE identifica a tabela (lembrando que se não for usada nenhuma, a FILTER é a padrão. O -t pode ser abstraído nesse caso) CADEIA identifica a cadeia (CHAIN usada, INPUT, OUTPUT) REGRAS compõe as regras de seleção de pacotes no qual o ALVO deve atuar (Se é protocolo TCP ou UDP ou todos, se é uma porta específica ou um grupo de portas, etc) ALVO ação a ser executada (Permitir, bloquear, recusar, registrar, etc)

Como você já deve ter visto também, o iptables assim como o Linux em geral, é case sensitive. Então, o que estiver em maiúsculo precisa estar em maiúsculo e não pode ser colocado em minúsculo.
Primeira Regra

Tendo isso em vista, a primeira coisa que preciamos é liberar no nosso firewall que quando tivermos conexões já estabelecidas, elas possam receber tráfego. Toda conexão no kernel do linux tem um estado. Ela pode ser NOVA, ESTABELECIDA, RELACIONADA, etc.

#iptables -A INPUT -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT

Com este comando, falamos ao iptables para adicionar uma nova regra (-A) dentro da chain INPUT (entrada), ativando a opção de verificação de estado da conexão (-m conntrack), com as seguintes opções de estado (–ctstate ESTABLISHED,RELATED) e que devemos aceitar essas conexões (ACCEPT)

Todas as conexões em nossa máquina tem um estado e a opção -m conntrack nos permite trabalhar com estes estados no iptables. As que utilizamos neste comando são a ESTABLISHED e a RELATED. A ESTABLISHED refere-se a todas as conexões já estabelecidas e a RELATED refere-se as conexões novas mas que são relacionadas a conexões já estabelecidas.

Assim, queremos dizer que todas as conexões que entrarem na nossa máquina que sejam respostas de conexões já estabelecidas ou conexões novas referentes a conexões já estabelecidas devem ser aceitas.
Liberação de portas e protocolos

A partir de agora, iremos começar a trabalhar em nossas regras. Por padrão, um firewall bom deve negar todas as conexões que não forem explicitamente permitidas. Não podemos negar uma por uma, seria impossível listas todas. Por isso, precisamos definir o que queremos liberar e depois bloquear tudo.
Liberar SSH

Começaremos então liberando o acesso a porta 22, que é a porta do servidor SSH, o servidor de acesso remoto. É sempre importante saber qual protocolo o aplicativo que queremos utiliza. Neste caso, é o protocolo TCP. Para descobrir isso é necessário pesquisar na internet ou procurar no manual de utilização do aplicativo.

Então, começaremos criando uma regre para liberar o nosso acesso a porta 22. O comando utilizado é o seguinte:

#iptables -A INPUT -p tcp -i eth0 –dport ssh -j ACCEPT

Explicando: chamamos aqui o iptables, dizendo que queremos adicionar uma regra (-A). Este regra é referente ao protocolo tcp (-p tcp), deve ser aplicada somente na interface eth0 (-i eth0) e tem como porta de destino a porta do ssh (–dport ssh) e finalmente falomos ao iptables que queremos aceitar esta regra (-j ACCEPT). Note que utilizamos a palavra “ssh” no lugar do número da porta do ssh. Se tivessemos colocado 22 teria funcionado também. O ipables aceita algumas palavras no lugar de portas. Você pode verificar quais no arquivo /etc/services
Liberar Porta 80

Ótimo! Agora nosso ssh já está liberado. Outras regras serão bem parecidas com essa. Vejamos o seguinte exemplo. Digamos que queremos agora permitir também o acesso a porta 80 pois temos um servidor web nela.

#iptables -A INPUT -p tcp -i eth0 –dport 80 -j ACCEPT

Bloqueando o restante

Pronto. Nosso firewall agora permite todo o acesso a porta 80 e a porta 22 de entrada. Agora, iremos bloquear todo o resto:

#iptables -A INPUT -j DROP

Com este comando, adicionamos uma regra nova na chain INPUT que nega o acesso a todas as conexões. O iptables uma vez que lê uma regra, obedece ela mesmo que outra regra modifique o comportamento. Uma vez configurada, ela não muda. Sendo assim, a nossa terceira regra vai bloquear todo o acesso de entrada em nosso computador, menos nas portas 80 e 22 porque já foram definidas antes. Digitando iptables -L podemos ver como ficou

# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp — anywhere anywhere tcp dpt:ssh
ACCEPT tcp — anywhere anywhere tcp dpt:www
DROP all — anywhere anywhere

Veja que bloqueamos todo o trafego de entrada, em qualquer interface de rede e permitimos o acesso a 80 e a 22 somente na eth0.Se tivessemos outra interface de rede, ela estaria com toda a sua entrada negada.
Liberando Loopback

Mas esta configuração de iptables tem um grande problema. Ele bloqueou o acesso a nossa interface de loopback também. Isso é ruim, pois muitos programas utilizam ela para suas conexões internas. Sendo assim precisamos adicionar uma regra que libere ela (ou especificar a interface no comando anterior). Mas se colocarmos a regra iptables -A INPUT -i lo – j ACCEPT, ela não teria efeito, pois uma regra anterior já tinha sido definida para ignorar todo o tráfego de rede de entrada e adicionar outra regra não vai mudar isso. Nossa regra precisa vir antes da regra de negar.
Utilizaremos então a opção -I (insert) no lugar da -A . A regra fica assim:

#iptables -I INPUT 4 -i lo -j ACCEPT

A única difereça é que utilizamos o -I e falamos em qual posição da lista queremos que ela fique, no caso, quarta posição. Um iptables -L mostra que a regra está na quarta posição, antes do bloqueio e por isso, efetiva.

iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp — anywhere anywhere tcp dpt:ssh
ACCEPT tcp — anywhere anywhere tcp dpt:www
ACCEPT all — anywhere anywhere
DROP all — anywhere anywhere

====Listando as regras com modo verbose====
Olhando a listagem, vemos que ficou um pouco difícil entender sobre qual interface a regra numero 4 se referencia. Daremos então um outro comando


iptables -L INPUT -v


iptables -L INPUT -v
Chain INPUT (policy ACCEPT 227 packets, 22599 bytes)
pkts bytes target prot opt in out source destination
56 3996 ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
0 0 ACCEPT tcp -- eth0 any anywhere anywhere tcp dpt:ssh
0 0 ACCEPT tcp -- eth0 any anywhere anywhere tcp dpt:http
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 DROP all -- any any anywhere anywhere

Liberando de um ip específico

Agora vamos olhar outra regra, um pouco mais complexa. Aqui nós liberamos todo o tráfego de ssh de entrada. Mas digamos que temos uma máquina com ip fixo e só queremos utilizar este IP para acessar nosso servidor. Usaremos uma opção chamada -s (source, fonte) que nos fala de onde é a origem da conexão, de qual ip ela vem:

#iptables -A INPUT -p tcp -i eth0 -s 192.168.0.1 –dport ssh -j ACCEPT

O comando é igual ao de antes, mas com a adição da opção -s e um ip de origem (192.168.1.1). Poderia ter sido usado também uma rede inteira, com a opção -s 192.168.0.0/24, especificando a máscara 24.
Deletando regras

É possível também deletar uma regra do iptables se soubermos qual a ordem dela. O comando #iptables -L INPUT -n –line-numbers mostra a numeração das linhas das regras de INPUT do iptables.

iptables -L INPUT -n –line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all — 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
2 ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
3 ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4 ACCEPT all — 0.0.0.0/0 0.0.0.0/0
5 DROP all — 0.0.0.0/0 0.0.0.0/0

Sabendo o número, podemos deletar uma regra com a opção iptables -D INPUT «número». Claro que podemos sempre limpar todo o iptables com o -F, mas nem sempre queremos fazer isso. Tentaremos então deletar a regra que dá DROP em todos os pacotes. Ela é a regra de número 5. Então o comando é:

iptables -D INPUT 5
iptables -L
ACCEPT all — anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT tcp — anywhere anywhere tcp dpt:ssh
ACCEPT tcp — anywhere anywhere tcp dpt:http
ACCEPT all — anywhere anywhere

Assim, a linha 5 foi deletada.
Outras possibilidades

Outras opções possíveis são: –sport (source port)porta de origem, caso conheçamos a porta de origem do que queremos bloquear
-p protocolos tcp, udp, icmp ou all para todos os protocolos
-s (source) fonte da conexão com ip ou rede
-d (destination) mesma coisa que o -s, mas com relação ao destino na conexão
-j Possíveis alvos da regra, como ACCEPT, DROP, REJECT. Tanto o DROP como o REJECT negam a coenxão, mas o REJECT manda um retorno avisando que a conexão foi negada, enquanto o DROP simplesmente ignora o pacote.
-i (input interface) interface de entrada
-o (output inteface) interface de saida
Salvando as regras

O iptables limpa suas regras toda vez que o computador é reiniciado. Para que as regras fiquem ativas durante todo o tempo, é preciso adicionar um script que as carregue durante a inicialização do sistema. O arquivo /etc/sysconfig/iptables é lido na inicialização dos sistemas baseados em redhat e o conteúdo do seu script de firewall pode ser adicionado lá.

Uma outra opção é o comando iptables-save. Ele salva as regras do iptables atual em um arquivos que você especificar (ou mostra na tela se não for especificado nada) com o comando #iptables-save > nomedoarquivo. E o comando iptables-restore pode ser utilizado para restaurar as configurações da seguinte forma, iptables-restore < nomedoarquivo. Quando executamos o iptables-save sozinho temos como saída algo parecido: # iptables-save # Generated by iptables-save v1.4.12 on Mon Nov 21 11:12:26 2011 *nat :P REROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [18:1099] :P OSTROUTING ACCEPT [18:1099] COMMIT # Completed on Mon Nov 21 11:12:26 2011 # Generated by iptables-save v1.4.12 on Mon Nov 21 11:12:26 2011 *mangle :P REROUTING ACCEPT [452:636466] :INPUT ACCEPT [452:636466] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [441:100355] :P OSTROUTING ACCEPT [443:100419] COMMIT # Completed on Mon Nov 21 11:12:26 2011 # Generated by iptables-save v1.4.12 on Mon Nov 21 11:12:26 2011 *filter :INPUT ACCEPT [2:4832] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [2:104] -A INPUT -s 192.168.0.1/32 -i eth0 -p tcp -m tcp –dport 22 -j ACCEPT COMMIT # Completed on Mon Nov 21 11:12:26 2011 Para salvarmos estas regras, é preciso direcionar a saída do iptables-save para um arquivo de texto com o comando iptables-save > nomedoarquivo. Será criado o arquivo no local onde você apontou.

Para restaurar as regras, é só rodar o programa ipables-restore. Ele aceita como entrada a saída do iptables-save

#iptables-restore < nomedoarquivo

Assim, é simples criar um script com suas regras personalizadas.
Referências

http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html

https://help.ubuntu.com/community/IptablesHowTo

http://www.thegeekstuff.com/2011/02/iptables-add-rule/

http://ornellas.apanela.com/dokuwiki/pub:pt-br:linuxfwrt

out
30

Promoção de livros de C, Unix e Linux

A OReilly está com uma promoçaõ de 50% de desconto em livros de C, Unix, Linux e outros, em memória a Dennis Ritchie. Vamos honrar a memória dele levando cada vez mais as suas colaborações para o mundo.

http://shop.oreilly.com/category/deals/honor-ritchie.do

out
21

Promoção Dreamhost

A Dreamhost é uma empresa de hospedagem, mas não é uma empresa comum. Na minha experiência, é a melhor empresa de hospedagem. Com um suporte rápido (geralmente meus emails são respondidos em 30 minutos, ou menos) e boas políticas de gerenciamento, a empresa supreende em comparação com várias outras escolhas. Eles querem que você tenha a melhor experiência possível com a hospedagem e fazem isso com sucesso. Uma das possíbilidades deles é um código promocional que quem é associado pode criar para distribuir para outros bônus. Segue para vocês então, o código “FIXDREAMHOST”. Utilizando este código e um pagamento anual, você economiza U$ 97,00 em suas hospedages. É o máximo que dá para receber. Eu poderia ganhar alguma coisa e oferecer um bonus menor, mas prefiro deixar para vocês. Aproveitem.
www.dreamhost.com

out
18

Proxmox VE

O proxmox-ve é uma plataforma de virtualização open source. Utilizei ele um tempo atrás para virtualizar 4 servidores e tudo funcionou muito bem. Com um hardware adequado (Um core 2 quad e 8 GB de ram), está rodando dois apaches, um Tomcat7 e um Jboss 4, todos Paravirtualizados com o OPENVZ. A plataforma do Proxmox roda em cima do Debian e a instalação não poderia ser mais simples. Conta com um sistema de clusterização, o que permite fazer migração online de máquinas virtuais entre os servidores do cluster de forma muito simples.

Mas esses dias precisei fazer uma pequena alteração e não foi tão fácil. Uma das máquinas rodava com uma interface de rede com acesso somente interno e eu precisava fazer dela uma bridge da interface real do servidor para poder ter acesso externo. Após alguma pesquisa, achei uma solução muito simples. Dentro do /etc/vz/conf , temos os arquivos de configuração das máquinas virtuais. Abrindo o arquivo correspondende ao ID da máquina (ex: 101.conf), no final do arquivo, basta adicionar a seguinte linha:
NETIF=”ifname=eth0,bridge=vmbr0,mac=xx:xx:xx:xx:xx:xx,host_ifname=veth101.0,host_mac=xx:xx:xx:xx:xx:xx”

O ifname é o nome da interface de rede física do virtualizador, assim como o bridge é o nome da interface bridge do virtualizador. O mac é o endereço mac que você deseja utiliar em sua máquina virtual. O host_ifname é o nome da interface virtual a ser usada pelo virtualizador para o acesso da sua máquina virtual (cuidado para não conflitar com outra) e o host_mac é o mac da placa de rede física do servidor.
Caso queira já deixar um ip fixo na máquina, a linha IP_ADDRESS=”xxx.xxx.xxx.xxx” pode ser adicionada. Neste caso, na interface do virtualizador irá já aparecer o ip e a interface será setada automaticamente para este endereço.
Religando a máquina virtual, a interface já vai estar disponível.

É algo simples, mas que me ajudou bastante.

out
09

Análise Forense Computacional Clávis

Aproveitando o assunto da ICCYBER, a Clávis está com (poucas) vagas abertas para seu curso de Análise Forense Computacional EAD, com aulas dias 11, 13, 18, 20, 25 e 27 de outubro e 01 de novembro com custo de R$820,00 ou 2 x R$430,00.
Direto do site deles:
“O que é Análise Forense?

Visando enfrentar a verdadeira epidemia de crimes cibernéticos que assola a rede mundial de computadores, torna-se cada vez mais necessário para profissionais de TI e organizações públicas e privadas o domínio de técnicas de análise forense, aplicadas no âmbito computacional.

A análise forense computacional consiste em um conjunto de técnicas para coleta e exame de evidências digitais, reconstrução de dados e ataques, identificação e rastreamento de invasores.”

http://www.clavis.com.br/treinamento-ensino-a-distancia-ead/analise-forense-computacional/index.php

out
07

ICCYBER

Está acontecendo desde o dia 5 até hoje, dia 7, a ICCYBER: Conferência internacional de perícia em crimes cibernéticos, no CentroSul em Florianópolis, SC. A conferência junta especialista em crimes cibernéticos de todo o Brasil e de fora, contando com a presença de empresas, Polícia Federal, Exército, FBI entre outros. Para quem trabalha com segurança digital, o evento é obrigatório. Aguardamos as notícias do evento.

http://www.iccyber.org/

out
07

Retornando

Olá caros leitores. Após um período conturbado, estou de volta com o Blog. Vários comentários ficaram sem resposta, eu sei. Peço desculpas a todos e vamos continuar com as nossas matérias e informações. Acompanhem no twitter as novidades em @marcosflongo.

Obrigado pelos que comentaram e pediram para que continuasse. Estarei mais presente de agora para a frente.

Abraços a todos.

set
15

Novas ferramentas do twitter

O Twitter anunciou na terça feira dia 14/09, um novo site com novas ferramentas, com destaque a inserção de fotos, videos e mapas. O sucesso de outras ferramentas para o twitter, como o twitcam fez com que os donos do twitter repensassem o quanto eles poderiam alcançar de outras formas.

Acompanhe a matéria da revista época.

“Na noite desta terça-feira, o Twitter anunciou, em sua sede em São Francisco, novas ferramentas para o microblog. A grande novidade é uma interface que adiciona fotos, mapas e vídeos aos tweets. Para tanto, a companhia fez parceria com 16 empresas, incluindo TwitPic, Ustream, Justin.tv e YouTube included. O site foi bem reformulado, explorando praticamente o mesmo design, mas com a possibilidade de ter acesso a mais informações ao mesmo tempo.

A tela é dividida em duas. Na barra lateral esquerda, é possível acompanhar a timelime, retweets e menções ao seu usário. Do lado direito da tela, é possível enxergar as fotos e assistir aos vídeos postados, além de visualizar outros tweets do mesmo usuário. Ainda neste lado, com um clique, outra página mostra trending topics, quem seguir, listas, favoritos, seguidores e quem o usuário segue. É tudo mais rápido e ágil. Confira mais no link twitter.com/newtwitter.

Um dos executivos, Biz Stone, disse que o Twitter está ficando melhor a maior. Só neste ano, o uso do Twitter aumentou 250%, atraindo cerca de 370.000 novos usuários por dia. Segundo ele, é uma rede de informação em tempo real.”

http://colunas.epoca.globo.com/bombounaweb/2010/09/14/twitter-anuncia-novo-site/

Posts mais antigos «