为什么 systemd-networkd 不向 tun 接口添加地址和对等点?

为什么 systemd-networkd 不向 tun 接口添加地址和对等点?

我正在尝试创建 tun 接口并通过 systemd-networkd 的 .netdev 和 .network 文件添加地址和对等点。我正在使用 Ubuntu 22.04.3 LTS 和 systemd 249。

我有以下两个配置文件:

/etc/systemd/network/991-tun1.netdev

[NetDev]
Name=tun1
Kind=tun

[Tun]
User=me

/etc/systemd/network/991-tun1.network

[Match]
Name=tun1

[Network]
Address=192.168.3.1/24
IPForward=yes

[Address]
Address=192.168.3.1/24
Peer=192.168.3.2/24

重新启动后,tun1 接口创建正常,但没有地址。

me@host:~$ ip a
...
4: tun1: <NO-CARRIER,POINTOPOINT,MULTICAST,NOARP,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 500
    link/none 

但如果我使用 ifconfig 那么地址会按预期添加。

me@host:~$ sudo ifconfig tun1 192.168.3.1 pointopoint 192.168.3.2 netmask 255.255.255.0
me@host:~$ ip a
...
4: tun1: <NO-CARRIER,POINTOPOINT,MULTICAST,NOARP,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 500
    link/none 
    inet 192.168.3.1 peer 192.168.3.2/24 scope global tun1
       valid_lft forever preferred_lft forever

重新启动后我可以在日志中看到这一点

me@host:~$ sudo journalctl --unit systemd-networkd -fe|grep tun1
...
systemd-networkd[513]: tun1: loaded tun
systemd-networkd[513]: tun1: Created
systemd-networkd[513]: tun1: netdev has index 4
systemd-networkd[513]: tun1: Permanent MAC address not found for new device, continuing without: Operation not supported
systemd-networkd[513]: tun1: Link 4 added
systemd-networkd[513]: tun1: Saved original MTU 1500 (min: 68, max: 65535)
systemd-networkd[513]: tun1: Flags change: +MULTICAST +POINTOPOINT +NOARP
systemd-networkd[513]: tun1: link pending udev initialization...
systemd-networkd[513]: tun1: udev initialized link
systemd-networkd[513]: tun1: State changed: pending -> initialized
systemd-networkd[513]: tun1: Link state is up-to-date
systemd-networkd[513]: tun1: found matching network '/etc/systemd/network/991-tun1.network'.
systemd-networkd[513]: tun1: State changed: initialized -> configuring
systemd-networkd[513]: Setting '/proc/sys/net/ipv6/conf/tun1/disable_ipv6' to '0'
systemd-networkd[513]: Setting '/proc/sys/net/ipv6/conf/tun1/use_tempaddr' to '0'
systemd-networkd[513]: Setting '/proc/sys/net/ipv6/conf/tun1/accept_ra' to '0'
systemd-networkd[513]: Setting '/proc/sys/net/ipv6/conf/tun1/proxy_ndp' to '0'
systemd-networkd[513]: Setting '/proc/sys/net/ipv4/conf/tun1/promote_secondaries' to '1'
systemd-networkd[513]: tun1: Requested to set IPv6LL address generation mode
systemd-networkd[513]: tun1: Requested to set master interface
systemd-networkd[513]: tun1: Requested to activate link
systemd-networkd[513]: tun1: Requesting address: 192.168.3.1/24 (valid forever, preferred forever), flags: n/a
systemd-networkd[513]: tun1: Requesting address: 192.168.3.1 peer 192.168.3.2/24 (valid forever, preferred forever), flags: n/a
systemd-networkd[513]: tun1: Setting addresses
systemd-networkd[513]: tun1: link_check_ready(): link layer is configuring.
systemd-networkd[513]: tun1: link_check_ready(): link layer is configuring.
systemd-networkd[513]: tun1: link_check_ready(): link layer is configuring.
systemd-networkd[513]: tun1: link_check_ready(): link layer is configuring.
systemd-networkd[513]: tun1: link_check_ready(): link layer is configuring.
systemd-networkd[513]: tun1: link_check_ready(): link layer is configuring.
systemd-networkd[513]: tun1: link_check_ready(): link layer is configuring.
systemd-networkd[513]: tun1: link_check_ready(): link layer is configuring.
systemd-networkd[513]: tun1: Setting IPv6LL address generation mode
systemd-networkd[513]: tun1: Setting master interface
systemd-networkd[513]: tun1: IPv6LL address generation mode set.
systemd-networkd[513]: tun1: master interface set.
systemd-networkd[513]: tun1: link_check_ready(): link is not activated.
systemd-networkd[513]: tun1: Bringing link up
systemd-networkd[513]: tun1: Flags change: +UP
systemd-networkd[513]: tun1: Link UP
systemd-networkd[513]: tun1: link_check_ready(): static addresses are not configured.

为什么 systemd-networkd 没有将地址添加到 tun1 接口以及如何使其添加地址?

答案1

系统网络化(如 NetworkManager)对运营商状态做出反应,这会影响接口上的地址配置。

对于 TUN/TAP 接口,状态将保持在,NO-CARRIER直到用户空间进程(例如ssh -w ...)正确连接到接口:然后虚拟载体状态将切换为已检测到。默认情况下,只有以下部分的配置(例如添加地址)才会由网络化

要使其忽略运营商状态,应为设备添加以下参数:

[Network]
ConfigureWithoutCarrier=yes
IgnoreCarrierLoss=yes

特别是描述ConfigureWithoutCarrier告诉:

[...] 允许网络配置特定链接,即使它没有运营商。 [...]

第二个参数(在第一个参数启用时可能默认启用,因此这里实际上可能不需要),允许停止并重新启动附加到 TUN 接口(例如ssh -w ...)的用户空间进程,而不会导致设置发生任何更改。

相关内容