Обновление iptables через ddclient
TL;DR
Что я могу сделать, чтобы изменить iptables с ddclient (с пользователем ddclient)?
История позади
У меня есть компьютер, который использует dyndns для адресации извне. Всякий раз, когда провайдер выдает новый IP-адрес (что случается довольно часто в наши дни), ddclient обновляет запись DNS.
На компьютере есть некоторые правила iptables, основанные на его общедоступном IP-адресе, которые, конечно, будут работать, только если IP-адрес правильный.
До сих пор у меня была почасовая работа cron, которая работала бы так, чтобы поддерживать iptables в актуальном состоянии:
./change-iptables-public-ip.sh `curl ifconfig.me/ip`
Теперь почасовые обновления означают, что может быть часовая задержка, когда iptables настроен с неверным адресом. Я мог бы сделать работу более частой (до минуты), но я подумал, что делать подобные вещи с помощью опроса - пустая трата времени, особенно когда ddclient предлагает возможность выполнить скрипт после изменения ip.
Поэтому я вставил это в мой конфиг ddclient:
postscript=/etc/ddclient/change-iptables-public-ip.sh
Я также добавил бит suid change-iptables-public-ip.sh
, но безрезультатно. Когда скрипт выполняется ddclient, это приводит к:
iptables v1.4.18: can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
Мне не нравится идея запуска ddclient от имени пользователя root.
До сих пор у меня была идея запустить процесс от имени root, который прослушивает сокет для нового ip, а затем запускает изменения в iptables. Но прежде чем испачкать руки, я хочу услышать, есть ли там стандартные решения.
1 ответ
Извините за задержку. Были заняты в другом месте...
1) Войдите в систему как root и запустите visudo
2) Добавьте строку, которая выглядит следующим образом:
bob ALL = (ALL) NOPASSWD: /etc/ddclient/change-iptables-public-ip.sh
где "bob" - это учетная запись, с которой запускается ddclient (вам, вероятно, придется поэкспериментировать).
3) Измените строку в вашей конфигурации ddclient так, чтобы она выглядела следующим образом:
postscript = sudo /etc/ddclient/change-iptables-public-ip.sh
Скорее всего, вам нужно будет убить / перезапустить ddclient. Вам нужно будет поэкспериментировать с вышеизложенным, чтобы получить его там, где он будет работать так, как вы этого хотите. Возможно, лучше встроить команду sudo в свой сценарий (для определенных команд), а не запускать весь сценарий с правами доступа root.