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

8

Я пытаюсь включить IP Forwarding (между 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было достаточно времени.

Unsacrificed
источник

Ответы:

3

Я наконец-то решил проблему. Я использую systemd (с networkd), и в systemd-221 была представлена ​​новая функция о пересылке ip: «IPForwarding =» - см. Https://github.com/systemd/systemd/blob/a2088fd025deb90839c909829e27eece40f7fce4/NEWS

От man systemd.network:

[NETWORK] ВАРИАНТЫ РАЗДЕЛА

...

IPForward =

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

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

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

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

[Network]
IPForward=ipv4
Unsacrificed
источник