terça-feira, 19 de julho de 2011

Manual iptables

:: Criar novo CHAIN
# iptables -t filter -N PING-CHAIN

:: Excluir CHAIN
# iptables -t filter -X PING-CHAIN

:: Utilizar CHAIN criado
# iptables -t filter -p icmp -j PING-CHAIN

:: Alterar Politica do CHAIN
# iptables -t filter -P INPUT DROP

:: Logs para entradas local
# iptables -t filter -A INPUT -j LOG --log-prefix "FW TAB=FILTER CHA=INPUT "

:: Logs para forward na porta 80/TCP
# itpables -f filter -A FOWARD -p tcp --dport 80 -j LOG --log-prefix "FW TAB=FILTER CHA=FORWARD "

:: Liberar acesso local a porta 22/TCP
# iptables -t filter -A INPUT -d localhost -p tcp --dport 22 -j ACCEPT

:: Liberar forward para porta 80/TCP
# iptables -t flter -A FORWARD -s 192.168.0.30 -d 172.17.0.1 -p tcp --dport 80 -j ACCEPT

:: Liberar conexão através de seu estado
# iptables -t filter -A FOWARD -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

:: Utilizar range de IPs
# iptables -t filter -A FORWARD -m iprange --src-range 192.168.0.10-192.168.0.20 -d 200.200.199.199 -j ACCEPT
# iptables -t filter -A FORWARD -s 1921.68.0.1 -m iprange --destination-range 172.17.0.1-172.17.0.3 -j ACCEPT

:: Utilizar Intervalo de Portas
# iptables -t filter -A INPUT -p tcp --dport 1024:65535 -j DROP

:: Utilizar Múltiplas Portas
# iptables-t filter -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

:: Inserir regra entre regras já existentes
# iptables -t filter -I INPUT  1 -j LOG

:: Limitando por MAC Address
# iptables -t filter -A INPUT -m mac --mac-source 00:80:AD:2B:60:1C -j DROP

:: Limitando número de conexões por intervalo temporal (Ex.: 2 por segundo)
# iptables -t filter -A INPUT -p icmp -m limit --limit 2/s -j ACCEPT

:: Realizar MASQUERADE (Geralmente utilizado para IPs dinâmicos)
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

:: Realizar SNAT (NAT de Origem)
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 200.200.199.199

:: Realizar DNAT (Nat de Destino) da porta 80/TCP para porta 80/TCP
# iptables -t nat -A PREROUTING -d 200.200.199.199 -i eth1 -p tcp --dport 80 -j DNAT --to-destination 172.17.0.1

:: Realizar DNAT da porta 80/TCP para 8080/TCP
# iptables -t nat -A PREROUTING -d 200.200.199.199 -i eth1 -p tcp --dport 80 -j DNAT --to-destination 172.17.0.1:8080

:: Visualizar Regras
# iptables -t filter -nvL
# iptables -t filter -nL FORWARD --line-number
# iptables -t nat -nvL --line-number

:: Limpar Regras
# iptables -t filter -F
# iptables -t filter -F FORWARD

:: Excluir Regras (Forma 1 --line-number)
# iptables -t filter-nvL --line-number
Verificar o número da linha que deseja excluir, depois:
# iptables -t filter -D <line-number>
Onde:
line-number: número da linha onde está a regra que será excluída

:: Excluir Regras (Forma 2 -D)
Digitar o mesmo comando para inserção da Regra, mas ao invés de utilizar o parâmetro -A (Append) utilizar o parâmetro -D (Delete)
# itpables -t filter -D -s localhost -j DROP

quarta-feira, 13 de julho de 2011

Monitorando as eths com mrtg

Existem maneiras bem simples de monitorar as eth de um servidor Linux, uma delas é utilizando o mrtg, procedimento que veremos a seguir.

:: Instalando pacotes necessários
# apt-get install mrtg apache2

:: Configurando o mrtg
1) Crie o seguinte script que fará a leitura do arquivo /proc/net/dev. Este arquivo contêm informações sobre as estatísticas de tráfego em cada eth. O script fará a leitura da quantidade de bytes recebidos e enviados e terá como saída estes valores, um em cada linha.

# vim /root/getStats.sh

#!/bin/sh
awk '
/'$1':/ {
$0=substr($0,index($0,":")+1);
print $1;print $9
}
' /proc/net/dev

2) Transforme este arquivo como executável
# chmod +x /root/getStats.sh

3) Crie o arquivo de configuração para o mrtg
# vim /root/mrtg.conf

WorkDir: /var/www/mrtg

Target[eth0]: `/root/getStats.sh eth0`
Title[eth0]:"Trafic on eth0"
MaxBytes[eth0]:100000
PageTop[eth0]: <h2>Trafic on eth0</h2>
Options[eth0]: growright,bits

4) Crie um script que irá executar o mrtg
# vim /root/run_mrtg.sh

#!/bin/bash
env LANG=C /usr/bin/mrtg /root/mrtg.conf

5) Transforme este arquivo em executável
# chmod +x /root/run_mrtg.sh

:: Demais configurações
1) Criar o diretório para o mrtg gerar as páginas e os gráficos
# mdkir /var/www/mrtg

2) Incluir o script no contrab para executar a cada 5 min
# crontab –e

*/5 * * * * /root/run_mrtg.sh

:: Executando manualmente
# env LANG=C /usr/bin/mrtg /root/mrtg.conf

Obs.: É normal surgirem erros durante as três primeiras execuções.

:: Visualizando o trabalho
Aponte o navegador para http://<ip_servidor>/mrtg/eth0.html

Aguarde mais 5 minutos e verifique que o gráfico começa ser gerado.

