SSH сбрасывает порт по умолчанию при перезагрузке

12

Я изменил свой порт SSH по умолчанию на моем домашнем сервере (в /etc/ssh/sshd_configфайле) к порту 54747, а затем перезапущен sshи sshdуслуги (никогда не уверен , какой из них, так что я сделал и просто , чтобы быть безопасным). Чтобы проверить мою конфигурацию, я вышел из системы и снова вернулся в нее без проблем.

Пару дней спустя я установил apt-обновления, а затем перезагрузил свой сервер. Когда я попытался снова войти в SSH (через порт 54747), я получил ошибку отказа в соединении.

По какой-то причине я попытался использовать SSH для порта по умолчанию, и это сработало! Я вернулся, чтобы проверить sshd_config, но он все еще имел собственный порт. Поэтому я возобновил sshи sshdуслуги, и вернулся к «регулярному» поведению (SSH на порт 54747). Я попытался перезагрузиться снова, и соединение снова отказалось ...

Кто-нибудь знает, что я сделал не так?

Дополнительные детали:

  • Ubuntu 16.04.2 LTS
  • Сервер также используется HTPC, с открытым сеансом (тот же пользователь, что и SSH) на моем телевизоре
  • Я использую SSH, используя ключ RSA на моем ноутбуке, и отключил проверку пароля
  • Я имел обыкновение перезагружаться sudo reboot -h now, но после поиска я обнаружил, что некоторые люди не одобряют его, поэтому я попытался sudo reboot, но без различий

РЕДАКТИРОВАТЬ Последовательность событий:

  1. Измените порт SSH с 22 на 54747 в /etc/ssh/sshd_config
  2. Перезапустите службы ssh и sshd
  3. Завершить текущий сеанс SSH
  4. SSH успешно вернулся на порт 54747
  5. перезагрузка
  6. Ошибка соединения SSH на порту 54747, но успешно на порту 22
  7. Перезапустите службы ssh и sshd
  8. SSH успешно подключен к порту 54747, ошибка подключения к порту 22
  9. Перезагрузитесь и вернитесь к 6

РЕДАКТИРОВАТЬ 1: netstat выход

rgo@ATLAS:~$ sudo netstat -lntp | grep :54747
rgo@ATLAS:~$ sudo netstat -lntp | grep :22
tcp6       0      0 :::22                   :::*                    LISTEN      1/init  

РЕДАКТИРОВАТЬ 2: service sshd status

● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

РЕДАКТИРОВАТЬ 3: lsof -i | grep ssh

systemd      1     root   46u  IPv6  42724      0t0  TCP ATLAS:ssh->192.168.1.27:49837 (ESTABLISHED)
systemd      1     root   49u  IPv6  14641      0t0  TCP *:ssh (LISTEN)
sshd      4088     root    3u  IPv6  42724      0t0  TCP ATLAS:ssh->192.168.1.27:49837 (ESTABLISHED)
sshd      4088     root    4u  IPv6  42724      0t0  TCP ATLAS:ssh->192.168.1.27:49837 (ESTABLISHED)
sshd      4202      rgo    3u  IPv6  42724      0t0  TCP ATLAS:ssh->192.168.1.27:49837 (ESTABLISHED)
sshd      4202      rgo    4u  IPv6  42724      0t0  TCP ATLAS:ssh->192.168.1.27:49837 (ESTABLISHED)

Для справки: ATLAS - это имя хоста удаленного сервера, 192.168.1.27 - это IP-адрес локальной сети моего ноутбука, и команда была выполнена между шагами 6 и 7.

ufw status

Status: inactive

РЕДАКТИРОВАТЬ 4: ps -ef |grep sshd

root      4088     1  0 22:40 ?        00:00:00 sshd: rgo [priv]
rgo       4202  4088  0 22:40 ?        00:00:00 sshd: rgo@pts/1 sshd
3rgo
источник
Я не осуждаю вас никоим образом. Но мне кажется, что вы не вводите команды на сервере SSH в соответствии с просьбой. Вы не можете иметь живые соединения ssh, когда демон ssh мертв ....... на сервере ssh, ps -ef | grep sshd должен возвращать процесс / usr / sbin / sshd -D. Есть несколько людей, которые помогают, но отправляют вас в разных направлениях. Я рад пообщаться с вами в чате, если это будет полезно для вас.
jones0610
Может быть, это потому, что у меня уже есть сеанс с тем же пользователем, открытый и отображенный на моем телевизоре с Kodi?
3
Привет, @ 3rgo, тебе удалось решить это?
pa4080
Здравствуй ! Нет, я все еще сталкиваюсь с этой проблемой ... К счастью, мне не нужно перезагружать мой домашний сервер время от времени, но это все еще боль, потому что это нарушает некоторые из моих автоматизированных процессов ...
3rgo
У меня есть несколько идей. (1) Вы можете попытаться изменить порт на значение по умолчанию, а затем перезапустить всю систему. Затем попробуйте изменить его снова на желаемое значение. (2) Попробуйте с другим значением, например Port 10285. Google показывает пару результатов для 54747 ... (3) Также SSH-сервер может работать с несколькими портами одновременно. Создайте две отдельные директивы для каждого порта: Port 22и Port 54747затем откройте только второй в брандмауэре. (4) Вы можете попробовать Match LocalPortдирективу , размещенную в начале sshd_c.
pa4080

