Королевская рать
Спецвыпуск: Хакер, номер #068, стр. 068-014-2 Клиенты, посылающие запрос на разрешение имени, будут получать все адреса, однако порядок их следования в ответе будет меняться. В результате, при обращении к одному FQDN, разные клиенты (или один клиент в различные моменты времени) будут использовать различные IP-адреса. То есть фактически подключаться к разным серверам. Огромным преимуществом DNS Round Robin является простота развертывания и использования. Недостатком же является отсутствие механизмов определения отказа узла. То есть в случае выхода из строя одного из серверов, клиенты все равно будут пытаться соединиться с ним до истечения времени жизни записи в кэше клиента DNS. И только вмешательство администратора, удалившего запись с адресом отказавшего узла из зоны DNS, может спасти ситуацию. Конечно, этот процесс можно автоматизировать путем проверки доступности узла и автоматического удаления его из DNS при недоступности, однако в этой ситуации возникает вопрос доступности той машины, на которой запущена контролирующая программа. ЛИСТИНГ пример простого сценария, проверяющего доступность указанного сервера, и в случае отсутствия отклика удаляющего его из зоны DNS-сервера CheckServer "isa.example.com", "192.168.0.10" Function CheckServer(strHostName, strIP) If Ping(strIP)<>1 Then DeleteRecord strHostName, strIP End If End Function Function DeleteRecord(strHostName, strIP) set objDNS = GetObject("winMgmts:root\MicrosoftDNS") set objDNSServer = objDNS.Get("MicrosoftDNS_Server.Name='.'") set objRRs = objDNS.ExecQuery(" select * " & _ " from MicrosoftDNS_ResourceRecord " & _ " where OwnerName = '" & strHostName & "'" & _ " Or RecordData = '" & strHostName & "'") if objRRs.Count < 1 then WScript.Echo "No such server " & strHostName else for each objRR in objRRs If InStr(objRR.TextRepresentation, strIP) Then objRR.Delete_ WScript.Echo "Server down, record deleted: " & _ objRR.TextRepresentation End If next end if End Function Function Ping(address) WMI = "winmgmts:{impersonationLevel=impersonate}" wqlQuery = "SELECT StatusCode FROM Win32_PingStatus WHERE Address" & _ " = '" & address & "'" set PingResult = GetObject(WMI).ExecQuery(wqlQuery, "WQL", 48) For Each result in PingResult if result.StatusCode=0 then ping=1 else ping=0 end if Next End Function Сценарий может запускаться как на сервере DNS, так и на других машинах, но в этом случае необходимо указать имя сервера в параметре MicrosoftDNS_Server.Name. Ну и, естественно, учетная запись, по которой работает сценарий, должна иметь права на управление сервером DNS (по умолчанию – Administrators). По умолчанию поддержка Round Robin включена в Microsoft DNS Server, но может быть отключена путем модификации параметров реестра HKLM\System\CurrentControlSet\Services\DNS\Parameters\ RoundRobin и HKLM\System\CurrentControlSet\Services\DNS\Parameters\ DoNotRoundRobinTypes. Первый из них включает или отключает поддержку технологии для всего сервера, а второй позволяет отключить балансировку для некоторых типов записей, например SRV, чтобы Round Robin не мешал серверу DNS выдавать клиентам адрес «ближайшего» к ним котроллера домена. |