Я не верю, что это возможно с ufw
. ufw
это всего лишь интерфейс, в iptables
котором также отсутствует эта функция, поэтому одним из подходов будет создание записи в crontab, которая будет периодически запускаться и проверять, изменился ли IP-адрес. Если это так, он будет обновлять его.
У вас может возникнуть соблазн сделать это:
$ 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
Источник: Использование IPTables с динамическими IP-именами хостов, такими как dyndns.org
С помощью этого сохраненного скрипта вы можете создать запись в crontab, например, в файле /etc/crontab
:
*/5 * * * * root /etc/iptables_update.bash > /dev/null 2>&1
Эта запись будет запускать сценарий каждые 5 минут, проверяя, изменился ли IP-адрес, назначенный имени хоста. Если это так, то он создаст новое правило, разрешающее его, при этом удаляя старое правило для старого IP-адреса.