net.ipv4.ip_forward не сохраняется, даже в /etc/sysctl.conf

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

В настоящее время я настраиваю новую машину Debian 11 Bullseye, чтобы она работала как шлюз Wireguard.
Все как обычно и просто.
К сожалению, у меня возникла серьезная проблема с переадресацией пакетов IPV4.
Общеизвестно, что я должен раскомментировать #net.ipv4.ip_forward в файле /etc/sysctl.conf, чтобы включить переадресацию пакетов.
К сожалению, даже когда он раскомментирован, настройка не применяется автоматически после перезагрузки.
Мне приходится вручную обрабатывать файл sysctl с помощью “sysctl -p” каждый раз после перезагрузки.
В чем здесь проблема? Также нет другого sysctl.conf в sysctl.conf.d, который мог бы переопределить эту настройку.
Я также попробовал на свежей системе Debian 11, с той же проблемой.

root@wireguard:~# /sbin/sysctl --system
* Применение /etc/sysctl.d/1-sysctl.conf ...
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
* Применение /usr/lib/sysctl.d/50-pid-max.conf ...
kernel.pid_max = 4194304
* Применение /usr/lib/sysctl.d/protect-links.conf ...
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1
* Применение /etc/sysctl.conf ...
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

После перезагрузки:

root@wireguard:~# cat /proc/sys/net/ipv4/ip_forward
0
root@wireguard:~# cat /proc/sys/net/ipv6/conf/all/forwarding
1

Надеюсь, кто-то сможет мне помочь, похоже, что это применяется только частично, не знаю, связано ли это с настройкой IPv6. Все, кроме sysctl.conf и установки Wireguard, установлено по умолчанию.

Создайте /etc/sysctl.d/99-ipv.conf с следующими строками:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

Затем выполните:

sudo systemctl restart procps
sudo sysctl -p

С 2006 года ошибка вызывает игнорирование настроек sysctl во время загрузки, так как они применяются до загрузки сетевых модулей и монтирования файловых систем. В результате многие записи /proc/sys недоступны в это время.

Обходной путь

Запуск /usr/sbin/sysctl –system перезагружает все параметры ядра, определенные в /etc/sysctl.conf и любых файлах в /etc/sysctl.d/, применяя их к системе.

Постоянный обходной путь

Хотя постоянного исправления нет, вы можете обеспечить применение настроек с помощью sudo crontab -e:

@reboot sleep 5 && /usr/sbin/sysctl –system

Источник: https://bugs.launchpad.net/ubuntu/+source/procps/+bug/50093

Мысли

Не могу поверить, что эта 15-летняя ошибка все еще существует в 2025 году

.

Ответ или решение

Ваша ситуация связана с известной проблемой, которая наблюдается при настройке системных параметров через файл /etc/sysctl.conf в системах на основе Debian, таких как ваша Debian 11 Bullseye. Давайте попробуем разобраться в этой проблеме более детально и предоставим решения.

Теория

Параметр net.ipv4.ip_forward отвечает за возможность пересылки пакетов через интерфейсы IPv4. Этот параметр необходимо включать для настройки систем, работающих как маршрутизаторы или шлюзы, таких как узлы с WireGuard.

Обычно изменение системных параметров в Linux осуществляется с помощью системы sysctl. Файлы конфигурации, такие как /etc/sysctl.conf и файлы в каталоге /etc/sysctl.d/, содержат параметры, которые должны быть применены при загрузке системы. Однако существует известная проблема, отмеченная еще в 2006 году, когда эти параметры не применяются корректно из-за того, что они обрабатываются до загрузки сетевых модулей и монтирования файловых систем. Это приводит к тому, что некоторые из записей в /proc/sys могут быть недоступными на момент их установки.

Пример

В вашей конкретной ситуации вы отметили, что параметр net.ipv4.ip_forward, установленный вручную с помощью sysctl -p, работает только до перезагрузки системы. После перезагрузки он снова сбивается на 0, хотя в sysctl.conf он отмечен как включенный.

Применение

Для решения данной проблемы предлагаем несколько шагов, которые помогут сделать настройку постоянной:

  1. Создание файла конфигурации в /etc/sysctl.d/:

    • Создайте файл /etc/sysctl.d/99-ipv.conf:
      net.ipv4.ip_forward = 1
      net.ipv6.conf.all.forwarding = 1
    • Это должно помочь гарантировать, что параметр будет прочитан и применен при загрузке.
  2. Перезапуск службы procps:

    • Выполните команды:
      sudo systemctl restart procps
      sudo sysctl -p
    • Первая команда перезапускает службу, которая отвечает за применение системных параметров. Вторая команда применяет изменения без перезагрузки системы.
  3. Использование crontab для автоматизации:

    • Как временное решение, можно добавить в crontab команду, которая будет автоматически перезапускать применение sysctl после каждого перезагрузки. Для этого выполните:
      sudo crontab -e
    • Добавьте следующую строку:
      @reboot sleep 5 && /usr/sbin/sysctl --system
    • Это позволит системе немного подождать перед применением настроек, чтобы все модули успели загрузиться.

Эти шаги помогут обойти текущее ограничение и обеспечить столкновение с этой ошибкой.

Заключение

Проблема, с которой вы столкнулись в Debian 11, известна уже более десяти лет и пока что не имеет официального исправления. Методы, которые мы рассмотрели, эффективно решают проблему и позволяют достичь необходимой конфигурации без значительного вмешательства в систему. Однако важно следить за обновлениями от разработчиков Debian на предмет возможного официального решения этой проблемы в будущих выпусках.

Мы надеемся, что данная информация поможет вам решить проблему с персистентностью настройки net.ipv4.ip_forward и успешно настроить ваш WireGuard шлюз.

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

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