Ответы:

2

ssh может быть «активирован через сокет» systemd в зависимости от конфигурации, что означает, что изначально systemd устанавливает порт прослушивания, а sshd запускается только при первом подключении клиента. Это должно ускорить время запуска: сервисные демоны запускаются только по требованию.

Однако это означает, что вы также должны настроить systemd для соответствующего порта. Вы найдете конфигурацию системы, в /lib/systemd/system/ssh.socketкоторой списки ListenStream=22. Чтобы переопределить это, создайте файл /etc/systemd/system/ssh.socket.d/port.conf(создающий каталог ssh.socket.dпри необходимости), который содержит:

[Socket]
ListenStream=
ListenStream=54747

Измените номер на нужный порт. Первая пустая запись стирает предыдущий по умолчанию, а последующая запись добавляет новый. Это отменяет стандартную поставку /lib/systemd/system/ssh.socketи должно быть сделано в дополнение к изменению /etc/ssh/sshd_config.

Затем запустите sudo systemctl daemon-reloadsystemd, чтобы сообщить systemd о ваших изменениях и о sudo systemctl reload sshтом, был ли ранее запущен демон ssh.

Роби Басак
источник
Этот ответ выглядит очень многообещающе, но /etc/systemd/system/ssh.socket.d/port.confигнорируется, и при перезагрузке все еще сбрасывается порт на 22. Соответствует ли имя файла ? Не удалось найти хорошую документацию по переопределениям systemd в Ubuntu .
MestreLion
Имя файла не имеет значения, если оно заканчивается .conf. См. Systemd-system.conf (5) для получения подробной информации о файлах конфигурации переопределения systemd.
Роби
Также вы можете запустить, systemctl status ssh.socketчтобы увидеть, если он включен и что он слушает.
Роби
2
Это работает!!! Наконец-то эта тайна разгадана! Но потом я заметил, что смог получить доступ через оба порта: по умолчанию 22 и пользовательский. Добавление ListenStream=строки перед пользовательским портом предотвратило это, не знаю почему. Может быть, это «очищает» ListenStream=22настройку по умолчанию /lib/systemd/system/ssh.socket? Странный способ переопределить настройки. Может стоит добавить это в ответ?
МестреЛион
@MestreLion ах да, это правильно. Я обновлю ответ. Благодарность!
Роби
0

Проверьте настройки порта в /etc/ssh/sshd_configфайле. Убедитесь, что вы редактируете как sudo или как пользователь в группе sudo. Все, что вам нужно сделать, чтобы установить порт, это на одном типе линии. Port 54747.Теперь перезапустить службу ssh, запустив service sshd restart.Затем проверить, что ssh прослушивает этот порт, запустив sudo netstat -lntp | grep ssh.Reboot и протестировать.

Также проверьте настройки вашей сети. Если вы находитесь в корпоративной сети, убедитесь, что вы находитесь в правильном VLAN.

G_Style
источник
Я сделал резервную копию и отредактировал файл как sudo, и изменил Port 22строку по умолчанию Port 54747только. Кроме того, netstat, который вы дали мне, не имел выхода. Я добавил модифицированный в свой OP
3rgo
Вы подключаете с ключом правильно? Таким образом , вы должны быть соединения , как: ssh -i key.txt user@ipaddress -p 54747. Также проверьте, прослушивает ли что-нибудь еще этот порт. Есть sudo lsof -i | grep ssh. Вы также можете проверить свой брандмауэр, чтобы убедиться, что он ничего не блокирует. Есть: sudo ufw status.
G_Style
На 54747 порт не используется (см. Мой OP, я его добавил). Я тоже добавляю вывод ваших команд
3rgo
После некоторого размышления о вашей проблеме у меня возникает ощущение, что не ваша настройка, а способ перезагрузки вызывает эту проблему, с которой вы столкнулись. При перезагрузке вы должны использовать команду shutdown -r now. Попробуйте и дайте нам знать результаты. См. Эту статью для справки: askubuntu.com/questions/483670/…
G_Style
Я только что попробовал, и получил тот же результат, что sudo reboot -h nowи `sudo reboot`
3rgo
0

Иногда что-то идет не так. Если бы я был на вашем месте, я бы попробовал с:

