ইউএফডাব্লু: কেবল গতিশীল আইপি ঠিকানা সহ কোনও ডোমেন থেকে ট্র্যাফিকের অনুমতি দিন


32

আমি একটি ভিপিএস চালাচ্ছি যা আমি ইউএফডাব্লু ব্যবহার করে সুরক্ষিত রাখতে চাই, সংযোগগুলি কেবল ৮০ টি বন্দরে রাখি However তবে, এটি দূরবর্তীভাবে পরিচালিত করতে সক্ষম হতে, আমাকে পোর্ট ২২ খোলা রাখতে হবে এবং এটি বাড়ি থেকে পৌঁছানো যায়।

আমি জানি যে ইউএফডাব্লু কেবলমাত্র নির্দিষ্ট আইপি ঠিকানা থেকে কোনও বন্দরে সংযোগের অনুমতি দেওয়ার জন্য কনফিগার করা যেতে পারে:

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

তবে এটি হোস্ট-নেমটি একটি আইপি-তে সমাধান করবে এবং নিয়মের জন্য এটি ব্যবহার করবে, সুতরাং আইপি পরে পরিবর্তিত হলে এই নিয়মটি অবৈধ হয়ে যাবে।

বিকল্প ধারণা

আপনি এর মতো একটি স্ক্রিপ্ট তৈরি করতে পারেন, বলা হয় 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

উত্স: dyndns.org এর মতো ডায়নামিক আইপি হোস্টনামের সাথে আইপেটেবল ব্যবহার করা

এই স্ক্রিপ্টটি সংরক্ষণ করে আপনি ফাইলের মতো ক্রন্টব এন্ট্রি তৈরি করতে পারেন /etc/crontab:

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

এই এন্ট্রিটি তখন প্রতি 5 মিনিটে স্ক্রিপ্টটি চালায়, হোস্টনামের জন্য নির্ধারিত আইপি ঠিকানাটি পরিবর্তন হয়েছে কিনা তা পরীক্ষা করে। যদি তা হয় তবে এটি পুরানো আইপি ঠিকানার পুরানো নিয়মটি মোছার সময় এটির অনুমতি দিয়ে একটি নতুন নিয়ম তৈরি করবে।


2
কতটা নির্বোধ যে আমি পর্যায়ক্রমে হোস্টনামটি সমাধান করার কথা ভাবি নি। আমি আপনার স্ক্রিপ্টটি সংশোধন করেছি (যুক্ত লগিং ইত্যাদি) এবং এটি একটি কবজির মতো কাজ করে। ধন্যবাদ!
কার্লস সালা

@ কার্লসালা - এটি আপনার সমস্যার সমাধান করে খুশি। স্বীকৃতি ছাড়াও আপনি 8-) আপগেট করতে পারেন।
slm

1
দ্রষ্টব্য: দেবিয়ান 7-এ আমাকে লাইনটি পরিবর্তন Current_IP=$(host $HOSTNAME | cut -f4 -d' ')করতে হয়েছিলCurrent_IP=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ')
ক্রিস্টিয়ান

ইউএফডাব্লু স্ট্যাটাস ভার্বোস ব্যবহার করার সময় কি আমি এটি দেখতে সক্ষম হব? মানে, নিয়ম?
ফ্রিডো

@ ফ্রিডো নিশ্চিত নন, চেষ্টা করে দেখুন কী ঘটে।
slm

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একই সময়ে একটির বেশি স্ক্রিপ্টটি রান অনুমতি
Guerlando OCS

@ গুয়ারল্যান্ডোওস আপনি যদি এই সমস্যাটিতে চলে যান তবে কীভাবে পুনরায় সেট করবেন?
ম্যাথু

0

আমি তাদের একত্রিত করার আগে সমস্ত উত্তরের উপর ভিত্তি করে। কোনও লগফিলের প্রয়োজন নেই। উবুন্টু 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.