UFW: डायनामिक आईपी एड्रेस वाले डोमेन से ही ट्रैफिक की अनुमति दें


32

मैं एक VPS चलाता हूं जिसे मैं UFW का उपयोग करके सुरक्षित करना चाहूंगा, जिससे कनेक्शन केवल पोर्ट 80 हो सके। हालाँकि, इसे दूरस्थ रूप से प्रबंधित करने में सक्षम होने के लिए, मुझे पोर्ट 22 को खुला रखने और घर से पहुंच योग्य बनाने की आवश्यकता है।

मुझे पता है कि केवल विशिष्ट आईपी पते से पोर्ट में कनेक्शन की अनुमति देने के लिए UFW को कॉन्फ़िगर किया जा सकता है:

ufw allow proto tcp from 123.123.123.123 to any port 22

लेकिन मेरा आईपी पता गतिशील है, इसलिए यह अभी तक समाधान नहीं है।

सवाल यह है: मेरे पास डायनेडीएनएस के साथ डायनेमिक डीएनएस रिज़ॉल्यूशन है, इसलिए क्या आईपी के बजाय डोमेन का उपयोग करके नियम बनाना संभव है?

मैंने पहले ही यह कोशिश की:

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

लेकिन मुझे मिल गया ERROR: Bad source address

जवाबों:


47

मुझे विश्वास नहीं है कि यह संभव है ufwufwसिर्फ एक दृश्य है, iptablesजिसमें इस सुविधा का भी अभाव है, इसलिए एक दृष्टिकोण एक क्रॉस्टैब प्रविष्टि बनाने का होगा जो समय-समय पर चलेगा और जांचें कि क्या आईपी पता बदल गया है। अगर यह है तो इसे अपडेट करेगा।

आपको ऐसा करने के लिए लुभाया जा सकता है:

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

लेकिन यह hostname को IP में हल करेगा और नियम के लिए उपयोग करेगा, इसलिए यदि बाद में IP बदल जाता है तो यह नियम अमान्य हो जाएगा।

वैकल्पिक विचार

आप एक स्क्रिप्ट बना सकते हैं जैसे कि, कहा जाता है 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: dyndns.org जैसे डायनामिक आईपी होस्टनाम के साथ IPTables का उपयोग करना

इस स्क्रिप्ट को सहेजने से आप फ़ाइल में एक crontab प्रविष्टि बना सकते हैं /etc/crontab:

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

यह प्रविष्टि प्रत्येक 5 मिनट में स्क्रिप्ट चलाएगी, यह देखने के लिए कि क्या होस्टनाम को दिया गया आईपी पता बदल गया है। यदि ऐसा है तो यह एक नया नियम बनाएगा, जिससे वह पुराने आईपी पते के लिए पुराने नियम को हटा देगा।


2
कितनी मूर्खतापूर्ण है कि मैंने समय-समय पर होस्टनाम को हल करने के बारे में नहीं सोचा। मैंने आपकी स्क्रिप्ट को संशोधित किया (लॉगिंग इत्यादि जोड़ा) और यह एक आकर्षण की तरह काम करता है। धन्यवाद!
कार्ल्स सला

@CarlesSala - खुशी है कि यह आपके मुद्दे को हल किया। आप स्वीकार करने के अलावा 8- अपवोट भी कर सकते हैं।
स्लम

1
ध्यान दें: पर डेबियन 7 मैं परिवर्तन लाइन पड़ा Current_IP=$(host $HOSTNAME | cut -f4 -d' ')करने के लिएCurrent_IP=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ')
क्रिस्टियन

क्या मैं ufw स्टेटस वर्बोज़ का उपयोग करते समय इसे देख पाऊंगा? मेरा मतलब है, नियम?
फ्रीडो

@ यकीन नहीं, कोशिश करो और देखो क्या होता है।
स्लम

8

मुझे पता है कि यह पुराना है, लेकिन मैं इसके पार चला गया और अंत में इस समाधान के साथ समाप्त हुआ जो और भी बेहतर लगता है क्योंकि कोई लॉग फ़ाइल की आवश्यकता नहीं है और आवश्यकतानुसार अतिरिक्त मेजबानों को जोड़ना बहुत आसान है। एक जादू की तरह काम करता है!

स्रोत: 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

माफ करना मैं थोड़ा नौसिखिया हूँ। मुझे इस स्क्रिप्ट को संग्रहीत करने की आवश्यकता कहां है और मैं अपने विशिष्ट मामले को प्रतिबिंबित करने के लिए चीजों को कहां बदलूं?
फ्रीडो

5

पिछले उत्तरों के आधार पर मैंने निम्नलिखित बैश स्क्रिप्ट के रूप में अद्यतन किया जो डेबियन जेसी पर काम करती है

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

यह भी जोड़ा जा सकता है कि cronइसे समय-समय पर चलाने के लिए यह स्वयं है।
टिम कैनेडी

मैंने यही किया है;)
मटियास पेटर्सन

इस स्क्रिप्ट में एक छोटी समस्या है: पहले उपयोग पर यदि आप रूट के रूप में चलाना भूल गए हैं, तो यह लॉग फ़ाइल बनाएगा, लेकिन नियम नहीं जोड़ेगा। फिर यदि आप फिर से रूट के रूप में चलते हैं तो यह सिर्फ यह कहेगा कि 'आईपी एड्रेस नहीं बदला'। इसे पहली बार रूट के रूप में चलाना होगा! इसके अलावा, एक ही समय में एक से अधिक स्क्रिप्ट चलाने की अनुमति देने के लिए बदलने के LOGFILE=$HOME/ufw.logलिए अच्छा होगाLOGFILE=$HOME/ufw.$HOSTNAME.log
गुएरलैंडो ओसी

@GuerlandoOCs यदि आप इस समस्या में भाग लेते हैं तो आप कैसे रीसेट करते हैं?
मैथ्यू

0

इससे पहले कि मैं उन्हें संयुक्त सभी उत्तरों के आधार पर। कोई logfile की जरूरत है। उबंटू 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

आप "पोर्ट" पैरामीटर के साथ नियमों में एक पोर्ट जोड़ सकते हैं। उदाहरण के लिए:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.