Настройка FTP сервера на Windows Server

настройка FTP сервера на Windows Server

Для настройки FTP сервера на Windows Server установите роль Web Server (IIS) с компонентом FTP Server, создайте FTP-сайт через IIS Manager, настройте аутентификацию и права доступа. Весь процесс занимает 15-20 минут, но обязательно включите FTPS, иначе пароли будут летать по сети в открытом виде (а это прямая дорога к проблемам).

Установка роли FTP Server

FTP-сервер в Windows Server это часть IIS. Отдельно не ставится.

# Устанавливаем IIS с компонентом FTP
# Web-Ftp-Server это сам FTP, Web-Ftp-Service служба
Install-WindowsFeature Web-Ftp-Server,Web-Ftp-Service -IncludeManagementTools

# Если IIS уже установлен, добавляем только FTP
Install-WindowsFeature Web-Ftp-Server

# Проверяем что установилось
Get-WindowsFeature Web-Ftp*

Короче, после установки появится FTP в IIS Manager. Но сайт нужно создать руками.

Подготовка: создание пользователей и папок

Перед созданием FTP-сайта подготовим инфраструктуру. Тут такое дело: не стоит использовать доменных администраторов для FTP. Создайте отдельных пользователей.

# Создаём локальную группу для FTP-пользователей
New-LocalGroup -Name "FTP-Users" -Description "Пользователи FTP-сервера"

# Создаём пользователя для FTP
New-LocalUser -Name "ftp-ivanov" -Password (ConvertTo-SecureString "P@ssw0rd!" -AsPlainText -Force) `
    -FullName "Иванов И.И." -Description "FTP доступ"

# Добавляем в группу
Add-LocalGroupMember -Group "FTP-Users" -Member "ftp-ivanov"

# Создаём корневую папку FTP
New-Item -ItemType Directory -Path "E:FTP-Root" -Force

# Настраиваем права доступа
icacls "E:FTP-Root" /grant "FTP-Users:(OI)(CI)M"

Знаете что? Лучше использовать отдельный диск (не системный C:) для данных FTP. Если кто-то зальёт огромный файл и забьёт диск, системный раздел не пострадает.

Создание FTP-сайта через IIS Manager

  1. Откройте IIS Manager (inetmgr)
  2. Правой кнопкой по Sites → Add FTP Site
  3. Задайте имя сайта и путь к папке (например, E:FTP-Root)
  4. Привязка: IP-адрес, порт 21
  5. SSL: выберите «Allow SSL» или «Require SSL» (рекомендую Require)
  6. Аутентификация: Basic (для локальных/доменных учёток)
  7. Авторизация: выберите пользователей и права (Read/Write)

Тут такое дело. Basic-аутентификация передаёт пароль в Base64. Это не шифрование. Поэтому SSL обязателен. Без SSL ваш логин и пароль может перехватить кто угодно в сети.

Создание FTP-сайта через PowerShell

Вот в чём прикол: через PowerShell быстрее и скриптуемо. Можно сохранить скрипт и развернуть FTP на другом сервере за минуту.

# Создаём папку для FTP
New-Item -ItemType Directory -Path "E:FTP-Root" -Force

# Импортируем модуль IIS
Import-Module WebAdministration

# Создаём FTP-сайт
New-WebFtpSite -Name "CompanyFTP" `
    -Port 21 `
    -PhysicalPath "E:FTP-Root" `
    -IPAddress "*"

# Включаем Basic-аутентификацию
# Без этого никто не сможет войти
Set-ItemProperty "IIS:SitesCompanyFTP" `
    -Name ftpServer.security.authentication.basicAuthentication.enabled `
    -Value $true

# Отключаем анонимный доступ (по умолчанию включен!)
Set-ItemProperty "IIS:SitesCompanyFTP" `
    -Name ftpServer.security.authentication.anonymousAuthentication.enabled `
    -Value $false

# Настраиваем авторизацию для группы FTP-Users
# Read и Write доступ
Add-WebConfiguration "/system.ftpServer/security/authorization" `
    -Value @{accessType="Allow";roles="FTP-Users";permissions="Read,Write"} `
    -PSPath "IIS:" -Location "CompanyFTP"

Настройка FTPS (FTP over SSL)

Знаете что, FTP без шифрования это прошлый век. Настраиваем FTPS.

