De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Alexandro Silva
Data de Publicação: 27 de abril de 2013
Uma boa prática de segurança é limitar o acesso a consoles administrativas ou conteúdo privado para origens específicas. Mas como fazer isso no iptables quando seu ip é dinâmico?
Existe um patch que amplia o suporte do iptables até a camada de aplicação, só é que necessário recompilar o kernel, o que dá um certo trabalho.
Passei pelo mesmo problema e encontrei uma solução que vem funcionando muito bem.
Usando os scripts abaixo as regras do iptables serão atualizadas sempre que houver mudança no ip de origem.
RedHat e derivados
Crie o arquivo /usr/bin/dynamic_iptables.py/
com o conteúdo abaixo. Ele
será responsável por verificar se o ip foi modificado e irá reiniciar
o iptables.
Altere o valor da variável home_dyndns com o nome do host criado no seu serviço de DNS dinâmico ( e.g. no-ip ou dyndns )
#!/usr/bin/python import os def gettextoutput(cmd): """Return (status, output) of executing cmd in a shell.""" pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r') pipe = os.popen(cmd + ' 2>&1', 'r') text = pipe.read() if text[-1:] == '\n': text = text[:-1] return text home_dyndns = "acme.no-ip.org" log_dyndns = "/tmp/iptables_noip_update.log" last_dyndns = gettextoutput("cat " + log_dyndns) cur_dyndns = gettextoutput("host " + home_dyndns) print "Log: "+ last_dyndns print "Cur: "+ cur_dyndns if last_dyndns == cur_dyndns: print "IPs match, no restart necessary" else: print "Updating last IP with current" os.system("echo '" + cur_dyndns + "' > " + log_dyndns) print "Restarting iptables to update" os.system("/etc/init.d/iptables restart")
Crie o arquivo /usr/bin/update_rules.sh
que será responsável pela
atualização das regras do iptables com o novo endereço de origem.
Altere o valor da variável HOSTNAME com o nome do host criado no seu serviço de DNS dinâmico ( e.g. no-ip ou dyndns )
#!/bin/bash HOSTNAME=acme.no-ip.org LOGFILE=/tmp/iptables_noip_update.log Current_IP=$(host $HOSTNAME | cut -f4 -d' ') if [ $LOGFILE = "" ] ; then iptables -I INPUT -i eth0 -s $Current_IP -j ACCEPT echo $Current_IP > $LOGFILE else Old_IP=$(cat $LOGFILE) if [ "$Current_IP" = "$Old_IP" ] ; then echo "IP address has not changed" else iptables -D INPUT -i eth0 -s $Old_IP -j ACCEPT iptables -I INPUT -i eth0 -s $Current_IP -j ACCEPT echo $Current_IP > $LOGFILE echo "iptables have been updated" fi
No Redhat as regras do iptables são armazenadas no arquivo
/etc/sysconfig/iptables
criado usando o comando iptables-save. Quando
o serviço for reiniciado as regras contidas neste arquivo serão reaplicadas.
Debian e derivados
Para rodar no Debian foi preciso fazer pequenas adaptações nos scripts.
Crie o arquivo /usr/bin/dynamic_iptables.py
com o conteúdo abaixo.
Altere o valor da variável home_dyndns com o nome do host criado no seu serviço de DNS dinâmico ( e.g. no-ip ou dyndns )
#!/usr/bin/python import os def gettextoutput(cmd): """Return (status, output) of executing cmd in a shell.""" pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r') pipe = os.popen(cmd + ' 2>&1', 'r') text = pipe.read() if text[-1:] == '\n': text = text[:-1] return text home_dyndns = "acme.no-ip.org" log_dyndns = "/tmp/iptables_noip_update.log" last_dyndns = gettextoutput("cat " + log_dyndns) cur_dyndns = gettextoutput("host " + home_dyndns) print "Log: "+ last_dyndns print "Cur: "+ cur_dyndns if last_dyndns == cur_dyndns: print "IPs match, no restart necessary" else: print "Updating last IP with current" os.system("echo '" + cur_dyndns + "' > " + log_dyndns)
Crie o arquivo /usr/bin/update_rules.sh.
Altere o valor da variável HOSTNAME com o nome do host criado no seu serviço de DNS dinâmico ( e.g. no-ip ou dyndns )
#!/bin/bash HOSTNAME=acme.no-ip.org LOGFILE=iptables_noip_update.log Current_IP=$(host $HOSTNAME | cut -f4 -d' ') if [ $LOGFILE = "" ] ; then iptables -I INPUT -i eth0 -s $Current_IP -j ACCEPT echo $Current_IP > $LOGFILE else Old_IP=$(cat $LOGFILE) iptables -D INPUT -i eth0 -s $Old_IP -j ACCEPT iptables -I INPUT -i eth0 -s $Current_IP -j ACCEPT echo $Current_IP > $LOGFILE echo "iptables have been updated" fi
Agendamento
Para automatizar o processo de atualização crie agendamentos no /etc/crontab ou no crontab do usuário root usando o comando sudo crontab -e
* 8 * * * /usr/bin/dynamic_iptables.py > /tmp/dynamic_iptables.log * * * * * /usr/bin/update_rules.sh > /tmp/dynamic_rules.log
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários