Galera, acho que esse não é o espaço destinado a colocar artigos/tutoriais, mas confesso envergonhado que passei mais de 40min tentando descobrir como criar um novo tutorial/artigo no wiki e não consegui. Se alguém puder me ensinar ficarei muito agradecido.
Vamos ao que interessa:
A alguns dias precisei de uma solução de DNS dinâmico para utilizar em servidores linux que não tinham um ip fixo. Já utilizei anteriormente o no-ip.com, porém acontece que eles mudaram a politica deles obrigando os usuários a fazerem login no site de tempo em tempo para o domínio não ser desativado.
Já havia experimentado o ddns.com.br, porém apenas pra windows e descobri que esse tem uma versão linux tbm.
O problema é que essa versão linux tem problemas grotescos de erros na programação dos scripts, levando a maquina muitas vezes a loops infinitos e rodar centenas de processos iguais simultânea mente, além de não suportar o caso de a maquina estar atrás de um router com ip dinâmico.
Quem tiver interesse de saber todos os problemas que achei nos scripts pode ler no final desse artigo uma carta que enviei para a empresa responsável pelo ddns.com.br e não obtive resposta alguma.
Resolvi refazer os scripts e implementar a solução com router + nat unindo os vários scripts em um único arquivo ddns.sh
Seu conteúdo é o que se segue, bastando apenas copiar e colar em em um arquivo ddns.sh e copia-lo para /usr/local/sbin/ddns.sh
De um chmod +x /usr/local/sbin/ddns.sh para adicionar permissão de execução ao mesmo.
#!/bin/bash
##################################################
#
# Script para testar se houve mudança de end. IP. Caso positivo, atualiza
#
#################################################
# Para um correto funcionamento desse script é necessário que seja adicionado 2 entradas na crontab, isso pode ser feito copiando
# as próximas 2 linhas que estão comentadas com # para /etc/cron.d/ddns e em seguida é necessário reiniciar a cron.
# 0-59/2 * * * * root /usr/local/sbin/ddns.sh
# 00 * * * * root sleep 30 ; /usr/local/sbin/ddns.sh yes
#
# As seguintes variáveis devem ser configuradas:
#
#Seu end. DDNS (ex.: meuendereco.ddns.com.br)(OBRIGATORIO)
DOMINIO=""
# Sua senha para o domínio(OBRIGATORIO)
SENHA=""
# Endereço da interface com acesso a internet ex: eth0 wlan0
INTERFACE=""
# Se estiver atrás de um roteador(NAT) coloque "yes" se estiver com o ip real diretamente na interface citada acima coloque "no"
NAT="yes"
# Para descobrir o ip de internet baixamos um html de um servidor remoto que retornará o ip real.
# Podemos usar o serviço gratuito "www.qualemeuip.com.br" ou um serviço próprio.
# A vantagem de usar um serviço próprio é que teremos certeza da sintaxe retornada, caso o "www.qualemeuip.com.br" mude a sintaxe da pagina
# isso poderia fazer com que esse script não consiga pegar o ip corretamente.
# Segue abaixo o conteúdo comentando com # do ip.php para se colocar em um servidor com ip fixo e suporte a php.
# <?php
# print(getenv("REMOTE_ADDR"));
# ?>
# Para usar o serviço do "www.qualemeuip.com.br) preencha a variável abaixo com o ip 70.84.93.247 ou com o nome "www.qualemeuip.com.br"
# utilizar o ip diretamente é mais rápido mas se esse vier a mudar o scrip deixará de funcionar.
QUALEMEUIP="" #"70.84.93.247"
# Para usar o serviço próprio a variável NATIP deve ser preenchida com o ip/ip.php, onde o ip é o numero de ip do servidor onde o ip.php encontra-se.
# Se preenchida ela é quem vai retornar o ip real do cliente para o script.
NATIP=""
# A variável IP deverá ser setada apenas no caso de o ip ser fixo, caso contrario devera ser deixada em branco
IP=""
##################################################
TMPDIR=/tmp #Diretório temporário
BINDIR=/usr/local/sbin
##################################################
# A variável FORCE serve para forçar uma "atualização do ip, uma vês que um domínio torna-se inexistente apos 2h sem atualização
# A variável FORCE recebe o primeiro parâmetro passado ao programa, se esse for "yes" o ip sera forçado a 0.0.0.0
FORCE="$1"
# Caso o domínio, a senha ou ambos estiverem vazios
if [ "$DOMINIO" == "" ] || [ "$SENHA" == "" ];then
echo "É necessários setar as variáveis DOMINIO e SENHA"
exit
fi
main(){
# Caso tenha sido passado o yes é forçada a atualização do ip
if [ "$FORCE" == "yes" ];then
echo "0.0.0.0" > ${TMPDIR}/ddns.ip
exit
fi
# Se o arquivo ${TMPDIR}/ddns.ip não existe, cria-lo com 0.0.0.0
if [ ! -e ${TMPDIR}/ddns.ip ]
then
echo "0.0.0.0" > ${TMPDIR}/ddns.ip
fi
# Se a variável IP não tiver sido setada no inicio desse script a função getip será chamada para descobrir o ip, caso ela tenha sido setada o ip será atribuído diretamente
if [ "$IP" == "" ];then
getip
else
echo "$IP" > ${TMPDIR}/ddns.ip.new
fi
# Comparamos para ver se o ip realmente mudou
if [ `cat ${TMPDIR}/ddns.ip.new` != `cat ${TMPDIR}/ddns.ip` ]; then
# Trocamos o arquivo base pelo novo IP
mv ${TMPDIR}/ddns.ip.new ${TMPDIR}/ddns.ip
NEWIP=`cat ${TMPDIR}/ddns.ip`
# Setamos o DDNS com o novo IP
${BINDIR}/ddnsquery -t SET -a $NEWIP -p $SENHA $DOMINIO
fi
}
getip(){
unset LANG
# Se no arquivo ddns.sh o nat estiver como yes o if será executado, se estiver como no será o else
if [ "$NAT" == "yes" ];then
# baixa o index de "www.qualemeuip.com.br" ou o ip.php setado em NATIP que contem o ip real de internet.
# -T 20 diz que não pode levar mais de 20 segundos para baixar o arquivo
# -t 2 diz que serão feitas no máximo duas tentativas em caso de falha
# -nc diz que se o arquivo já existir ele será substituído e não renomeado para *.1
# -O meuip diz que o nome do html baixado será "meuip"
if [ "$NATIP" != "" ];then
/usr/bin/wget -T 20 -t 2 -nc -q -O meuip "$NATIP"
# Lê o arquivo meuip e devolve apenas o ip
cat meuip > ${TMPDIR}/ddns.ip.new
else
/usr/bin/wget -T 20 -t 2 -nc -q -O meuip $QUALEMEUIP
# Lê o arquivo meuip faz filtragens e devolve apenas o ip
cat meuip |grep "^<title>" |awk -F '</' '{print $1}' |awk -F ' ' '{print $5}' > ${TMPDIR}/ddns.ip.new
fi
# remove o arquivo meuip
rm -rf meuip
else
# Captura o endereço ip a da interface definida na variável INTERFACE
/sbin/ifconfig $INTERFACE | grep -i "inet " | cut -d: -f2 | cut -d" " -f1 > ${TMPDIR}/ddns.ip.new
fi
}
main
CONTINUA.......