Конфликты портов SSH: как определить и изменить порты

Устраните раздражающие проблемы с подключением SSH, вызванные конфликтами портов. Это руководство подробно описывает, как окончательно определить активный порт SSH с помощью системных команд (ss/netstat), и предоставляет пошаговую безопасную методологию изменения конфигурационного файла (sshd_config) и обновления брандмауэров для переключения на новый номер порта, предотвращая блокировку доступа.

Конфликты портов SSH: как определить и изменить порты

Обычно SSH прослушивает TCP-порт 22, но реальные серверы не всегда так аккуратны. Облачный образ может перенести SSH на порт 2222. Хост контейнеров может публиковать несколько SSH-подобных сервисов через разные порты. Сценарий усиления безопасности мог изменить sshd_config несколько месяцев назад. Или sshd может просто не запуститься, потому что другой процесс уже привязан к тому же адресу и порту.

Проблемы с портами обычно проявляются как Connection refused или Connection timed out. Разница важна: отказ обычно означает, что вы достигли хоста, но ничто не приняло соединение на этом порту. Тайм-аут обычно означает, что брандмауэр, маршрут, группа безопасности или сетевой путь отбросили трафик.


Понимание конфликтов портов SSH

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

Для SSH настоящий конфликт привязки означает, что sshd не может прослушивать настроенный адрес и порт. Более распространенная проблема проще: SSH прослушивает один порт, а клиент или брандмауэр используют другой.

Распространенные проблемы подключения, связанные с портами

При устранении неполадок с подключением SSH проблемы с портами часто проявляются следующим образом:

  1. Отказ в соединении: Обычно это означает, что целевая машина доступна, но ни один сервис активно не прослушивает указанный порт (либо использован неправильный порт, либо служба SSH не запустилась).
  2. Тайм-аут соединения: Часто указывает на то, что трафик, предназначенный для этого порта, блокируется брандмауэром (либо на уровне хоста, либо на уровне сети) или что сам хост недоступен.

Шаг 1: Определение текущего активного порта SSH

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

A. Проверка конфигурационного файла SSH

Основное местонахождение конфигурации SSH — файл sshd_config. Директива Port указывает, какой порт прослушивает sshd.

Расположение: /etc/ssh/sshd_config (обычно в системах Linux/Unix)

Используйте текстовый редактор, например nano или vim, для просмотра файла:

sudo nano /etc/ssh/sshd_config

Найдите строку, начинающуюся с Port. Если она закомментирована, OpenSSH использует порт по умолчанию 22, если только другой включенный конфигурационный файл не переопределяет его.

#Port 22
Port 2222

Также проверьте включенные фрагменты конфигурации:

grep -R "^[[:space:]]*Port" /etc/ssh/sshd_config /etc/ssh/sshd_config.d 2>/dev/null

B. Проверка прослушивающих сокетов с помощью netstat или ss

Самый авторитетный способ подтвердить, к какому порту в данный момент привязан сервис, — это проверить сетевые прослушивающие сокеты операционной системы. Современный инструмент — ss, но netstat все еще широко доступен.

Использование команды ss (рекомендуется на современных системах):

Эта команда показывает все TCP-слушатели (-t), включая процессы (-p), с фильтрацией по службе SSH (grep sshd).

sudo ss -tlpn | grep sshd

Пример вывода (порт по умолчанию):

LISTEN 0      128    0.0.0.0:22               0.0.0.0:*    users:(("sshd",pid=1234,fd=3))

Пример вывода (пользовательский порт 2222):

LISTEN 0      128    0.0.0.0:2222             0.0.0.0:*    users:(("sshd",pid=1234,fd=3))

Использование netstat (альтернатива):

sudo netstat -tulpn | grep sshd

Как только вы определите порт (например, 2222), вы должны использовать этот номер порта при подключении с удаленного клиента.


Шаг 2: Безопасное изменение порта SSH

Изменение порта SSH — распространенная практика усиления безопасности. Крайне важно никогда не менять порт, не убедившись, что ваша новая конфигурация работает, иначе вы рискуете заблокировать себе доступ.