cp /etc/ssh/sshd_config $HOME
sudo apt-get --reinstall install openssh-server
pa4080
источник
Потребуется ли мне физический доступ к серверу? Если это так, я могу сделать это только завтра вечером
3
Привет @ 3rgo, я думаю, вам не нужен физический доступ. Я просто пробую это на своем VPS. Также на моем домашнем сервере Ubuntu, когда я вошел через SSH. Даже связь не была прервана. cpКоманда на всякий случай, обычно процесс переустановки не затрагивает файлы конфигурации.
pa4080
Здравствуй! Я попытался переустановить, но ничего не изменилось, у меня все та же проблема ...
3rgo
0

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

Файл конфигурации на сервере sshd, который читается при запуске службы sshd (которая требует прав sudo для редактирования)

/etc/ssh/sshd_config

Служба должна начинаться с

/etc/systemd/system/sshd.service

Перезапустить sshd, что потребовало бы повторного чтения файла sshd_config

sudo service sshd restart

Чтобы узнать, какой порт слушает демон sshd, а также другую полезную информацию о типе сервера ssh

sudo service sshd status

Выполните эти шаги в указанном порядке:

Перезагрузите сервер SSH

Откройте терминальную сессию на ssh-сервере (не ssh-соединение с ним)

Тип hostname

Если имя хоста не возвращает имя сервера ssh (в данном случае Atlas), выполните предыдущий шаг правильно.

grep Port /etc/ssh/sshd_config - запомните номер порта. Должен быть тот, который вы указали

sudo service sshd status

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

Эти шаги, вероятно, определят причину проблемы, о которой вы спрашиваете.

Для целей тестирования и для простоты: на стороне клиента, из сеанса терминала вы бы ssh на сервер ssh следующим образом

ssh -l username -p 54747 hostname

Основываясь на обратной связи с OP, я подозреваю, что sshd не запускается при загрузке, но запускается правильно при вызове вручную. Успешные ssh-соединения через порт 22 вполне могут НЕ соединяться с ssh-сервером, а с чем-то другим (например, с localhost). Чтобы доказать или опровергнуть это, после подключения через тип SSH

hostname

Исходя из того, что говорит OP, я предполагаю, что hostname не будет атласом ssh-сервера.

Чтобы дополнительно изолировать это, после перезагрузки сервера ssh, но перед дальнейшими действиями , от сеанса терминала на типе сервера ssh (Atlas)

ssh localhost

Если это не удается, как следует, то

ssh -p 54747 localhost

Если это не сработает, это подтвердит результаты, полученные при запуске

sudo service sshd status
jones0610
источник
Здравствуй ! Я добавил последовательность событий, чтобы вы могли лучше понять. Я использую команду SSH ssh -p <PORT> <USER>@<IP>, добавив свой закрытый ключ к агенту.
3
Очень хорошо. Сделайте шаг 6a: на сервере sshd, статус sshd службы sudo. Если он сообщает о порте 22, существует вызываемый поддельный файл sshd_config.
jones0610
Говорит «неактивен (мертв)» (см. Полный вывод в моем ОП за секунду)
3
Так что, если он мертв (не активен и не работает), вы не заходите в машину, как вам кажется. На сервере sshd введите ps -ef | grep sshd. Если демон sshd на сервере sshd фактически мертв, никакие процессы sshd не будут запущены, и, следовательно, вы не сможете подключиться к нему независимо от используемого порта.
jones0610
Найдено 2 sshd процесса ... Я добавил подробный вывод
3rgo
0

Возможно, вы просто ответили Y, когда apt обнаружил разницу между вашим sshd_config и пакетом. Он спрашивает, хотите ли вы установить версию менеджера пакетов или оставить свою.

Marco
источник
1
Я не помню, чтобы меня об этом спрашивали, но, если это так, что я могу сделать, чтобы это исправить?
3
0

Возможные причины, о которых я могу думать

  1. Другой бинарный файл sshd запускается при загрузке или sshd запускается с другим конфигом. Возможно, виновным здесь является systemd - у него есть другой способ изменить порт, /usr/lib/systemd/system/sshd.socketочевидно , через файл : https://www.vultr.com/docs/how-to-change-ssh-port-on-coreos
  2. Правильный / etc / или / etc / ssh еще не смонтирован при запуске sshd. Это отдельный том на вашей машине, который монтируется позже в процессе загрузки?
  3. У sshd нет прав на чтение файла конфигурации во время загрузки, хотя я не знаю, будет ли вообще запускаться sshd.
сойка
источник
2
Я считаю, что вы на это. И если это сервер, который прошел много обновлений, может быть, есть множество сценариев запуска, которые лежат вокруг (sysv-init, upstart, systemd) Может быть, простой поиск и проверка всех файлов в / etc /, find /etc/ -iname "*ssh*"чтобы найти больше подсказок.
Базз