Pull to refresh

Teamviewer, powershell и циска

Reading time4 min
Views34K
Поставили мне тут задачку прикрыть доступ посредством софтины Teamviewer к нашей сети извне. Предыстория вопроса немного грустная – исторически сложилось, что таким образом программер-подрядчик удалённо подключался к серверу с базами 1С. Да, всё неправильно и сложно, и попытки что-то изменить как технически, так и организационно, натыкались на противодействие бухгалтерии. Но речь не об этом, а о блокировке этого самого Teamviewer’а.

Первым делом я, конечно, полез в поиск. Нашел пару десятков топиков с обсуждением данного вопроса, посмотрел, как народ блочит эту софтину с переменным успехом. Проблема в том, что серверов, к которым она коннектится, ну очень уж много, пропустить что-то легко, и в комментах к спискам найденных диапазонов люди часто жаловались, что у них это решение не работает.



Ну что ж, ставим рядом два компа, устанавливаем на них Teamviewer’ские программулины – чтобы вживую сразу видеть, получается или нет.

Блокировка порта tcp 5938, судя по комментам, давно уже не работает, с выпуска прошлой версии. На всякий случай сделал, конечно, правило на блокировку входящих-выходящих по этому порту, а также по найденному где-то tcp 9997. Мгновенного эффекта не случилось, но счётчик на циске зафиксировал срабатывания. Ну, пусть будет.

Дальше я начал шерстить все найденные товарищами диапазоны. Где-то на пятом прочитанном топике и четвертом добавленном десятке диапазонов была зафиксирована надёжная блокировка, после нескольких попыток софтина рапортует о невозможности подключения. Ура! Первичная цель достигнута, но хочется большего. Восемьдесят, девяносто, или даже девяносто пять процентов – недостаточная надёжность.

Решил заняться этой проблемой поглубже. Для начала, хотелось понять, как можно составить более полный список Teamviewer’ских хостов. В принципе, товарищами на форумах высказывалась идея о том, что нужно блокировать сервера вида serverN.teamviewer.com, где N – числа. Но, во-первых, я пока не разобрался, как сделать _отключаемую_ блокировку по имени хоста средствами циски, а во-вторых, блокировка “голых” IP в любом случае будет очень полезна в качестве дополнительной защиты.

Возникла простая идея – перебрать в цикле все имена и отресолвить их в IP. Я большой поклонник командной строки, поэтому сначала поискал подходы к тому, чтобы решить задачу с помощью батника. Прикинул – да, в принципе, можно парсить вывод nslookup, но как-то это коряво будет. А что если через Powershell?


Погуглив, быстро нашел подходящий класс .Net. Немного поэкспериментировав, понял, что эта схема работает замечательно — особенно понравилось, что если имя ресолвится в несколько айпишников, все они аккуратно кладутся в массив. Каждый айпишник добавляется в массив результатов, который потом сортируется и чистится от дубликатов одной командой Sort, и скидывается в текстовый файл. В конце маленький штрих для удобства – текстовый файл открывается в блокноте, чтобы не искать его по диску. Да, Powershell — очень удобный и могучий инструмент.

Текст скрипта (Powershell v2):

### Получение всех-всех-всех серверов Teamviewer. Ну, по крайней мере, забитых в их поддомены.
 
## Инициализация
$result_ips       = "C:\!scripts\teamviewer\result_tv_IPs.txt"
$result_addresses = "C:\!scripts\teamviewer\result_tv_addresses.txt"
del $result_ips
del $result_addresses
$servers=@()
 
## Начало
serverN.teamviewer.com - 101-11500, 646 хостов [2011-11]
for ($i=1; $i -le 11500; $i++) {
   echo $i;
   $cur_server="server" + $i + ".teamviewer.com"
   echo $cur_server
   [System.Net.Dns]::GetHostAddresses($cur_server)|% {
      if ($? -eq $true) {echo $cur_server |out-file -append $result_addresses};
      $servers+=$_.IPAddressToString
   }
}
 
# masterN.teamviewer.com - 1-16 [2011-11]
for ($i=0; $i -le 20; $i++) {
   echo $i;
   $cur_server="master" + $i + ".teamviewer.com"
   echo $cur_server
   [System.Net.Dns]::GetHostAddresses($cur_server)|% {
      if ($? -eq $true) {echo $cur_server |out-file -append $result_addresses};
      $servers+=$_.IPAddressToString
   }
}
 
# pingN.dyngate.com - 2-3
for ($i=0; $i -le 10; $i++) {
   echo $i;
   $cur_server="ping" + $i + ".dyngate.com"
   echo $cur_server
   [System.Net.Dns]::GetHostAddresses($cur_server)|% {
      if ($? -eq $true) {echo $cur_server |out-file -append $result_addresses};
      $servers+=$_.IPAddressToString
   }
}
   
# Сортировка и вывод результатов
$servers | sort-object -unique | out-file $result_ips
notepad.exe $result_ips
start-sleep -milliseconds 800  # пауза, просто так
notepad.exe $result_addresses


Отдельные моменты по этому скрипту:

— Строка $servers=@() инициирует массив, без этого Powershell путается в типах.
— [System.Net.Dns]::GetHostAddresses() – класс .NET, получающий IP-адреса по имени.
— IPAddressToString – метод, преобразовывающий результат в обычную строку.


В качестве промежуточного итога: Powershell жутко удобен для таких вот специфических админских задачек

(Как получившиеся подсети, числом около двухсот, попали в циску – предмет для отдельного топика, а то и так получается многобукв. Планирую доработать этот процесс)

Результаты – шесть с половиной сотен полученных адресов, надёжное решение задачи и +5 к навыку “администрирование” :-)


Поначалу может возникнуть желание заблокировать эти диапазоны с большим запасом. Однако, я быстро наткнулся на то, что один из серверов moskva.fm, 85.17.138.68, попал в закрытый таким образом диапазон 85.17.*.* — намного безопаснее делать правила более частного вида, на подсети /24 (85.17.136.* и 85.17.87.*). Как вариант, можно вообще блокировать отдельные айпишники по списку, но это уже менее надёжно с точки зрения изначальной задачи блокировки Teamviewer – думаю, появление новых его серверов “рядом” с уже имеющимися гораздо более вероятно, чем в новых диапазонах.
Tags:
Hubs:
+17
Comments51

Articles

Change theme settings