Systemd Networkd服务

systemd-networkd设置MAC地址欺骗

systemd-networkd 支持通过 systemd.link 配置实现MAC地址欺骗。

  • 配置 /etc/systemd/network/00-wlan0.link 或者 00-wlan0.network :

systemd_networkd/00-wlan0.network
1[Match]
2MACAddress=original MAC
3
4[Link]
5MACAddress=spoofed MAC
6NamePolicy=kernel database onboard slot path

systemd配置静态IP地址

systemd-networkd 配置静态IP地址非常简单,创建一个和网卡接口名相同配置文件,例如 eth0 创建 /etc/systemd/network/10-eth0.network 内容如下:

/etc/systemd/network/10-eth0.network配置
[Match]
MACAddress=00:00:00:00:00:01

[Network]
Address=192.168.6.10/24
Gateway=192.168.6.200
DNS=192.168.6.1
DNS=192.168.6.2
  • 执行以下命令将默认NetworkManager切换成 systemd-networkd :

NetworkManager切换到systemd-networkd使静态IP生效
systemctl stop NetworkManager.service
systemctl start systemd-networkd.service
systemctl restart systemd-resolved.service

systemctl disable NetworkManager.service
systemctl enable systemd-networkd.service

我在 ARM移动云的虚拟机部署 (在 Asahi Linux ARM架构平台运行的 Fedora Server ARM)遇到一个报错:

systemd-gpt-auto-generator: Failed to dissect: Permission denied

但似乎可以忽略 ( systemd-gpt-auto-generator 是基于GPT分区类型GUID自动发现和挂载root、/home/、/srv/、/var/ 和 /var/tmp/ 分区,以及发现和启用交换分区的生成器 )

systemd创建网桥

备注

在使用 systemd-networkd 创建网桥前,我们已经有一个 /etc/systemd/network/enp0s25.network 配置了有线以太网的IP地址

1[Match]
2Name=enp0s25
3
4[Network]
5Address=192.168.6.9/24

所以此时 ip addr 显示 enp0s25 的地址如下:

2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether f0:de:f1:9b:0c:7b brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.9/24 brd 192.168.6.255 scope global enp0s25
       valid_lft forever preferred_lft forever
    inet6 fe80::f2de:f1ff:fe9b:c7b/64 scope link
       valid_lft forever preferred_lft forever

我们配置bridge网络,将bridge绑定到 enp0s25 上,绑定过程中 enp0s25 接口的IP地址 192.168.6.9 会丢失

  • systemd创建名为 br0 的网桥使用配置文件 /etc/systemd/network/mybridge.netdev :

1[NetDev]
2Name=br0
3Kind=bridge
  • 然后重启 systemd-networkd.service

    systemctl restart systemd-networkd.service
    
  • 然后执行 ip addr 检查可以看到以下网桥:

    8: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether 7e:33:f1:ea:9e:e3 brd ff:ff:ff:ff:ff:ff
    

注意,此时接口 br0 状态还是 DOWN

备注

systemd-networkd 是基于接口名字和主机ID为网桥设置MAC地址的,但是在某些场景可能存在问题,例如基于MAC过滤的路由。为了能够精确控制网桥MAC地址,可以在上述 NetDev 段落添加 MACAddress=xx:xx:xx:xx:xx:xx 来创建指定MAC地址的网桥。

  • 将以太网接口绑定到bridge

接下来需要将物理网络接口( enp0s25 )绑定到网桥( br0 )上,则增加一个配置 /etc/systemd/network/bind.network :

1[Match]
2Name=enp0s25
3
4[Network]
5Bridge=br0

这里 [Match] 段落也配置通配符,也能起到相似作用,例如:

[Match]
Name=en*
  • 现在重启一次 systemd-networkd ,此时使用 brctl show 检查,就看到 br0 网桥已经启动,并且绑定在 enp0s25 接口上:

    bridge name  bridge id               STP enabled     interfaces
    br0          8000.7e33f1ea9ee3       no                  enp0s25
    
  • 配置网桥IP

网桥 br0 已经绑定到以太网物理接口 enp0s25 上,需要为网桥配置一个指定IP地址。这个配置也是通过 .network 文件定义,和配置普通网卡相同, /etc/systemd/network/mybridge.network 配置一个静态IP地址:

1[Match]
2Name=br0
3
4[Network]
5Address=192.168.6.200/24

这里也可以使用DHCP来配置网桥:

[Match]
Name=br0

[Network]
DHCP=ipv4

备注

这里有一个疑惑 enp0s25.network 配置绑定到 enp0s25 的配置没有生效。在bind到br0之后,IP地址丢失。虽然可以通过 ifconfig 手工恢复,但是networkd配置文件没有生效。

参考