UFW:動的IPアドレスを持つドメインからのトラフィックのみを許可する


32

UFWを使用して保護したいVPSを実行し、ポート80への接続のみを許可します。ただし、リモートで管理できるようにするには、ポート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

これが可能だとは思わないufwufwは、iptablesこの機能も備えていない単なるフロントエンドであるため、1つのアプローチは、定期的に実行して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

ソース:dyndns.orgのような動的IPホスト名でIPTablesを使用する

このスクリプトを保存すると、ファイルに/etc/crontab次のようなcrontabエントリを作成できます。

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

このエントリは、5分ごとにスクリプトを実行し、ホスト名に割り当てられたIPアドレスが変更されたかどうかを確認します。その場合、古いIPアドレスの古いルールを削除しながら、それを許可する新しいルールを作成します。


2
ホスト名を定期的に解決することを考えなかったなんて馬鹿げている。スクリプトを変更し(ロギングの追加など)、それは魅力のように機能します。ありがとうございました!
カールズサラ

@CarlesSala-問題を解決してくれてうれしいです。承認することに加えて、8に投票することもできます。
slm

1
注:Debian 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て、単独で定期的に実行することもできます。
ティムケネディ

それが私がしたことです;)
マティアスペッターソン

このスクリプトには小さな問題があります。rootとして実行するのを忘れた場合、最初の使用時にログファイルは作成されますが、ルールは追加されません。その後、rootとして再度実行すると、「IPアドレスは変更されませんでした」と表示されます。初めてルートとして実行する必要があります!また、変化に良いだろうLOGFILE=$HOME/ufw.logにするLOGFILE=$HOME/ufw.$HOSTNAME.logと同時に、複数のスクリプトの実行を許可する
Guerlando経口避妊薬

@GuerlandoOCsこの問題に遭遇した場合、どのようにリセットしますか?
マシュー

0

私がそれらを結合する前のすべての答えに基づいています。ログファイルは必要ありません。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

「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.