Я не верю, что это возможно с 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-адреса.
Current_IP=$(host $HOSTNAME | cut -f4 -d' ')
наCurrent_IP=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ')
Я знаю, что он старый, но я наткнулся на него и в итоге получил это решение, которое кажется еще лучше, потому что файл журнала не нужен, и очень легко добавлять дополнительные хосты по мере необходимости. Работает как шарм!
Источник: http://rdstash.blogspot.ch/2013/09/allow-host-with-dynamic-ip-through.html
источник
Основываясь на предыдущих ответах, я обновил следующий сценарий как bash, который работает на Debian Jessie
источник
cron
он периодически запускался сам по себе.LOGFILE=$HOME/ufw.log
на одновременное выполнениеLOGFILE=$HOME/ufw.$HOSTNAME.log
нескольких сценариевНа основе всех ответов, прежде чем я их объединил. Лог-файл не требуется. Проверено на Ubuntu 18.04
Вы можете добавить порт в правила с помощью параметра "port". например:
источник