Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #68, ИЮЛЬ 2006 г.

Королевская рать

 

Спецвыпуск: Хакер, номер #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 выдавать клиентам адрес «ближайшего» к ним котроллера домена.

Назад на стр. 068-014-1  Содержание  Вперед на стр. 068-014-3