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
これが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
ソース: dyndns.orgのような動的IPホスト名でIPTablesを使用
このスクリプトを保存すると、/etc/crontab
ファイルに次のような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
組み合わせる前のすべての回答に基づいています。ログファイルは必要ありません。 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