sexta-feira, 6 de fevereiro de 2015

Configuração de failover de links de internet

#!/bin/bash

#---------------------------#
# CONFIGURAÇÃO DOS GATEWAYS #
#---------------------------#

GW1=10.0.2.2
GW2=192.168.1.1
LOG=/root/rc.firewall.log

#------------------------------#
# INÍCIO DA FUNÇÃO DE FAILOVER #
#------------------------------#

# Aqui optei em por uma função para deixar a estrutura do
# script mais organizada e legível. É de suma importância
# que você esteja familiarizado com o shell script

failover ()
{

# Criação de um loop infinito para testar a disponibilidade
# dos links de internet

while [ 1 ]
do

# Altera sempre para o gateway padrão dentro da tabela
# main de roteamento, ou seja, quando o link primário voltar,
# automáticamente a navegação volta para este

/sbin/ip route replace default via $GW1

# Neste for, o comando dig retornará os dois IPs relacionados
# ao site do UOL. Você poderia por qualquer site aí, porém o UOL
# retorna dois IPs que serão utilizados pelo script para saber
# se o link de internet principal está fora

for i in `dig +short uol.com.br`
do

# Verificando a comunicação do link de internet

        /bin/ping -c 1 $i
done

# Caso o resultado do comando anterior seja 0 (zero), o link
# de internet principal está ok. Se for 1 (um) houve falha no comando
# deduzindo assim ausência de conexão. Quem vai determinar isso é o
# comando echo $?. Mais abaixo, haverá um if para testar as condições

STATUS_CMD_LINK=`echo $?`

if [ $STATUS_CMD_LINK -eq 0 ]; then

# Caso haja sucesso no teste do comando do ping
# as regras para o compartilhamento de internet serão inseridas

        /sbin/iptables -F
        /sbin/iptables -t nat -F

        /sbin/modprobe iptable_nat
        echo 1 > /proc/sys/net/ipv4/ip_forward
        /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
else

# Se o link falhar, os comandos mais abaixo farão a limpeza
# das regras de iptables e irão configurar o segundo link de internet
# e será criado um arquivo de log informando quando houve a queda

        echo "_________________________" >> $LOG
        echo " " >> $LOG
        echo "# LINK SECUNDARIO ATIVO.: `date +%d/%m/%y-%H:%M:%S`">> $LOG
        echo " " >> $LOG
        echo "_________________________" >> $LOG

                /sbin/ip route replace default via $GW2

                /sbin/iptables -F
                /sbin/iptables -t nat -F

                /sbin/modprobe iptable_nat
                echo 1 > /proc/sys/net/ipv4/ip_forward
                /sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

fi

# A cada 2 minutos (120 segundos) será feito um teste no link
# principal para constar se o mesmo encontra-se no ar.

sleep 120

done
}

####### CHAMA A FUNÇÃO ########

failover

Dicas rápidas para linha de comando!

#1 - ASSISTA STAR WARS EM MODO ASCII

Dê o seguinte comando no shell:
  $telnet towel.blinkenlights.nl
Agora é só curtir o filme. :D

#2 - DESCUBRA SEU IP EXTERNO PELA LINHA DE COMANDO

De vez em sempre precisamos saber o nosso IP dinâmico externo fornecido pela operadora. Existem N formas de fazer isso. Aqui vou passar somente algumas dicas para a linha de comando, pois é a forma que julgo mais rápida, até mais rápida do que ter de acessar a página de configuração do roteador/modem para consultar o IP adquirido.
  • Usando wget: (utilize qualquer uma das opções, encontre a que você achar mais eficiente)
      $wget -qO - icanhazip.com
      $wget -qO - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
      $wget -qO - ifconfig.me
      $wget -qO - ip.appspot.com
      $wget http://ipecho.net/plain -O - -q ; echo
    
  • Usando curl: (utilize qualquer uma das opções, encontre a que você achar mais eficiente)
      $curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
      $curl -s checkip.dyndns.org | grep -Eo '[0-9\.]+'
      $curl -s http://checkip.dyndns.org/ | grep -o "[[:digit:].]\+"
      $curl -s monip.org | iconv -f iso-8859-1 | sed -n 's/.*IP : \([0-9.]*\).*/\1/p'
      $curl ifconfig.me
      $curl ipecho.net/plain
      $curl icanhazip.com
      $curl ipv4.icanhazip.com (explicitamente evoca o IPv4)
      $curl ipv6.icanhazip.com (explicitamente evoca o IPv6)
      $curl curlmyip.com
      #curl l2.io/ip
      $curl ip.appspot.com
      $curl ifconfig.me/ip
      $curl eth0.me
    
  • Com JSON caso você queira:
      $curl httpbin.org/ip
      $curl wtfismyip.com/json
    
  • Usando dig:
      $dig +short myip.opendns.com @resolver1.opendns.com
    
  • Usando lynx:
      $lynx -dump checkip.dyndns.org | grep 'Current IP Address:'
      $lynx -dump eth0.me
      $lynx --dump monip.org | grep 'IP'
    
    Não vou me prolongar mais nesta parte, com oeu disse: EXISTEM "N" MANEIRAS PARA SE CHEGAR AO MESMO RESULTADO! Cabe a você escolher a que achar melhor. Faça alterações nos comandos, faça suas experiências, adapte-os. Basta olhar na lista e verá que exitem várias adaptações e modificações para um mesmo comando principal. O que influencia no final é sua escolha. Finalizando esta parte, indico uma última alternativa: Quem usa Debian/Ubuntu pode instalar, caso já não tenha instalado, o pequeno programa miniupnpc se o seu roteador/modem tiver suporte para UPnP. Depois de instalado é só executar:
      $upnpc -s | grep ^ExternalIPAddress | cut -c21-
    
    Esse comando fará o mesmo que todos os outros indicados nesta seção: te mostrará seu IP dinâmico externo.

