Powershell – анализ маршрутов таблицы маршрутизации


 

В статье Powershell – проверка принадлежности IP-адреса подсети я привел функцию, которая проверяет принадлежность IP-адреса  заданной подсети. Цель была сделать анализ маршрутов при роутинге. Но когда начал писать код для анализа, то понял, что эта функция не поможет, потому что нужно выполнять анализ не просто вхождения, а анализ полной таблицы в бинарном виде. К моему удивлению .Net не содержит подобные функции бинарных операций для типа [Net.IPAddress]. Поэтому пришлось делать лобовое решение: преобразовать бинарную информацию в строки из нулей и единиц и уже анализировать их – в конце-концов нам же не десятки тысяч маршрутов анализировать из таблицы магистрального роутера… хотя …

Вот что получилось:

 

# Адрес для проверки

#

$ip = [pscustomobject]@{

 

       SiteIPNet = [Net.IPAddress]«172.17.26.1″;

       SiteIPMask = [Net.IPAddress]«255.255.255.255»;

       SiteIPBinary = «»

 

}

 

# Массив маршрутов

#

$Routes = @(

[pscustomobject]@{

 

       SiteIPNet = [Net.IPAddress]«172.16.0.0»;

       SiteIPMask = [Net.IPAddress]«255.255.0.0»;   # /16

       SiteIPBinary = «»

 

};

 

[pscustomobject]@{

 

       SiteIPNet = [Net.IPAddress]«172.16.225.0»;

       SiteIPMask = [Net.IPAddress]«255.255.255.0»;  # /24

       SiteIPBinary = «»

 

};

 

[pscustomobject]@{

 

       SiteIPNet = [Net.IPAddress]«172.16.226.0»;

       SiteIPMask = [Net.IPAddress]«255.255.255.0»; # /24

       SiteIPBinary = «»

 

};

 

[pscustomobject]@{

 

       SiteIPNet = [Net.IPAddress]«172.16.227.0»;

       SiteIPMask = [Net.IPAddress]«255.255.255.0»; # /24

       SiteIPBinary = «»

 

}

)

 

# Получаем сеть

# Из меняем порядок байтов на обратный

# Преобразуем в строку битов

# Дополняем слева нулями, чтобы общая длина была равна 64 бит

#

$Routes | % {$_.SiteIPBinary = [Convert]::ToString([System.Net.ipaddress]::HostToNetworkOrder($_.SiteIPNet.address -band $_.SiteIPMask.address),2).PadLeft(64, ‘0’)}

 

# Сортируем сети по убыванию

# (При сравнении первой будет сеть с наиболее точной маской)

#

$Routes = $Routes | Sort-Object -Property SiteIPBinary -Descending

 

 

# Находим в какие сети попадает заданный ip адрес

# и берем первую иначе возвращаем $null

#

@($Routes | ? {$_.SiteIPBinary -eq [Convert]::ToString([System.Net.ipaddress]::HostToNetworkOrder($ip.SiteIPNet.address -band $_.SiteIPMask.address),2).PadLeft(64, ‘0’)})[0]

 

 

 

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: