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