UFW: Permitir tráfego somente de um domínio com endereço IP dinâmico

30

Eu corro um VPS que gostaria de proteger usando o UFW, permitindo conexões apenas à porta 80. No entanto, para poder administrá-lo remotamente, preciso manter a porta 22 aberta e torná-la acessível em casa.

Eu sei que o UFW pode ser configurado para permitir conexões a uma porta somente a partir de um endereço IP específico:

ufw allow proto tcp from 123.123.123.123 to any port 22

Mas meu endereço IP é dinâmico, então isso ainda não é a solução.

A pergunta é: eu tenho uma resolução dinâmica de DNS com o DynDNS, então é possível criar uma regra usando o domínio em vez do IP?

Eu já tentei isso:

ufw allow proto tcp from mydomain.dyndns.org to any port 22

mas eu tenho ERROR: Bad source address

    
por Carles Sala 20.09.2013 / 23:20

3 respostas

43

Não acredito que isso seja possível com ufw . ufw é apenas um frontend para iptables , que também não possui esse recurso, portanto, uma abordagem seria criar uma entrada crontab que periodicamente seria executada e verificar se o endereço IP foi alterado. Se tiver, ele irá atualizá-lo.

Você pode se sentir tentado a fazer isso:

$ iptables -A INPUT -p tcp --src mydomain.dyndns.org --dport 22 -j ACCEPT

Mas isso resolverá o nome do host para um IP e o usará para a regra, portanto, se o IP mudar posteriormente, essa regra se tornará inválida.

Idéia alternativa

Você pode criar um script como esse, chamado iptables_update.bash .

#!/bin/bash
#allow a dyndns name

HOSTNAME=HOST_NAME_HERE
LOGFILE=LOGFILE_NAME_HERE

Current_IP=$(host $HOSTNAME | cut -f4 -d' ')

if [ $LOGFILE = "" ] ; then
  iptables -I INPUT -i eth1 -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 eth1 -s $Old_IP -j ACCEPT
    iptables -I INPUT -i eth1 -s $Current_IP -j ACCEPT
    /etc/init.d/iptables save
    echo $Current_IP > $LOGFILE
    echo iptables have been updated
  fi
fi

source: Usando IPTables com IP Dinâmico nomes de host como dyndns.org

Com este script salvo, você pode criar uma entrada crontab assim no arquivo /etc/crontab :

*/5 * * * * root /etc/iptables_update.bash > /dev/null 2>&1

Esta entrada então executaria o script a cada 5 minutos, verificando se o endereço IP atribuído ao nome do host foi alterado. Em caso afirmativo, criará uma nova regra permitindo a exclusão da antiga regra do endereço IP antigo.

    
por 21.09.2013 / 01:31
7

Eu sei que isso é antigo, mas eu o encontrei e acabei com essa solução no final, que parece ainda melhor porque não é necessário nenhum arquivo de log e é muito fácil adicionar hosts adicionais conforme necessário. Funciona como um encanto!

Fonte: link

#!/bin/bash

DYNHOST=$1
DYNHOST=${DYNHOST:0:28}
DYNIP=$(host $DYNHOST | grep -iE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" |cut -f4 -d' '|head -n 1)

# Exit if invalid IP address is returned
case $DYNIP in
0.0.0.0 )
exit 1 ;;
255.255.255.255 )
exit 1 ;;
esac

# Exit if IP address not in proper format
if ! [[ $DYNIP =~ (([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) ]]; then
exit 1
fi

# If chain for remote doesn't exist, create it
if ! /sbin/iptables -L $DYNHOST -n >/dev/null 2>&1 ; then
/sbin/iptables -N $DYNHOST >/dev/null 2>&1
fi

# Check IP address to see if the chain matches first; skip rest of script if update is not needed
if ! /sbin/iptables -n -L $DYNHOST | grep -iE " $DYNIP " >/dev/null 2>&1 ; then


# Flush old rules, and add new
/sbin/iptables -F $DYNHOST >/dev/null 2>&1
/sbin/iptables -I $DYNHOST -s $DYNIP -j ACCEPT

# Add chain to INPUT filter if it doesn't exist
if ! /sbin/iptables -C INPUT -t filter -j $DYNHOST >/dev/null 2>&1 ; then
/sbin/iptables -t filter -I INPUT -j $DYNHOST
fi

fi
    
por 28.07.2015 / 22:26
3

Com base nas respostas anteriores, atualizei o seguinte como um script bash que funciona no Debian Jessie

#!/bin/bash
HOSTNAME=dynamichost.domain.com
LOGFILE=$HOME/ufw.log
Current_IP=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ')

if [ ! -f $LOGFILE ]; then
    /usr/sbin/ufw allow from $Current_IP to any port 22 proto tcp
    echo $Current_IP > $LOGFILE
else

    Old_IP=$(cat $LOGFILE)
    if [ "$Current_IP" = "$Old_IP" ] ; then
        echo IP address has not changed
    else
        /usr/sbin/ufw delete allow from $Old_IP to any port 22 proto tcp
        /usr/sbin/ufw allow from $Current_IP to any port 22 proto tcp
        echo $Current_IP > $LOGFILE
        echo iptables have been updated
    fi
fi
    
por 21.03.2017 / 15:27