Сначала нужен SSL-сертификат. Для внутреннего использования подойдёт самоподписанный:

# Создаём самоподписанный сертификат для FTP
# Для внешнего доступа лучше Let's Encrypt или купленный
$cert = New-SelfSignedCertificate -DnsName "ftp.company.local" `
    -CertStoreLocation "cert:LocalMachineMy" `
    -NotAfter (Get-Date).AddYears(5)

# Привязываем сертификат к FTP-сайту
# controlChannelPolicy и dataChannelPolicy задают требование SSL
Set-ItemProperty "IIS:SitesCompanyFTP" `
    -Name ftpServer.security.ssl.serverCertHash `
    -Value $cert.Thumbprint

Set-ItemProperty "IIS:SitesCompanyFTP" `
    -Name ftpServer.security.ssl.controlChannelPolicy `
    -Value "SslRequire"

Set-ItemProperty "IIS:SitesCompanyFTP" `
    -Name ftpServer.security.ssl.dataChannelPolicy `
    -Value "SslRequire"

Если честно, для внутренней сети самоподписанный сертификат нормально. Но клиентам придётся принять предупреждение о недоверенном сертификате. Для продакшена берите нормальный сертификат от Let’s Encrypt (бесплатно) или коммерческого CA.

Настройка файрвола

FTP использует два канала: управляющий (порт 21) и данных (пассивный режим, диапазон портов). Оба нужно открыть. Это одна из самых частых причин, почему FTP «не работает» после настройки.

# Открываем порт 21 для управляющего канала
New-NetFirewallRule -Name "FTP-Control" `
    -DisplayName "FTP Control Channel" `
    -Direction Inbound -Protocol TCP `
    -LocalPort 21 -Action Allow

# Настраиваем диапазон пассивных портов в IIS
# FTP Server > FTP Firewall Support > Data Channel Port Range
Set-WebConfigurationProperty -Filter "/system.ftpServer/firewallSupport" `
    -Name "lowDataChannelPort" -Value 49152
Set-WebConfigurationProperty -Filter "/system.ftpServer/firewallSupport" `
    -Name "highDataChannelPort" -Value 49200

# Задаём внешний IP (для NAT-сценариев)
Set-ItemProperty "IIS:SitesCompanyFTP" `
    -Name ftpServer.firewallSupport.externalAddress4 `
    -Value "YOUR_EXTERNAL_IP"

# Открываем диапазон портов для пассивного FTP
New-NetFirewallRule -Name "FTP-Passive" `
    -DisplayName "FTP Passive Data Channels" `
    -Direction Inbound -Protocol TCP `
    -LocalPort 49152-49200 -Action Allow

# Перезапускаем FTP-службу
Restart-Service FTPSVC

Грубо говоря, без настройки пассивного режима FTP не будет работать через NAT и файрволы. Активный режим (порт 20) уже почти никто не использует, потому что он требует, чтобы сервер инициировал подключение к клиенту (а файрволы это блокируют).

Мой знакомый Олег, веб-разработчик из Екатеринбурга, настраивал FTP на HP ProLiant ML110 Gen10 для обмена файлами с клиентами. Два дня не мог понять, почему подключение проходит, а список файлов не загружается. Оказалось, пассивные порты не были открыты на файрволе. Две строчки в PowerShell решили проблему.

Изоляция пользователей

По умолчанию все пользователи видят одну папку. Но можно настроить изоляцию: каждый пользователь видит только свою директорию.

# Включаем изоляцию пользователей
Set-ItemProperty "IIS:SitesCompanyFTP" `
    -Name ftpServer.userIsolation.mode `
    -Value "IsolateAllDirectories"

# Создаём структуру папок для изоляции
# Формат: FTP-RootLocalUserusername или FTP-Rootdomainusername
New-Item -Path "E:FTP-RootLocalUserftp-ivanov" -ItemType Directory
New-Item -Path "E:FTP-RootLocalUserftp-petrov" -ItemType Directory

# Для доменных пользователей
New-Item -Path "E:FTP-Rootcompany.localivanov" -ItemType Directory

Кстати, при изоляции пользователь заходит по FTP и видит свою папку как корневую. Не может подняться выше. Безопасно и удобно. Каждый работает в своём «песочнице».

Ограничение размера файлов и скорости

На самом деле, без ограничений один пользователь может забить весь диск или засорить канал.

# Ограничение максимального размера запроса (50 МБ)
Set-WebConfigurationProperty -Filter "/system.ftpServer/security/requestFiltering" `
    -Name "maxAllowedContentLength" -Value 52428800

# Ограничение скорости для FTP-сайта (в байтах/сек)
# 1048576 = 1 МБ/сек
Set-ItemProperty "IIS:SitesCompanyFTP" `
    -Name limits.maxBandwidth `
    -Value 10485760

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

Проверка работоспособности FTP

После настройки нужно проверить, что всё работает. Вот несколько способов:

# Проверка из командной строки на самом сервере
ftp localhost
# Вводим логин и пароль, пробуем ls и put

# Проверка через PowerShell
$ftpRequest = [System.Net.FtpWebRequest]::Create("ftp://192.168.1.10/")
$ftpRequest.Credentials = New-Object System.Net.NetworkCredential("ftp-ivanov","P@ssw0rd!")
$ftpRequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory
$response = $ftpRequest.GetResponse()
$reader = New-Object IO.StreamReader($response.GetResponseStream())
$reader.ReadToEnd()

# Проверка из другого компьютера
# FileZilla - лучший бесплатный FTP-клиент
# Хост: 192.168.1.10, Порт: 21, Пользователь: ftp-ivanov

Кстати, FileZilla это стандарт для FTP-клиентов. Бесплатный, поддерживает FTP, FTPS и SFTP. Скачивайте только с официального сайта filezilla-project.org. На других сайтах часто подсовывают версии с рекламным ПО.

Тут такое дело: если подключение проходит, но файлы не загружаются, проверьте права NTFS на папку FTP-Root. Пользователь должен иметь права на чтение и запись не только в IIS, но и на уровне файловой системы.

Распространённые проблемы

  • «530 User cannot log in»: проверьте, что Basic-аутентификация включена и пользователь есть в группе FTP-Users
  • «425 Cannot open data connection»: пассивные порты не открыты в файрволе
  • «550 Access denied»: права NTFS на папку не настроены или пользователь не авторизован в FTP-сайте
  • Подключение зависает на PASV: внешний IP не указан в FTP Firewall Support (для NAT)

Логирование и мониторинг

FTP-сервер ведёт логи в формате W3C. Расположение по умолчанию: C:inetpublogsLogFiles.

# Включаем расширенное логирование
Set-ItemProperty "IIS:SitesCompanyFTP" `
    -Name ftpServer.logFile.logExtFileFlags `
    -Value "Date,Time,ClientIP,UserName,ServerIP,Method,UriStem,FtpStatus,Win32Status,BytesSent,BytesRecv,TimeTaken"

# Просмотр логов
Get-Content "C:inetpublogsLogFilesFTPSVC**.log" -Tail 20

Виртуальные директории

Бывает нужно дать доступ к папкам на разных дисках через один FTP-сайт. Для этого используются виртуальные директории.

# Добавляем виртуальную директорию
# Пользователь увидит её как подпапку в FTP
New-WebVirtualDirectory -Site "CompanyFTP" `
    -Name "projects" `
    -PhysicalPath "D:Projects"

New-WebVirtualDirectory -Site "CompanyFTP" `
    -Name "archive" `
    -PhysicalPath "F:Archive"

# Проверяем что директории появились
Get-WebVirtualDirectory -Site "CompanyFTP"

Кстати, виртуальные директории удобны для разделения данных по дискам. Бухгалтерия на одном диске, техотдел на другом. А пользователь видит всё через один FTP-адрес. Права NTFS на каждую папку настраиваются отдельно.

Знаете что? Есть ещё один момент, который часто упускают. Если FTP-сервер будет работать длительное время, стоит настроить автоматическую очистку старых файлов. Иначе через полгода диск будет забит. Можно создать простой скрипт в планировщике задач:

# Удаляем файлы старше 90 дней из папки Temp
Get-ChildItem "E:FTP-RootTemp" -Recurse |
    Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-90) } |
    Remove-Item -Force

# Логируем сколько места освободили
$freeSpace = (Get-PSDrive E).Free / 1GB
Write-Output "Свободно на E: $([math]::Round($freeSpace, 2)) ГБ" |
    Out-File "C:Logsftp-cleanup.log" -Append

Дмитрий из Новосибирска, админ на HPE ProLiant DL360 Gen10, не настроил очистку. Через 4 месяца диск на 500 ГБ был забит полностью. Пользователи заливали файлы, но никто не удалял. С тех пор у него скрипт очистки запускается каждое воскресенье в 3 часа ночи.

Безопасность FTP: защита от брутфорса и сканирования

Короче, если ваш FTP-сервер смотрит в интернет, его начнут ломать в первые же часы. Боты сканируют весь интернет и пробуют подключиться к каждому открытому порту 21 со стандартными логинами: admin, root, ftp, anonymous.

# Настраиваем блокировку после неудачных попыток входа
# В IIS Manager: FTP Site > FTP Logon Attempt Restrictions
# Или через PowerShell:
Set-WebConfigurationProperty -Filter "/system.ftpServer/security/authentication/denyByFailure" `
    -PSPath "IIS:" -Location "CompanyFTP" `
    -Name "enabled" -Value $true

Set-WebConfigurationProperty -Filter "/system.ftpServer/security/authentication/denyByFailure" `
    -PSPath "IIS:" -Location "CompanyFTP" `
    -Name "maxFailure" -Value 5

Set-WebConfigurationProperty -Filter "/system.ftpServer/security/authentication/denyByFailure" `
    -PSPath "IIS:" -Location "CompanyFTP" `
    -Name "entryExpiration" -Value "00:30:00"

Мой приятель Василий из Казани (админ в типографии, сервер Lenovo ThinkSystem ST50 V2 на Xeon E-2324G) открыл FTP-сервер в интернет для приёма макетов от клиентов. За первую ночь в логах появилось 3000 попыток подключения с разных IP. Все неудачные. Но без блокировки это создавало нагрузку на сервер. Включил denyByFailure с порогом в 5 попыток и добавил IP-фильтрацию: разрешил подключения только из российских диапазонов. Количество левых попыток сократилось на 95%.

# IP-фильтрация для FTP: разрешаем только определённые адреса
# В IIS Manager: FTP IPv4 Address and Domain Restrictions
Add-WebConfiguration "/system.ftpServer/security/ipSecurity" `
    -Value @{ipAddress="0.0.0.0";subnetMask="0.0.0.0";allowed="false"} `
    -PSPath "IIS:" -Location "CompanyFTP"

# Разрешаем конкретную подсеть
Add-WebConfiguration "/system.ftpServer/security/ipSecurity" `
    -Value @{ipAddress="192.168.1.0";subnetMask="255.255.255.0";allowed="true"} `
    -PSPath "IIS:" -Location "CompanyFTP"

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

Альтернативы FTP

На самом деле FTP это устаревший протокол. Есть варианты получше:

  • SFTP (SSH File Transfer Protocol) безопаснее FTP, но требует OpenSSH Server (есть в Windows Server 2019+). Работает через один порт (22), никаких проблем с пассивным режимом
  • WebDAV работает через HTTPS, проще с файрволами. Клиент, это обычный браузер или проводник Windows
  • SMB over VPN для внутреннего обмена файлами. Простая настройка, привычный интерфейс
  • Облачные хранилища (OneDrive, SharePoint, Яндекс.Диск) для обмена файлами с внешними партнёрами

Но FTP до сих пор используется. Веб-хостинг, обмен большими файлами, автоматическая загрузка данных. А ещё куча legacy-систем, которые умеют только FTP. Если честно, FTP не умрёт ещё лет 10, потому что слишком много систем от него зависит. Тут такое дело: если вы настраиваете FTP для нового проекта с нуля, рассмотрите SFTP через OpenSSH. А если поддерживаете существующую инфраструктуру, где FTP уже используется, просто настройте FTPS и защиту от брутфорса.

Татьяна, системный администратор из Москвы, перешла с FTP на SFTP через OpenSSH на Lenovo ThinkSystem ST50. Говорит, настройка заняла 10 минут, а головной боли с портами и файрволами стало в разы меньше. Один порт 22 вместо 21 + диапазон пассивных. Разве это не лучше?

Лицензирование

FTP Server входит в роль IIS, которая включена в Windows Server. Отдельная лицензия не нужна. Лицензию на сам Windows Server можно приобрести в keytrust24.store. Ну и как обычно, моментальная доставка и активация.