Dica

Você pode criar um shell script simples com algum dos comandos acima para tornar o processo ainda mais rápido. Exemplo
  #!/bin/bash
  
  #Cria váriável e atribui valor
  MYDINIPADDRESS="`curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'`"
  
  echo "\n O seu endereço IP externo é: $MYDINIPADDRESS"
Salve o arquivo (de preferência coloque a extensão .sh), torne-o executáve alterando suas permissões e depois é só executar.

#3 - EXTRAINDO TEXTO PURO DE ARQUIVOS HTML

Certa vez precisei extrair texto puro de um arquivo html. Encontrei várias opções de conversores e etc, mas a maneira mais rápida e eficaz para mim foi utilizando o lynx.
Basta executar o comando:
  $lynx --dump arquivo.html > arquivo.txt
Funciona também com arquivos PHP

#4 - UM POUCO DE CURL

Alguns usos úteis do curl:
  • Baixando arquivos:
      $curl -o nome_arquivo_local http://url_direta_para_o_arquivo
    
    Este comando funciona mesmo com binários, desde que você tenha o link direto para o arquivo
  • Baixando/Upando arquivos de/para servidores FTP:
      $curl -u ftpuser:ftppass -O ftp://diretório_do_servidor/nome_do_arquivo
    
    O comando acima baixa o arquivo e salva no diretório local
      $curl -u ftpuser:ftppass -O ftp://diretório_do_servidor/outro_diretório/
    
    O comando acima lista todo o conteúdo existente em outro_diretório
      $curl -u ftpuser:ftppass -T arquivo.txt ftp://ftp.algumserver.org
    
    O comando acima upará o arquivo.txt para o servidor
      $curl -u ftpuser:ftppass -T "{arquivo1,arquivo2}"  ftp://ftp.algumserver.org
    
    O curl permite upar vários arquivos de uma vez, exatamente como feito no exemplo acima. Você também pode utilizar curingas, como no comando abaixo, onde todos arquivos que satisfazerem a expressão serão baixados:
      $curl   ftp://ftp.server.org/downloads/linux/[a-z]/
    
    O curl é possui grande poder e versatilidade (aliás, todo o Linux é assim :D), os comandos aqui foram apenas uma simples mostra. Não vou aprofundar ou então deixar de ser "Dicas rápidas para linha de comando!"

#5 - COMANDOS ÚTEIS

  • Testando se uma porta está aberta com o comando echo:
      $echo >/dev/tcp/xxx.xxx.xxx.xxx/53 && echo "open"
    
    No lugar do xxx.xxx.xxx.xxx coloque o endereço IP que deseja testar
  • Criando senhas aleatórias:
      < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-10};echo;
    
    Esta senha possui 10 caracteres. Altere a quantidade de caracteres desejados editando o comando em: {1:-10}
  • Exibir nome de dono do arquivo ou diretório:
      $stat -c %U arquivo.txt
    
  • Exibindo o IP local:
      $ifconfig | grep "inet end.:" | awk '{print $3}' | grep -v '127.0.0.1' | cut -f2 -d:
    
    Este comando pode não funcionar em sua máquina dependendo do sistema e configuração. Se não funcionar você deve efetuar as devidas alterações no mesmo. Ex.: seu sistema pode estar em inglês, neste caso, "grep "inet end.:"" deve ser alterado para "grep "inet addr:"", etc, etc. Existe um comando mais rápido: "$ip addr show". Minha intenção foi mais uma vez demonstrar como existem vários caminhos para se chegar ao mesmo resultado.
  • Star Wars DNS
      $traceroute 216.81.59.173
    
    O comando acima te dará o traceroute de Star Wars.. Não entendeu? Execute.
      $( seq 1 8 200 ; seq 6 8 200 ) | sort -n | xargs -I{} -n 1 dig +short -x 206.214.251.{}
    
    Acima: Star Wars Episodio IV em DNS reverso 
fonte:
http://www.dicas-l.com.br/arquivo/dicas_rapidas_para_linha_de_comando.php#.VNSaqzVVKlM