Как правильно и навсегда включить ip forwarding в Linux с помощью systemd?

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

Я пытался включить пересылку IP (между интерфейсами enp0s3 и tun0) и написал net.ipv4.ip_forward = 1 в /etc/sysctl.conf. После перезагрузки у меня:

$ cat /proc/sys/net/ipv4/ip_forward
1

Но пересылка по-прежнему не работает. Я попробовал добавить net.ipv4.conf.default.forwarding=1 в /etc/sysctl.conf. Теперь после перезагрузки у меня:

$ cat /proc/sys/net/ipv4/ip_forward
1
$ cat /proc/sys/net/ipv4/conf/default/forwarding
1
$ cat /proc/sys/net/ipv4/conf/all/forwarding
1
$ cat /proc/sys/net/ipv4/conf/enp0s3/forwarding
0
$ cat /proc/sys/net/ipv4/conf/tun0/forwarding
0

Я не могу включить /proc/sys/net/ipv4/conf/enp0s3/forwarding и /proc/sys/net/ipv4/conf/tun0/forwarding в sysctl.conf, потому что эти файлы не существуют на таком раннем этапе загрузки:

systemd-sysctl[85]: Couldn't write '1' to 'net/ipv4/conf/enp0s3/forwarding', ignoring: No such file or directory
systemd-sysctl[85]: Couldn't write '1' to 'net/ipv4/conf/tun0/forwarding', ignoring: No such file or directory)

Более того, tun0 — это динамический интерфейс (может быть добавлен и удален в любое время).

Если я вручную включаю пересылку для enp0s3 и tun0, то пересылка работает как положено.

Итак, как правильно включить пересылку для всех интерфейсов?

PS: Gentoo с ядром 4.1.15 и systemd 226

PPS: если память мне не изменяет, некоторое время назад net.ipv4.ip_forward = 1 было достаточно.

Наконец, я решил проблему.
Я использую systemd (с networkd), и новая функция для IP пересылки была введена в systemd-221: “IPForwarding=” – см. https://github.com/systemd/systemd/blob/a2088fd025deb90839c909829e27eece40f7fce4/NEWS

Из man systemd.network:

[SECTION] NETWORK OPTIONS

IPForward=

Настраивает IP пересылку для сетевого интерфейса. Если включено, входящие пакеты на сетевом интерфейсе будут пересылаться на другие интерфейсы в соответствии с таблицей маршрутизации. Принимает либо логический аргумент, либо значения “ipv4” или “ipv6”, которые включают пересылку IP только для указанного семейства адресов, или “kernel”, что сохраняет существующие настройки sysctl. Это управляет опциями sysctl net.ipv4.conf..forwarding и net.ipv6.conf..forwarding для сетевого интерфейса (смотрите ip-sysctl.txt[1] для подробностей о параметрах sysctl). По умолчанию “no”.

Примечание: если эта опция не включена или не установлена в “kernel”, на этом интерфейсе пересылка IP не выполняется, даже если она включена на уровне ядра с помощью опций sysctl net.ipv4.ip_forward, net.ipv4.conf.all.forwarding и net.ipv6.conf.all.forwarding.

Поэтому теперь я использую файл сети, как показано ниже, чтобы включить пересылку IP (для каждого интерфейса):

# cat /etc/systemd/network/tun0.network
[Match]
Name=tun0

[Network]
IPForward=ipv4

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

Введение

Обеспечение корректной настройки и постоянного включения пересылки IP на Linux-системах с использованием systemd является важным шагом для многих сетевых конфигураций, особенно когда требуется работа нескольких интерфейсов, таких как enp0s3 и tun0. В данном ответе мы подробно разберем, почему стандартные методы могут не сработать и как можно уверенно настроить пересылку IP через systemd.

Теория

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

Для управления пересылкой IP в Linux широко используется файл конфигурации /etc/sysctl.conf, где можно установить net.ipv4.ip_forward=1. Однако, как выяснилось, изменение этого параметра не всегда достаточно для включения пересылки между конкретными интерфейсами, особенно если один из них динамический, как в случае с tun0.

Ситуация усугубляется системой init — systemd, которая управляет системой во время загрузки. Systemd в версии 221 ввела возможность управления пересылкой через файлы конфигурации сети посредством опции IPForward в секции [Network].

Пример

В приведенном случае пользователь сталкивается с невозможностью включения пересылки пакетов через интерфейсы enp0s3 и tun0, несмотря на установку глобальных системных переменных через sysctl. Это происходит из-за того, что systemd по умолчанию игнорирует глобальные sysctl-настройки пересылки и требует явного указания в конфигурационных файлах.

Как показывает практика, эти настройки могут игнорироваться во время начальной загрузки. Это особенно актуально для динамических интерфейсов, таких как tun0, которые могут не быть доступны на момент применения конфигураций sysctl.service.

Решение: Применение

Чтобы гарантировать, что пересылка IP будет включена надежно для динамических и статических интерфейсов, можно воспользоваться механизмами systemd. Вот подробное руководство для настройки пересылки IP с systemd:

  1. Редактирование сетевого конфигурационного файла для динамического интерфейса. Создайте или отредактируйте файл конфигурации для интерфейса tun0.

    sudo nano /etc/systemd/network/tun0.network

    Вставьте в него следующее:

    [Match]
    Name=tun0
    
    [Network]
    IPForward=ipv4

    Эта конфигурация указывает systemd, что пересылка IP должна быть включена для трафика IPv4 на интерфейсе tun0.

  2. Повторите процесс для других интерфейсов, например, если требуется, для enp0s3:

    sudo nano /etc/systemd/network/enp0s3.network

    Добавьте:

    [Match]
    Name=enp0s3
    
    [Network]
    IPForward=ipv4
  3. Перезагрузите systemd-networkd. Чтобы изменения вступили в силу, необходимо перезапустить службу systemd-networkd:

    sudo systemctl restart systemd-networkd
  4. Проверьте успешность настроек. После перезапуска убедитесь в том, что пересылка теперь работает правильно:

    cat /proc/sys/net/ipv4/conf/enp0s3/forwarding
    cat /proc/sys/net/ipv4/conf/tun0/forwarding

    Оба значения должны быть 1, указывая, что пересылка включена.

Вывод

Использование возможностей systemd для управления сетевой конфигурацией обеспечивает более тонкий контроль над аспектами сетевого взаимодействия на уровне отдельных интерфейсов. Это становится особенно важным в современных средах, где динамические изменения сети являются нормой. Точные и корректные настройки позволят вам обеспечить стабильную работу системы без необходимости ручной настройки после каждого изменения или добавления интерфейса.

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

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