Você pode restringir o acesso a estas informações através do próprio apache. Dê uma olhada no artigo Configurar Auntenticação Básica no Apache.

Até +

sexta-feira, 1 de julho de 2011

Múltiplas Instâncias do MySQL

O MySQL server possui um recurso interesse de permitir a carga de várias instâncias no mesmo servidor (realizado através do mysqld_multi), permitindo assim que você possa distribuir a carga de acesso em seus ESQUEMAS DE BANCO através destas várias portas, como por exemplo a 3306/TCP (porta padrão MySQL) e a 3307/TCP. Abaixo segue um pequeno manual de como as configurações necessárias, lembrando que esta configuração foi aplicada na Distro Debian versão 6.

:: Instalar o MySQL
# apt-get install mysql-server
# /etc/init.d/mysql stop

:: Configurando o Ambiente
# mkdir /mysql && mkdir /mysql/socket && mkdir /mysql/pids && mkdir /mysql/3306 && mkdir /mysql/3307
# chown mysql:mysql /mysql –R

:: Instalando a Base Padrão do MySQL
# mysql_install_db --basedir=/usr/ --datadir=/mysql/3306
# mysql_install_db --basedir=/usr/ --datadir=/mysql/3307

:: Criando o arquivo de configuração
# vim /mysql/my.cnf

[mysqld_multi]
mysqld           = /usr/bin/mysqld_safe
mysqladmin       = /usr/bin/mysqladmin
user             = multi
password         = multi

[mysqld1]
socket           = /mysql/socket/mysql1.sock
port             = 3306
pid-file         = /mysql/pids/pidfile1.pid
datadir          = /mysql/data/3306
language         = /usr/share/mysql/english
user             = multi

[mysqld2]
socket          = /mysql/socket/mysql2.sock
port            = 3307
pid-file        = /mysql/pids/pidfile2.pid
datadir         = /mysql/data/3307
language        = /usr/share/mysql/english
user            = multi

Obs.: mysqld# informa o número do Grupo MySQL; user e password são dados do usuário que possui permissão de realizar SHUTDOWN do MySQL.

:: Conectando as bases e configurando as permissões
O usuário e a senha padrão das bases récem criadas são:

Usuário: root
Senha: {vazia/nenhuma/semNada}

# mysql –u root –p –S /mysql/socket/mysql1.sock
mysql> GRANT SHUTDOWN ON *.* TO multi@localhost IDENTIFIED BY 'multi';
mysql> FLUSH PRIVILEGES;
mysql> quit

# mysql –u root –p –S /mysql/socket/mysql2.sock
mysql> GRANT SHUTDOWN ON *.* TO multi@localhost IDENTIFIED BY 'multi';
mysql> FLUSH PRIVILEGES;
mysql> quit

Nota: Observe que realizamos a conexão com o MySQL através do SOCKET e não da PORTA.

:: Subindo as Instâncias
# mysqld_multi –defaults-file=/mysql/my.cnf start 1
# mysqld_multi –defaults-file=/mysql/my.cnf start 2

Obs.: O parâmetro 1 no final do comando indica qual instância será iniciada. Ex.: [mysqld1]. Para subir todas as instâncias ao mesmo tempo basta remover o número do GRUPO no final do comando. Os logs do mysqld_multi são gravados /var/log/syslog.

:: Checando a carga
# mysqld_multi –defaults-file=/mysql/my.cnf report 1
# mysqld_multi –defaults-file=/mysql/my.cnf report 2

ou, para todas

# mysqld_multi –defaults-file=/mysql/my.cnf report

ou

# netstat –na | grep /mysql/socket

:: Shutdown das Instâncias
# mysqld_multi –defaults-file=/mysql/my.cnf stop 1
# mysqld_multi –defaults-file=/mysql/my.cnf stop 2

ou, para todas:

# mysqld_multi –defaults-file=/mysql/my.cnf stop

:: Configurando o Startup Automático
Como realizamos a instalação do mysql via apt-get, todas as configurações para o startup automático foram criadas, faltando apenas a alteração do arquivo /etc/init.d/mysql para atender nossas necessidades. Então:
# vim /etc/init.d/mysql

#!/bin/bash

case "${1:-''}" in
  'start')
        mysqld_multi --defaults-file=/mysql/my.cnf start
        ;;

  'stop')
        mysqld_multi --defaults-file=/mysql/my.cnf stop
        ;;

  'restart')
        stop
        start
        ;;

  'status')
        mysqld_multi --defaults-file=/mysql/my.cnf report
        ;;

  *)
        echo "Usage: $SELF start|stop|restart|status"
        exit 1
        ;;
esac

:: Pontos Importantes
Mesmo configurando outro arquivo my.cnf a inicialização do MySQL lê os parâmetros de configuração do arquivo /etc/mysql/my.cnf, então para liberar acesso as conexões remotas não se esqueça de comentar a linha:

[...]
# bind-address          = 127.0.0.1
[...]

Para acessar o MySQL através da porta devemos também alterar este arquivo, informado em qual socket queremos realizar a conexão, assim fiz as seguintes alterações na seção  [cliente]:

[...]
[client]
port            = 3306
socket          = /mysql/socket/mysql1.sock
# port          = 3307
# socket        = /mysql/socket/mysql2.sock
[...]

Desta forma você pode adicionar/remover o comentário de qual instância será realizada a conexão e acessar através do comando:

# mysql -u root -p

Você pode consultar a documentação do mysqld_multi  acessando http://dev.mysql.com/doc/refman/5.0/en/mysqld-multi.html ou # man mysqld_multi

Até a próxima.