вторник, 16 мая 2017 г.

Windows Azure Pack. Ограничение пропускной способности сети для соединений NAT

Периодически администраторы инфраструктуры IaaS, построенной на базе Windows Azure Pack, сталкиваются с проблемами сети, связанными с вредоносной активностью виртуальных машин клиентов. Типичная ситуация - была создана ВМ с простым паролем и настроен NAT на стандартный SSH (22) или RDP (3389) порт. Очень быстро данную брешь обнаруживают многочисленные ботнеты и захватывают контроль над сервером. После чего занимаются такими полезными делами как DDoS, брутфорс и рассылка спама. В некоторых случаях от этого могут страдать другие клиенты Windows Azure Pack.


Итак, как же настроить ограничение для входящего и исходящего трафика NAT соединений клиентских подпискок Windows Azure Pack? Изначально ответ на данный вопрос кажется очевидным - включить его в тарифных планах:




Задаем данные ограничения для тарифного плана, синхронизируем с подпиской и проверяем:

foreach ($i in (Get-SCVMNetwork | ?{$_.VMNetworkGateways -ne $null})) {$GW = Get-SCVMNetworkGateway -VMNetwork $i; Get-SCNATConnection -VMNetworkGateway $GW | ?{$_.MaximumBandwidthInboundKbps -ne $null}}

Упс, данная строка не показала ничего, хоть мы выполнили поиск для всех VMNetworks. Оказывается, это ограничение устанавливается для Site-To-Site VPN тоннелей:

foreach ($i in (Get-SCVMNetwork | ?{$_.VMNetworkGateways -ne $null})) {$GW = Get-SCVMNetworkGateway -VMNetwork $i; Get-scVpnConnection -VMNetworkGateway $GW | ?{$_.MaximumBandwidthInboundKbps -ne $null} | fl Name, MaximumBandwidthInboundKbps}

Name                        : tema2linby
MaximumBandwidthInboundKbps : 100000

Очевидно, не правда ли?


Так как через Windows Azure Pack настроить ограничения не получается, я попробовал выполнить это через System Center VMM 2016. Для этого был написан скрипт:

#Import module
Import-Module -Name "virtualmachinemanager"

#Set limit in Kpps 

$OutboundLimit  = 100000
$InboundLimit = 100000

foreach ($VMNetwork in (Get-SCVMNetwork | ?{$_.VMNetworkGateways -ne $null})) {

    #Get List Gateways

    $GW = Get-SCVMNetworkGateway -VMNetwork $VMNetwork

    #Get List NAT connections with unset bandwidth

    $NATConnections = Get-SCNATConnection -VMNetworkGateway $GW | ?{$_.MaximumBandwidthOutboundKbps -EQ $null}

   ### Set NAT connection

  Foreach ($NATConnection in $NATConnections) {

     Set-SCNATConnection $NATConnection -MaximumBandwidthInboundKbps 1000

  }

}

Вроде все выполнено правильно, но в результате выполнения мы получаем ошибку. К сожалению, изменять данную настройку для сетей HNVGRE пока что нельзя. Поэтому остается единственный вариант - использовать "Port profiles". Выглядит это примерно так:



Минус данного решения в том, что ограничивается скорость сети в том числе и для внутренних соединений. Но это все же лучше, чем отдавать весь внешний канал для одной виртуальной машины.

На текущий момент я остановился на варианте, при котором в качестве значения по умолчанию для всех виртуальных коммутаторов ВМ устанавливается "Classification", созданная на основе "Port profile" c ограничением ширины канала. В тех случаях, когда требуется более высокая скорость передачи данных в локальной сети, предлагаю создать дополнительную сеть, для которой "Classification" будет другая, без ограничений скорости передачи данных.

Пока что данное решение нареканий не вызывает. Если запросы станут массовыми, то будет написан простейший скрипт, который получает настройки VMNetwork, к которой подключен Virtual Switch а затем, в зависимости от того, включен NAT или нет, установит Classification. Самое главное - это проработать вопрос с исключениями, ведь для некоторых клиентов нужен более широкий внешний канал. Поэтому пока что вопрос решается вручную, но когда у меня будет достаточно данных, я задачу автоматизирую.

На этом все. Если есть дополнительные вопросы или альтернативные варианты - вы можете написать на мне на почту или в оставить сообщение в комментариях.


Комментариев нет:

Отправить комментарий