UFW : 동적 IP 주소를 가진 도메인의 트래픽 만 허용 tcp from 123.123.123.123 to any port 22 그러나

UFW를 사용하여 보안을 유지하고 포트 80에만 연결할 수있는 VPS를 실행합니다. 그러나 원격으로 관리하려면 포트 22를 열어두고 집에서 연결할 수 있어야합니다.

특정 IP 주소에서만 포트에 연결하도록 UFW를 구성 할 수 있다는 것을 알고 있습니다.

ufw allow proto tcp from 123.123.123.123 to any port 22

그러나 내 IP 주소는 동적이므로 아직 해결책이 아닙니다.

문제는 DynDNS로 동적 DNS 확인이 가능하므로 IP 대신 도메인을 사용하여 규칙을 작성할 수 있습니까?

나는 이미 이것을 시도했다 :

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

그러나 나는 얻었다 ERROR: Bad source address



답변

나는 이것이 가능하다고 믿지 않는다 ufw. 이 기능이없는 ufw프론트 엔드 일 뿐이 iptables므로 한 가지 방법은 주기적으로 실행되고 IP 주소가 변경되었는지 확인하는 crontab 항목을 작성하는 것입니다. 그렇다면 업데이트됩니다.

이렇게하고 싶을 수도 있습니다.

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

그러나 호스트 이름을 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와 같은 동적 IP 호스트 이름으로 IPTable 사용

이 스크립트를 저장하면 파일에서 crontab 항목을 만들 수 있습니다 /etc/crontab.

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

이 항목은 5 분마다 스크립트를 실행하여 호스트 이름에 할당 된 IP 주소가 변경되었는지 확인합니다. 그렇다면 이전 IP 주소에 대한 기존 규칙을 삭제하면서 허용하는 새 규칙을 작성합니다.


답변

나는 이것이 오래되었다는 것을 알고 있지만 로그 파일이 필요없고 필요에 따라 추가 호스트를 추가하기가 훨씬 쉽기 때문에 결국에는이 솔루션으로 끝났습니다. 매력처럼 작동합니다!

출처 :
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


답변

이전 답변을 바탕으로 Debian Jessie에서 작동하는 bash 스크립트로 다음을 업데이트했습니다.

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


답변

내가 결합하기 전에 모든 답변을 기반으로합니다. 로그 파일이 필요하지 않습니다. 우분투에서 테스트 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

“port”매개 변수를 사용하여 규칙에 포트를 추가 할 수 있습니다. 예 :

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


답변