Однажды я убивал время в небольшой организации, в которой главный бухгалтер работала из дома со своего личного ноутбука. Взаимодействие с 1С происходило без каких-то особенных проблем — на сервере организации был поднят реверс-прокси с TLS посредством которого сотрудники работали с веб-клиентом 1С прямо из браузера. Опытный читатель уже сейчас скажет, что концепт «так себе», особенно с учётом личных устройств и бухгалтерии — и будет безоговорочно прав. Если еще немного поднять градус непотребства, то представьте задачу подключить сетевой принтер Hewlett-Packard  (который расположен в офисе фирмы) к этому самому личному ноутбуку. Решение «в лоб» такое: у сетевых принтеров Hewlett-Packard есть технология под названием JetDirect. Пробрасываем наружу TCP-порт 9100, на удалённой машине просто подключаем сетевой принтер с указанием «белого» IP адреса офиса и проброшенным портом. Есть одно «но» — аутентификация, как сделать чтобы никто из нежелательных гостей не смог воспользоваться принтером? Правильный ответ — подобные службы вообще не должны быть выставлены наружу, но наш ответ (я ведь обещал поднять градус?) — это Port Knocking.

Офисная сеть предприятия сделана на базе маршрутизатора Mikrotik, на нём же были настроены правила Port Knocking. Есть много статей на тему конкретных реализаций, я же приведу краткое описание самой сути Port Knocking — если последовательно попытаться установить соединения по определенным портам в пределах ограниченного времени, то адрес удаленного клиента будет в занесен в «белый» список. Находясь в этом «белом» списке можно обращаться к сетевым службам на других портах, доступ к которым возможен только для перечня хостов из «белого» списка. Вот такой несложный и бесхитростный приём. Если дополнить этот концепт, например, Honey Pot — это будет уже «что-то», лучше чем совсем ничего. И, тем не менее, я настоятельно рекомендую озаботиться VPN — особенно если речь идёт о связке центрального офиса и филиала (путь даже в лице одного ноутбука).

С серверной частью, я думаю, всё более-менее понятно. Теперь к части клиентской — я составил небольшой скрипт на PowerShell для «простукивания» портов, его содержимое я привожу ниже:


# Адрес и порты для подключения
$ipAddress = "123.45.67.89"
$ports = @(21,22,80)

# Функция для попытки подключения к данному порту
function Test-TcpPort
{
  param (
    [string]$ip,
    [int]$port
  )
  try
  {
    # Создание TCP клиента
    $tcpClient = New-Object System.Net.Sockets.TcpClient

    # Установка соединения с таймаутом 1000 мс
    $tcpClient.ConnectAsync($ip, $port).Wait(100) > $null

    if ($tcpClient.Connected)
    {
      $tcpClient.Close()
    }
    else
    {
      Write-Host "Knocking TCP port: $port"
    }
  }
  catch
  {
    Write-Host "[!] $port - $_"
  }
}

# Цикл для подключения к каждому порту
foreach ($port in $ports)
{
  Test-TcpPort -ip $ipAddress -port $port
  Start-Sleep -Seconds 1 # Ждем 1 секунду перед следующим подключением
}
Write-Host "Knocked!"

Отличительной особенностью скрипта является то, что он нормально работает в Windows 7 (в отличии от подавляющего большинства альтернативных реализаций). Дело осталось за малым — достаточно подвязать выполнение этого скрипта через планировщик задач. Можно ограничиться ярлычком на рабочем столе с твёрдым наказом «сначала запускать скрипт — потом печатать», тут решайте сами, как правильно все обставить. Скачать отформатированную версию можно здесь.