UFW : 동적 IP 주소를 가진 도메인의 트래픽 만 허용


32

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

답변:


47

나는 이것이 가능하다고 믿지 않는다 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 주소에 대한 기존 규칙을 삭제하면서 허용하는 새 규칙을 작성합니다.


2
호스트 이름을 주기적으로 확인하는 것에 대해 생각하지 않은 것이 어리석은 일입니다. 스크립트를 수정하고 (로깅 추가 등) 매력처럼 작동합니다. 고맙습니다!
Carles Sala

@CarlesSala-문제가 해결되어 다행입니다. 수락하는 것 외에도 8-)를 찬성 할 수도 있습니다.
slm

1
참고 : 데비안 7에서 라인 Current_IP=$(host $HOSTNAME | cut -f4 -d' ')Current_IP=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ')
Krystian

ufw status verbose를 사용할 때 이것을 볼 수 있습니까? 규칙은?
Freedo

@Freedo 확실하지 않습니다, 그것을 시도하고 무슨 일이 일어나는 참조하십시오.
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

미안하지만 나는 조금 초보자입니다. 이 스크립트를 어디에 저장해야하며 특정 사례를 반영하기 위해 변경해야하는 위치는 무엇입니까?
Freedo

5

이전 답변을 바탕으로 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

cron자체적으로 주기적으로 실행 되도록 추가 할 수도 있습니다 .
팀 케네디

그것이 내가 한 일입니다.)
Mattias Pettersson

이 스크립트에는 작은 문제가 있습니다. 처음 사용할 때 루트로 실행하는 것을 잊어 버린 경우에는 로그 파일이 생성되지만 규칙은 추가되지 않습니다. 그런 다음 루트로 다시 실행하면 'ip 주소가 변경되지 않았습니다'라고 표시됩니다. 처음으로 루트로 실행해야합니다! 또한 동시에 하나 이상의 스크립트 실행을 허용하도록 변경 LOGFILE=$HOME/ufw.log하는 것이 좋습니다LOGFILE=$HOME/ufw.$HOSTNAME.log
Guerlando OCs

@GuerlandoOCs이 문제가 발생하면 어떻게 재설정합니까?
Matthew

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

"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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.