{"id":4121,"date":"2015-07-30T14:20:49","date_gmt":"2015-07-30T17:20:49","guid":{"rendered":"https:\/\/www.viazap.com.br\/?p=4121"},"modified":"2015-07-29T11:22:32","modified_gmt":"2015-07-29T14:22:32","slug":"redundancia-de-link-de-internet","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=4121","title":{"rendered":"REDUND\u00c2NCIA DE LINK DE INTERNET"},"content":{"rendered":"<h1>DESCRI\u00c7\u00c3O DO SCRIPT<\/h1>\n<p>&nbsp;<\/p>\n<div>Pessoal,<\/p>\n<p>Eu comecei a escrever scripts h\u00e1 muito pouco tempo, ent\u00e3o, n\u00e3o sou muito bom em faz\u00ea-los, sou iniciante nessa \u00e1rea, portanto, podem haver coisas que voc\u00eas saibam fazer diferente e melhor.<\/p>\n<p>Este script est\u00e1 funcionando perfeitamente nesse cliente, por\u00e9m, caso voc\u00eas tenham novas ideias, novas formas de fazer as fun\u00e7\u00f5es e processos aqui apresentados, conto com a ajuda e colabora\u00e7\u00e3o de voc\u00eas a fim de melhorar e aprimorar esse script.<\/p>\n<p>Espero ajudar quem um dia vir a ter a mesma necessidade que eu tive.<\/p>\n<p>Este script foi constru\u00eddo para suprir a necessidade de ter alta disponibilidade de internet. O mesmo est\u00e1 rodando em um <em>servidor de firewall<\/em> (CentOS 5).<\/p>\n<p>O script \u00e9 divido em dois arquivos, o <em>link_rendundante<\/em> e o <em>monitor_link<\/em>:<\/p>\n<ul>\n<li>link_redundante &#8211; esse arquivo cont\u00e9m todas as fun\u00e7\u00f5es e a l\u00f3gica do script.<\/li>\n<li>monitor_link &#8211; esse arquivo \u00e9 o daemon, que roda e monitora o arquivo link_redundante.<\/li>\n<\/ul>\n<p><!--more--><br \/>\nObs.: lembre-se de dar permiss\u00e3o de execu\u00e7\u00e3o aos scripts:<\/p>\n<p><strong># chmod +x link_redundate<\/strong><br \/>\n<strong># chmod +x monitor_link<\/strong><\/p>\n<p>Segue abaixo o script link_redundante. O mesmo dever\u00e1 estar localizado em <em>\/etc\/init.d\/link_redundante<\/em>:<\/p>\n<pre class=\"prettyprint\">#===============================================================================\r\n#!\/bin\/bash\r\n#===============================================================================\r\n# @author Edir Bonametti\r\n# @since 2015-07-03\r\n# @version 1.0\r\n# Description: Este script foi desenvolvido com o intuito de monitorar o link\r\n# de internet, e realizar a troca do gateway em caso de falha do link principal.\r\n#===============================================================================\r\n#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n# Modo de Usar:\r\n#\r\n# Existe um daemon que roda e monitora esse script, o mesmo esta localizado em\r\n#\r\n# \/etc\/init.d\/monitor_link  ( status, stop, start, restart)\r\n#\r\n# Esse daemon, executa a fun\u00e7\u00e3o monitor, que faz a verifica\u00e7\u00e3o de estado de\r\n# link a cada 10 segundos.\r\n#\r\n#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n\r\n# In\u00edcio do Script (Declara\u00e7\u00e3o das Vari\u00e1veis)\r\n\r\n# Verifica\u00e7\u00e3o de qual gateway est\u00e1 ativado na tabela de roteamento.\r\nGWUP=`ip route show | grep ^default | cut -d \" \" -f 3`\r\n\r\n# Gateway Principal\r\nGW1=&lt;IP DO GATEWAY PRINCIPAL&gt;\r\n\r\n# Gateway backup\r\nGW2=&lt;IP DO GATEWAY SECUND\u00c1RIO&gt;\r\n\r\n#Interface da NET\r\nINTNET=eth2\r\n\r\n#Interface Embratel\r\nINTEBT=eth3\r\n\r\n# IP de teste de conex\u00e3o\r\nIPTESTE=8.8.8.8\r\n\r\n# Arquivo de log\r\nLOG=\/var\/log\/redundancia.log\r\n\r\nCOMANDO=$1\r\nTEMPO=$2\r\n\r\n# Fun\u00e7\u00e3o que gera os logs\r\nfunction log() {\r\n        MSG=\"[`date`] $@\"\r\n        echo $MSG &gt;&gt; $LOG\r\n}\r\n\r\n# Fun\u00e7\u00e3o utilizada para testar a conectividade do link Principal (NET)\r\n function testa_NET () {\r\n        route add $IPTESTE gw $GW1 # Adiciona rota para sair pelo link NET\r\n        ping -I $INTNET $IPTESTE -c 10 -A &gt; \/dev\/null # Pinga o IP de teste\r\n        pingok=$? # Guarda o retorno do comando anterior.\r\n        route del $IPTESTE gw $GW1 # Remove a rota do IP de teste\r\n        [ $pingok -eq 0 ] &amp;&amp; return 0 || return 1 # Retorna 0 se link NET OK OU 1 se N\u00e3o OK\r\n}\r\n# Fun\u00e7\u00e3o para ativar o link 1 (NET)\r\nfunction ativa_link1() {\r\n        log \"Iniciando link Principal...\"\r\n        add_GW_NET # Chama a funcao add_GW_NET\r\n}\r\n# Fun\u00e7\u00e3o que adiciona rota para GATEWAY (NET)\r\nfunction add_GW_NET() {\r\n        log \"Removendo Rota da Embratel\"\r\n        route del default gw $GW2 # Remove rota para Embratel caso ela exista.\r\n        log \"Adicionando Rota para a NET\"\r\n        route add default gw $GW1 # Adiciona rota para NET\r\n}\r\n# Fun\u00e7\u00e3o que desativa link 1\r\nfunction desativa_link1 () {\r\n        #log \"Removendo Rota da NET\"\r\n        route del default gw $GW1 # Remove gateway do link 1\r\n}\r\n# Fun\u00e7\u00e3o que ativa link 2\r\nfunction ativa_link2() {\r\n        desativa_link1 # Chama fun\u00e7\u00e3o desativa_link1\r\n        route add default gw $GW2 # Adiciona rota para o link 2\r\n ping -I $INTEBT $IPTESTE -c 5 -A &gt; \/dev\/null # Testa conectividade do link Embratel\r\n        if [[ $? -eq 0 ]]; then # Retorna 0 se o link OK OU 1 SE N\u00c3O OK\r\n#       log \"Link EMBRATEL  Ativo\"\r\n        return 0;\r\n  fi\r\n  return 1;\r\n}\r\n# Fun\u00e7\u00e3o que desativa link 2\r\nfunction desativa_link2() {\r\n#       log \"Removendo Gateway da Embratel\"\r\n        route del default gw $GW2 # Remove Gateway da Embratel\r\n        return 0;\r\n        return 1;\r\n}\r\n# ATEN\u00c7\u00c3O...!!! Fun\u00e7\u00e3o Principal do script, quaisquer altera\u00e7\u00f5es nessa fun\u00e7\u00e3o devem ser feitas com precau\u00e7\u00e3o,\r\n# caso contrario poder\u00e1 comprometer o funcionamento do mesmo.\r\nfunction monitor() {\r\n        while true # Enquanto as condi\u00e7\u00f5es abaixo forem verdadeiras, ele vai executar.\r\n        do\r\n                #Busca o default gateway na tabela de rotas local\r\n                 GWUP=`ip route show | grep ^default | cut -d \" \" -f 3`\r\n\r\n                # Verifica se o gateway atual e a NET\r\n                if [ $GWUP == $GW1 ]; then # Se essa condi\u00e7\u00e3o for verdadeira...continua no IF, se n\u00e3o entra no ELSE\r\n                        log \"Gateway atual apontando para NET\"\r\n#                       log \"Realizando verificacao de estado do LINK\"\r\n\r\n                        if( ! testa_NET); then # Se a fun\u00e7\u00e3o testa net retornar falha, entra IF\r\n                                log \"Link NET indisponivel, ativando Gateway da EMBRATEL\"\r\n                                if(ativa_link2); then # Se fun\u00e7\u00e3o ativa link  retornar OK, entra no if, caso der falha, entra no ELSE.\r\n                                        log \"Link EMBRATEL ativado com Sucesso\"\r\n                                else\r\n                                        log \"Problema ao ativar Gateway da Embratel\"\r\n                                fi\r\n                        fi\r\n                else\r\n                        log \"Gateway atual apontando para EMBRATEL\" #\r\n                        # Ativa rota NET se ela estiver dispon\u00edvel\r\n                        if(testa_NET ); then # Se link NET voltou, desativa o link 2 (EMBRATEL)\r\n                                log \"Link NET  disponivel, desativando GATEWAY da EMBRATEL e retornando para da NET\"\r\n                                if( desativa_link2 ); then #\r\n                                        ativa_link1\r\n                                fi\r\n                        fi\r\n                fi\r\n                sleep $TEMPO\r\n        done\r\n}\r\ncase \"$1\" in\r\n        monitor)\r\n                echo \"`date` - Monitorando Link Principal: intervalo $TEMPO segs\"\r\n                monitor\r\n                ;;\r\n        status)\r\n                if [ $GWUP == $GW2 ]; then\r\n                        echo \"Utilizando EMBRATEL\"\r\n                else\r\n                        echo \"Utilizando NET\"\r\n                fi\r\n                ;;\r\n        link1)\r\n                if [ $GWUP == $GW2 ]; then\r\n                        desativa_link2\r\n                        ativa_link1\r\n                else\r\n                        echo \"Link1 ja em uso\"\r\n                fi\r\n                ;;\r\n        link2)\r\n                if [ $GWUP == $GW1 ]; then\r\n                        ativa_link2\r\n                else\r\n                        echo \"Link2 ja em uso\"\r\n                fi\r\n                ;;\r\n        *)\r\n                echo $\"Usage: $prog { monitor + segundos | link1 | link2 | status }\"\r\n                exit 1\r\n                ;;\r\nesac\r\nexit $?\r\n<\/pre>\n<p>Abaixo, o script monitor_link:<\/p>\n<pre class=\"prettyprint\">#!\/bin\/bash\r\n#==============================================================\r\n# @author Edir Bonametti\r\n# @since 2015-07-03\r\n# @version 1.0\r\n# Description: Daemon do script link_redundante\r\n# process name: link_redundante\r\n#==============================================================\r\n# Source function library.\r\n. \/etc\/init.d\/functions\r\n\r\n# Verifica se o arquivo de configura\u00e7\u00e3o existe\r\n\r\n[ -f \/etc\/init.d\/link_redundante ] || exit 0\r\n\r\n# Comando utilizado para rodar o script de monitoramento\r\nCOMMAND=\"\/etc\/init.d\/link_redundante\"\r\n\r\nRETVAL=0\r\n\r\n# fun\u00e7\u00e3o para pegar o PID do processo.\r\ngetpid() {\r\n    pid=`ps -eo pid,comm | grep link_redundante | awk '{ print $1 }'`\r\n}\r\n\r\n# Fun\u00e7\u00e3o para iniciar o script link_redundate\r\nstart() {\r\n    echo  $\"Iniciando o Monitoramento de LINK: \"\r\n    getpid\r\n    if [ -z \"$pid\" ]; then\r\n        rm -rf \/var\/run\/link_redundate.sock # Caso o processo j\u00e1 exista limpa o sock\r\n# Inicializa o monitoramento no intervalo de 10 segundos\r\n        $COMMAND monitor 10 &amp; &gt; \/dev\/null\r\n        RETVAL=$?\r\n    fi\r\n# Se o retorno do comando anterior for verdadeiro, cria o arquivo link_redundate\r\n    if [ $RETVAL -eq 0 ]; then\r\n        touch \/var\/lock\/subsys\/link_redundante\r\n        echo_success\r\n    else\r\n# Caso retorne falso\r\n        echo_falhou\r\n    fi\r\n    echo\r\n#    return $RETVAL\r\n}\r\n# Fun\u00e7\u00e3o que para o monitoramento'\r\nstop() {\r\n    echo  $\"Parando Monitoramento do LINK: \"\r\n    getpid\r\n    RETVAL=$?\r\n    if [ -n \"$pid\" ]; then\r\n        $COMMAND link1 &gt; \/dev\/null\r\n        kill -9 $pid\r\n    sleep 2\r\n    getpid\r\n    if [ -z \"$pid\" ]; then\r\n        rm -f \/var\/lock\/subsys\/link_redundante\r\n        echo_success\r\n    else\r\n        echo_failure\r\n    fi\r\n    else\r\n        echo_failure\r\n    fi\r\n    echo\r\n   return $RETVAL\r\n}\r\n\r\ncase \"$1\" in\r\n  start)\r\n        start\r\n        ;;\r\n  stop)\r\n        stop\r\n        ;;\r\n  status)\r\n        getpid\r\n        if [ -n \"$pid\" ]; then\r\n                echo \"Monitoramento de link (PID $pid) est\u00e1 Rodando....\"\r\n                $COMMAND status\r\n        else\r\n                RETVAL=1\r\n                echo \"Monitoramento de link est\u00e1 parado....\"\r\n        fi\r\n        ;;\r\n  restart)\r\n        stop\r\n        start\r\n        ;;\r\n  *)\r\n        echo $\"Usage: $0 {start|stop|status|restart}\"\r\n        exit 1\r\n        ;;\r\nesac\r\n\r\nexit $RETVAL<\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>DESCRI\u00c7\u00c3O DO SCRIPT &nbsp; Pessoal, Eu comecei a escrever scripts h\u00e1 muito pouco tempo, ent\u00e3o, n\u00e3o sou muito bom em faz\u00ea-los, sou iniciante nessa \u00e1rea, portanto, podem haver coisas que voc\u00eas saibam fazer diferente e melhor. Este script est\u00e1 funcionando perfeitamente nesse cliente, por\u00e9m, caso voc\u00eas tenham novas ideias, novas formas de fazer as fun\u00e7\u00f5es [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1,730,830,79,725,42,51,439,415,495,68,271,501,35],"tags":[353,83,953,99],"class_list":["post-4121","post","type-post","status-publish","format-standard","hentry","category-viazap","category-clusterweb","category-debian","category-firewall","category-hospedagem","category-leitura-recomendada","category-linux-linuxrs","category-midia","category-mikrotik-2","category-profissional-de-ti","category-redes-2","category-seguranca-2","category-shell-script","category-wireless","tag-de","tag-internet","tag-link","tag-redundancia"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4121"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4121\/revisions"}],"predecessor-version":[{"id":4122,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4121\/revisions\/4122"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}