如何限制systemd.network为容器自动分配的IP地址池范围?
我之前刚好碰到过一模一样的需求,不用给每个容器单独配置静态IP,就能让systemd只从10.10.0.0/16里自动分配容器veth的IP段。其实在systemd 246及以上版本中,有个专门的配置项可以搞定这个:
编辑容器veth的network配置文件
默认的容器veth配置文件是/etc/systemd/network/80-container-ve.network,你可以直接修改它,或者创建一个优先级更高的配置文件(比如命名为70-custom-container-ve.network,数字越小优先级越高)来覆盖默认规则。添加AddressPool配置
在文件的[Network]区块里,替换掉原来的Address=0.0.0.0/XY配置,改成下面的内容:[Network] # 指定自动分配的IP池范围 AddressPool=10.10.0.0/16 # 如果不需要IPv6自动分配,可以删掉下面这行 AddressPool=fdca:ba11:f00d::/48 DHCP=no IPv6AcceptRA=noAddressPool是systemd专门用于自动子网分配的配置,它会让systemd只从你指定的父网段里挑选未被使用的子网,分配给容器的veth接口——这完全区别于直接用Address=10.10.0.0/16的静态分配方式,刚好匹配你的需求。重启systemd-networkd服务生效
配置改完后,重启服务让新规则生效:sudo systemctl restart systemd-networkd
针对旧版systemd的兼容方案
如果你的systemd版本低于246(没有AddressPool指令),可以用一个临时的hack方案:通过预占其他网段的路由,让systemd只能从10.10.0.0/16里选地址。不过这种方法会影响系统全局路由,不太推荐,优先建议升级systemd。具体操作:
- 执行以下命令添加路由规则:
# 把其他所有网段设为黑洞路由,优先级拉低 sudo ip route add blackhole 0.0.0.0/0 metric 9999 # 只保留10.10.0.0/16的正常路由 sudo ip route add 10.10.0.0/16 metric 1
这样配置后,systemd在自动分配容器IP段时,就只会从10.10.0.0/16里选择未被使用的子网了,不用再给每个容器单独配置静态IP。
内容的提问来源于stack exchange,提问作者steiny

