UFW: Yalnızca dinamik IP adresli bir alandan gelen trafiğe izin verin


32

UFW kullanarak güvence altına almak istediğim bir VPS kullanıyorum, yalnızca 80 numaralı bağlantı noktasına bağlantı sağlıyor. Ancak, uzaktan yönetebilmek için, 22 numaralı bağlantı noktasını açık tutmam ve evden erişilebilir duruma getirmem gerekiyor.

UFW'nin yalnızca belirli bir IP adresinden bir bağlantı noktasına bağlantılara izin verecek şekilde yapılandırılabileceğini biliyorum:

ufw allow proto tcp from 123.123.123.123 to any port 22

Ancak IP adresim dinamik, bu yüzden henüz bir çözüm değil.

Soru şudur: DynDNS ile dinamik DNS çözünürlüğüm var, bu yüzden IP yerine etki alanı kullanarak bir Kural oluşturmak mümkün müdür?

Bunu zaten denedim:

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

ama anladım ERROR: Bad source address

Yanıtlar:


47

Bunun mümkün olabileceğine inanmıyorum ufw. aynı zamanda bu özellikten yoksun olan ufwbir ön uçtur iptables, bu nedenle bir yaklaşım periyodik olarak çalışacak ve IP adresinin değişip değişmediğini kontrol edecek bir crontab girişi oluşturmak olacaktır. Eğer öyleyse, güncelleyecektir.

Bunu yapmak için cazip olabilir:

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

Ancak bu, ana bilgisayar adını bir IP'ye çözecek ve bunu kural için kullanacaktır, böylece IP daha sonra değişirse bu kural geçersiz hale gelecektir.

Alternatif fikir

Buna benzer bir senaryo oluşturabilirsiniz 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

kaynak: IPTable'ları dyndns.org gibi Dinamik IP ana bilgisayar adlarıyla kullanma

Bu komut dosyası kaydedildiğinde, dosyada /etc/crontabşöyle bir crontab girişi oluşturabilirsiniz :

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

Bu giriş daha sonra komut dosyasını her 5 dakikada bir çalıştırır ve ana bilgisayar adına atanan IP adresinin değişip değişmediğini kontrol eder. Öyleyse, eski IP adresi için eski kuralı silerken, buna izin veren yeni bir kural oluşturacaktır.


2
Ne kadar aptalca ki ana bilgisayar adını periyodik olarak çözmeyi düşünmedim. Komut dosyanızı değiştirdim (eklenmiş günlük kaydı vb.) Ve bir cazibe işlevi görür. Teşekkür ederim!
Carles Sala

@CarlesSala - Bu sorunu çözdü sevindim. Kabul etmenin yanı sıra 8-8.
slm

1
not: Debian 7 I değişim hattına vardı Current_IP=$(host $HOSTNAME | cut -f4 -d' ')içinCurrent_IP=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ')
Krystian

Ufw status verbose kullanırken bunu görebilecek miyim? Yani kurallar?
Freedo

@Freedo emin değil, denemek ve ne olduğunu görün.
slm

8

Bunun eski olduğunu biliyorum, ancak bununla karşılaştım ve sonunda daha iyi görünen sonuçta bu çözümle karşılaştım, çünkü hiçbir günlük dosyasına ihtiyaç duyulmuyor ve gerektiğinde ek ana bilgisayarlar eklemek çok kolay. ÇALIŞIYOR bir cazibe gibi!

Kaynak: http://rdstash.blogspot.ch/2013/09/allow-host-with-dynamic-ip-through.html

#!/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

üzgünüm ben biraz acemiyim. Bu senaryoyu nerede saklamam gerekiyor ve özel davamı yansıtacak şekilde eşyaları değiştirdiğimde nerede?
Freedo

5

Önceki cevaplara göre, aşağıdakileri Debian Jessie ile çalışan bash betiği olarak güncelledim.

#!/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

Hatta cronperiyodik olarak kendi başına çalışması için bile eklenebilir .
Tim Kennedy,

Ben de öyle yaptım;)
Mattias Pettersson

Bu betiğin küçük bir sorunu var: İlk kullanımda root olarak çalıştırmayı unuttuysanız, log dosyasını oluşturacak ancak kuralları eklemeyecek. Sonra root olarak tekrar çalıştırırsanız, sadece 'ip adresi değişmedi' der. İlk defa root olarak çalıştırılmalıdır! Ayrıca, değişime iyi olurdu LOGFILE=$HOME/ufw.logiçin LOGFILE=$HOME/ufw.$HOSTNAME.logaynı anda birden fazla komut çalıştırmak izin vermek
Guerlando OK'ler

@GuerlandoOCs Bu sorunla karşılaşırsanız nasıl sıfırlarsınız?
Matthew

0

Onları birleştirmeden önceki tüm cevaplara dayanarak. Günlük dosyasına gerek yok. Ubuntu 18.04 tarihinde test edilmiştir.

#!/bin/bash
HOSTNAME=YOUR.DNS.NAME.HERE

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root"
   exit 1
fi

new_ip=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ')
old_ip=$(/usr/sbin/ufw status | grep $HOSTNAME | head -n1 | tr -s ' ' | cut -f3 -d ' ')

if [ "$new_ip" = "$old_ip" ] ; then
    echo IP address has not changed
else
    if [ -n "$old_ip" ] ; then
        /usr/sbin/ufw delete allow from $old_ip to any
    fi
    /usr/sbin/ufw allow from $new_ip to any comment $HOSTNAME
    echo iptables have been updated
fi

Kurallara "port" parametresiyle bir port ekleyebilirsiniz. Örneğin:

if [ -n "$old_ip" ] ; then
    /usr/sbin/ufw delete allow from $old_ip to any port 22
fi
/usr/sbin/ufw allow from $new_ip to any port 22 comment $HOSTNAME
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.