Вопрос или проблема
текущая конфигурация (также был выполнен перезапуск)
root@ubi:~# grep Port /etc/ssh/sshd_config
Порт 30000
root@ubi:~#
root@ubi:~# grep ListenAddress /etc/ssh/sshd_config
ListenAddress 0.0.0.0
root@ubi:~#
root@ubi:~# netstat -tulpn|grep 30000
tcp6 0 0 :::30000 :::* LISTEN 1/init
root@ubi:~#
root@ubi:~# ss -tulpn|grep 30000
tcp LISTEN 0 4096 *:30000 *:* users:(("sshd",pid=38048,fd=3),("systemd",pid=1,fd=251))
root@ubi:~#
root@ubi:~# grep PRETTY_NAME= /etc/os-release
PRETTY_NAME="Ubuntu 24.04.1 LTS"
root@ubi:~#
Вопрос: это ошибка? Я настроил sshd на прослушивание только IPv4, почему он прослушивает IPv6?
Вам нужно установить:
AddressFamily inet
В вашем sshd_config
тоже для IPV4
только
И перезапустите ваш ssh сервер
systemctl restart sshd
Вы также можете отключить IPV6 на вашем сервере.
Добавьте это в конец файла;
/etc/sysctl.conf
# Отключить IPV6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
и перезапустите:
/sbin/sysctl -p
Как видно из информации о процессе, это не ssh, который настраивает сокет, а systemd, что нормально для сервисов, активируемых через сокеты. Поэтому вам нужно настроить юнит сокета systemd, чтобы изменить порт и адреса прослушивания.
Запустите systemctl edit ssh.socket
(или sshd.socket
, в зависимости от дистрибутива), и добавьте:
[Socket]
ListenStream=
ListenStream=0.0.0.0:22
ListenStream=
,ListenDatagram=
,ListenSequentialPacket=
Указывает адрес для прослушивания для сокета потока (
SOCK_STREAM
), датаграммы (SOCK_DGRAM
) или последовательного пакета (SOCK_SEQPACKET
), соответственно. Адрес может быть записан в различных форматах:Если адрес начинается со слэша (“
/
“), он читается как сокет файловой системы в семействе сокетовAF_UNIX
.Если адрес начинается с символа “@” (“
@
“), он читается как сокет абстрактного пространства имен в семьеAF_UNIX
. Символ “@
” заменяется на нулевой символ перед привязкой. Для деталей смотрите unix(7).Если строка адреса — это единственное число, она читается как номер порта для прослушивания через IPv6. В зависимости от значения
BindIPv6Only=
(см. ниже) это может привести к тому, что сервис будет доступен как через IPv6, так и через IPv4 (по умолчанию), или только через IPv6.Если строка адреса имеет формат “
v.w.x.y:z
“, она интерпретируется как IPv4 адресv.w.x.y
и портz
.
По умолчанию это, вероятно, ListenStream=22
, что приводит к “доступности сервиса как через IPv6, так и через IPv4 (по умолчанию)”. Эти настройки являются аддитивными, поэтому вам нужно сбросить ListenStream
, установив его пустым:
Эти опции могут быть указаны более одного раза, в этом случае входящий трафик на любом из сокетов вызовет активацию сервиса, и все перечисленные сокеты будут переданы сервису, независимо от того, есть ли входящий трафик на них или нет. Если пустая строка назначена любой из этих опций, список адресов для прослушивания сбрасывается, все предыдущие использования любой из этих опций не будут иметь эффекта.
Ответ или решение
Чтобы настроить SSHD (SSH Daemon) для прослушивания только на IPv4, необходимо внести несколько изменений в конфигурационные файлы и параметры системы. Ваша текущая конфигурация показывает, что сервер SSH слушает на порту 30000, используя адрес 0.0.0.0
, что подразумевает прослушивание на всех интерфейсах, включая IPv6.
Шаги по настройке SSHD для прослушивания только на IPv4:
-
Изменение конфигурации SSHD:
Откройте файл конфигурации SSHD, который обычно находится по следующему пути:/etc/ssh/sshd_config
.Добавьте или измените следующую строку:
AddressFamily inet
Эта директива указывает, что SSHD должен использовать только IPv4. Убедитесь, что строка
ListenAddress
также настроена на0.0.0.0
:ListenAddress 0.0.0.0
-
Конфигурация systemd (если применимо):
Учитывая, что вы используете систему на базе systemd, служба SSH может быть активирована через сокеты. Поэтому вам нужно изменить конфигурацию сокета.Для этого выполните команду:
systemctl edit ssh.socket
Это откроет редактор для конфигурации сокета. Введите следующие строки:
[Socket] ListenStream= ListenStream=0.0.0.0:30000
Здесь важно установить
ListenStream=
, чтобы сбросить все предыдущие настройки, и задать новое значение для прослушивания на IPv4-адресе и порте. -
Перезапуск службы SSHD:
После внесения изменений необходимо перезапустить демон SSHD, чтобы новые настройки вступили в силу:systemctl restart sshd
Если вы редактировали сокет, также можете перезапустить его:
systemctl restart ssh.socket
-
Отключение IPv6 (опционально):
Если вы хотите полностью отключить поддержку IPv6 на сервере, добавьте следующие строки в файл конфигурации/etc/sysctl.conf
:# Отключение IPV6 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1
Затем примените изменения с помощью команды:
/sbin/sysctl -p
Проверка
После выполнения вышеуказанных шагов вы можете использовать команду netstat
или ss
для проверки, что SSHD теперь слушает только на адресах IPv4:
netstat -tulpn | grep 30000
или
ss -tulpn | grep 30000
Заключение
Настройка SSHD для прослушивания только на IPv4 может быть достигнута путем изменения конфигураций как самого демона, так и системных сокетов. Если вы выполните все вышеуказанные инструкции, это должно решить проблему с прослушиванием на IPv6. Не забудьте проверить статус служб и убедиться в применении новых настроек.