UFW: Hanya mengizinkan lalu lintas dari domain dengan alamat IP dinamis

32

Saya menjalankan VPS yang ingin saya amankan menggunakan UFW, yang memungkinkan koneksi hanya ke port 80. Namun, untuk dapat mengaturnya dari jarak jauh, saya perlu menjaga port 22 terbuka dan membuatnya dapat dijangkau dari rumah.

Saya tahu bahwa UFW dapat dikonfigurasi untuk memungkinkan koneksi ke port hanya dari alamat IP tertentu:

ufw allow proto tcp from 123.123.123.123 to any port 22

Tapi alamat IP saya dinamis, jadi ini belum solusinya.

Pertanyaannya adalah: Saya memiliki resolusi DNS dinamis dengan DynDNS, jadi apakah mungkin untuk membuat Aturan menggunakan domain, bukan IP?

Saya sudah mencoba ini:

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

tapi aku mengerti ERROR: Bad source address

Carles Sala
sumber

Jawaban:

47

Saya tidak percaya ini mungkin terjadi ufw. ufwhanyalah sebuah frontend iptablesyang juga tidak memiliki fitur ini, jadi salah satu pendekatannya adalah membuat entri crontab yang secara berkala akan berjalan dan memeriksa apakah alamat IP telah berubah. Jika sudah maka akan memperbaruinya.

Anda mungkin tergoda untuk melakukan ini:

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

Tapi ini akan menyelesaikan nama host ke IP dan menggunakannya untuk aturan, jadi jika IP nanti berubah aturan ini akan menjadi tidak valid.

Ide alternatif

Anda dapat membuat skrip seperti itu, disebut 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

sumber: Menggunakan IPTable dengan nama host IP Dinamis seperti dyndns.org

Dengan skrip ini disimpan, Anda dapat membuat entri crontab seperti di file /etc/crontab:

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

Entri ini kemudian menjalankan skrip setiap 5 menit, memeriksa untuk melihat apakah alamat IP yang ditetapkan untuk nama host telah berubah. Jika demikian maka itu akan membuat aturan baru yang memperbolehkannya, sambil menghapus aturan lama untuk alamat IP lama.

slm
sumber
2
Betapa konyolnya saya tidak berpikir untuk menyelesaikan nama host secara berkala. Saya memodifikasi skrip Anda (menambahkan pencatatan, dll.) Dan berfungsi seperti pesona. Terima kasih!
Carles Sala
@CarlesSala - senang itu memecahkan masalah Anda. Selain menerima, Anda juga dapat meningkatkan suara 8-).
slm
1
note: pada Debian 7 saya harus mengubah jalur Current_IP=$(host $HOSTNAME | cut -f4 -d' ')keCurrent_IP=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ')
Krystian
Apakah saya dapat melihat ini saat menggunakan ufw status verbose? Maksudku, peraturannya?
Freedo
@Freedo tidak yakin, coba dan lihat apa yang terjadi.
slm
8

Saya tahu ini sudah tua tetapi saya berlari melewatinya dan berakhir dengan solusi ini pada akhirnya yang tampaknya lebih baik karena tidak ada file log yang diperlukan dan sangat mudah untuk menambahkan host tambahan sesuai kebutuhan. Bekerja seperti pesona!

Sumber: 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
Dom
sumber
maaf saya seorang pemula. Di mana saya perlu menyimpan skrip ini dan di mana saya mengubah hal-hal untuk mencerminkan kasus spesifik saya?
Freedo
5

Berdasarkan jawaban sebelumnya, saya memperbarui yang berikut sebagai skrip bash yang berfungsi di 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
Mattias Pettersson
sumber
Itu bahkan dapat ditambahkan untuk cronmenjalankannya secara berkala.
Tim Kennedy
Itulah yang saya lakukan;)
Mattias Pettersson
Script ini memiliki masalah kecil: pada penggunaan pertama jika Anda lupa menjalankan sebagai root, itu akan membuat file log tetapi tidak menambahkan aturan. Kemudian jika Anda menjalankan lagi sebagai root, itu hanya akan mengatakan 'alamat ip tidak berubah'. Itu harus dijalankan sebagai root pertama kali! Juga, akan baik untuk mengubah LOGFILE=$HOME/ufw.loguntuk LOGFILE=$HOME/ufw.$HOSTNAME.logmengizinkan lebih dari satu skrip dijalankan pada saat yang sama
Guerlando OC
@GuerlandoOCs, bagaimana Anda mengatur ulang jika Anda mengalami masalah ini?
Matius
0

Berdasarkan semua jawaban sebelum saya kombinasikan. Tidak diperlukan file log. Diuji pada Ubuntu 18.04

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

Anda dapat menambahkan port ke aturan dengan parameter "port". misalnya:

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
Sebastian
sumber