Я установил свой собственный динамический DNS-сервер с помощью Bind на Debian Jessy. Все работает нормально и плавно. Фактическое обновление ddns выполняется с помощью nsupdate (выполняется php на том же сервере). Сама ссылка php зашифрована с помощью https, но мне было интересно, зашифрована ли команда nsupdate, которая также включает строку секретного ключа ddns? Теоретически и вообще говоря, если бы он не был зашифрован, кто-то мог бы прочитать секретный ключ во время передачи, что позволило бы ему самому отправлять обновления ddns на сервер?
Если да, то есть ли способ гарантировать, что nsupdate запускается только локально (так как в любом случае он выполняется на том же / моем сервере) или какие-либо другие меры безопасности? В настоящее время в строках используется официальное DNS-имя сервера в команде nsupdate вместо localhost или чего-то подобного (не уверен, что это вообще поддерживается):
server ns1.external-domain-name.de
zone external-domain-name.de.
key ddns.external-domain-name.de.key MySecretKey12345
update delete ddns.external-domain-name.de.
update add ddns.external-domain-name.de 60 A
send
Секрет зашифрован. Мы не можем сказать вам сила о шифровании, поскольку вы не предоставили нам подробностей (HMAC-MD5 через TSIG и т. д.), но можно с уверенностью предположить, что секреты DDNS включают какую-то криптографическую оболочку. В противном случае, как вы заметили, они были бы восприимчивы к атакам повторного воспроизведения.
Команды можно отправлять в открытом виде, но секретный ключ, используемый для разрешения обновлений, - нет.
Но в любом случае, если вам нужно делать обновления на одном и том же хосте, проще использовать -l
вариант с nsupdate
. Он будет использовать самогенерируемый ключ и связываться только с localhost:
-l
Режим только локального хоста. Это устанавливает адрес сервера на localhost (отключение сервера, чтобы адрес сервера нельзя было переопределить). Соединения с локальным сервером будут использовать ключ TSIG, находящийся в /var/run/ named/session.key, который автоматически генерируется named, если какая-либо локальная главная зона установила политику обновления как local.
Для этого вам нужно добавить update-policy local;
в определении вашей динамической зоны:
zone "dyn.example.com" {
type master;
file "/var/cache/bind/dyn.example.com";
update-policy local;
};
И вам нужно перезапустить сервер с помощью systemctl restart bind9
или эквивалент в вашей системе. rndc reload
недостаточно для создания специального ключа local-ddns.
Если вам нужно больше правил в вашем update-policy
, вам нужно заменить это update-policy local;
с разделом, который включает grant local-ddns zonesub ANY;
вместо. У вас не может быть одновременно простой "локальной" линии и реального раздела политики. Значит вам нужно что-то вроде этого:
zone "dyn.example.com" {
type master;
file "/var/cache/bind/dyn.example.com";
update-policy {
grant local-ddns zonesub ANY; // Generates a "local-ddns" key in /var/run/named/session.key
// other update policies
// grant *.dyn.example.com. self *.dyn.example.com. ANY;
};
};
Затем вы можете делать такие обновления:
host=myhost: ip=10.1.2.3.4
printf "update add $host.dyn.example.com. 3600 A $ip\n\n" | nsupdate -l
Если вы используете файлы конфигурации для подачи nsupdate -l
, у вас не может быть server ...
в них, иначе вы получите такую ошибку:
cannot reset server in localhost-only mode
syntax error