Как настроить SSHD для прослушивания только на IPv4?

Вопрос или проблема

текущая конфигурация (также был выполнен перезапуск)

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

Из man systemd.socket:

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:

  1. Изменение конфигурации SSHD:
    Откройте файл конфигурации SSHD, который обычно находится по следующему пути: /etc/ssh/sshd_config.

    Добавьте или измените следующую строку:

    AddressFamily inet

    Эта директива указывает, что SSHD должен использовать только IPv4. Убедитесь, что строка ListenAddress также настроена на 0.0.0.0:

    ListenAddress 0.0.0.0
  2. Конфигурация systemd (если применимо):
    Учитывая, что вы используете систему на базе systemd, служба SSH может быть активирована через сокеты. Поэтому вам нужно изменить конфигурацию сокета.

    Для этого выполните команду:

    systemctl edit ssh.socket

    Это откроет редактор для конфигурации сокета. Введите следующие строки:

    [Socket]
    ListenStream=
    ListenStream=0.0.0.0:30000

    Здесь важно установить ListenStream=, чтобы сбросить все предыдущие настройки, и задать новое значение для прослушивания на IPv4-адресе и порте.

  3. Перезапуск службы SSHD:
    После внесения изменений необходимо перезапустить демон SSHD, чтобы новые настройки вступили в силу:

    systemctl restart sshd

    Если вы редактировали сокет, также можете перезапустить его:

    systemctl restart ssh.socket
  4. Отключение 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. Не забудьте проверить статус служб и убедиться в применении новых настроек.

Оцените материал
Добавить комментарий

Капча загружается...