A. Безопасная последовательность изменения портов

Следуйте этим шагам точно, чтобы избежать потери доступа:

  1. Проверьте доступность брандмауэра: Убедитесь, что новый порт открыт в вашем хост-брандмауэре (например, ufw или firewalld) до перезапуска службы SSH.
  2. Отредактируйте конфигурацию: Измените /etc/ssh/sshd_config на новый номер порта.
  3. Проверьте синтаксис конфигурации: Проверьте синтаксис конфигурации перед перезапуском.
  4. Перезапустите службу SSH: Примените изменения.
  5. Проверьте удаленное подключение: Немедленно попробуйте подключиться, используя новый порт, из отдельного сеанса терминала.
  6. Удалите старое правило порта (необязательно): После проверки закройте старый порт (22) в брандмауэре.

B. Изменение /etc/ssh/sshd_config

Используйте ваш предпочтительный редактор, чтобы открыть конфигурационный файл:

sudo nano /etc/ssh/sshd_config

Найдите строку Port. Измените существующее значение или раскомментируйте/добавьте новую директиву Port. Давайте изменим с 22 на 2222.

# Измените эту строку:
Port 2222

Сохраните и закройте файл.

C. Обновление хост-брандмауэров (критический шаг)

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

Использование UFW (Ubuntu/Debian):

# 1. Разрешите новый порт
sudo ufw allow 2222/tcp

# 2. Если вы хотите удалить правило старого порта позже (после тестирования):
# sudo ufw delete allow 22/tcp

sudo ufw status verbose

Использование Firewalld (RHEL/CentOS/Fedora):

# 1. Разрешите новый порт постоянно
sudo firewall-cmd --permanent --add-port=2222/tcp

# 2. Перезагрузите правила брандмауэра
sudo firewall-cmd --reload

D. Тестирование и перезагрузка демона SSH

Всегда проверяйте синтаксис конфигурационного файла перед применением изменений:

sudo sshd -t

Если синтаксис чист, перезагрузите или перезапустите службу:

sudo systemctl reload sshd
# Если ваша система использует имя службы ssh вместо:
# sudo systemctl reload ssh

Затем проверьте статус:

sudo systemctl status sshd

Оставьте ваш текущий сеанс SSH открытым и протестируйте новый порт из отдельного терминала, прежде чем закрывать что-либо.

E. Подключение через новый порт

С вашей клиентской машины теперь вы должны явно указать новый порт, используя флаг -p с командой ssh:

ssh username@your_server_ip -p 2222

Если подключение прошло успешно, изменение порта сработало. Только после этого следует удалить старое правило брандмауэра.

Предупреждение: Если вы измените порт и не откроете его в брандмауэре, или если sshd не перезагрузится, вы можете заблокировать себе доступ. Держите консоль, последовательный порт, облачное восстановление или другой административный путь доступным.


Устранение неполадок подключения после изменения порта

Если после изменения порта вы получили ошибку, воспользуйтесь этим кратким контрольным списком:

Симптом ошибки Вероятная причина(ы)
Отказ в соединении 1. sshd не запустился (проверьте systemctl status sshd). 2. Вы указали неправильный порт в команде клиента. 3. Брандмауэр разрешает трафик на старом порту (22), но блокирует новый порт (2222).
Тайм-аут соединения 1. Хост не работает. 2. Хост-брандмауэр (UFW/firewalld) активно отбрасывает пакеты для нового порта. 3. Сетевой брандмауэр инфраструктуры блокирует порт.

Чтобы подтвердить, что демон прослушивает, повторно выполните sudo ss -tlpn | grep sshd на стороне сервера.

Более безопасный способ думать об изменении портов

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

ssh -p 2222 username@your_server_ip

Изменение порта SSH может уменьшить количество шумных автоматических сканирований порта 22, но это не замена аутентификации по ключу, разумным правилам брандмауэра, обновленным системам и отключению входа по паролю, где это уместно.