Linux 上的网络接口名称有哪些限制(如果有)

Jam*_*ell 6 linux networking linux-kernel iproute network-interface

/sf/ask/1745252071/中,有人询问网络接口名称可以有多长(显然是 16 个字节)。然而,该问题的答案似乎没有链接到有关该名称的其他限制的任何信息,例如:

\n
    \n
  • 字符集(例如,ip link我能够将;rm-f作为有效名称,但它似乎无法解析带有空格的名称(尽管这可能只是其参数解析器的产物,实际上并不是一种保护)针对有问题的价值观))。
  • \n
  • 最小长度(1 字节名称有效)
  • \n
  • 编码(在我的终端中创建\xce\xb1显示__,并且不能通过名称删除\xce\xb1
  • \n
\n

是否有关于接口可以被调用的内容以及在哪一层强制执行的文档(例如在内核、iproute2、libc 中)?

\n

上下文:编写一个接受将存储在数据库中的接口名称的 CLI 命令,我想确定可以对坏名称进行多少过滤,而不会导致奇怪命名(尽管可能不是敌意)接口的问题。

\n

小智 7

接口名称不应类似于ethNUM,wlanNUMusbNUM

这些名称由内核使用,如果您尝试将接口重命名为类似的名称,您将会遇到麻烦。根据我自己的经验,我知道这一点(试图保持两个接口稳定地命名为eth0eth1,无论内核初始化它们的顺序如何)。

看到这个


对于青蛙字符,内核的接口 ( ioctl(SIOCSIFNAME)... dev_change_name()... dev_valid_name()) 将拒绝任何为空字符串、...、包含任何/:或空格 ( [\t\n\v\f\r \xa0]) 或长度超过15(不是 16)字节的接口名称:

bool dev_valid_name(const char *name)
{
        if (*name == '\0')
                return false;
        if (strnlen(name, IFNAMSIZ) == IFNAMSIZ)
                return false;
        if (!strcmp(name, ".") || !strcmp(name, ".."))
                return false;

        while (*name) {
                if (*name == '/' || *name == ':' || isspace(*name))
                        return false;
                name++;
        }
        return true;
}
Run Code Online (Sandbox Code Playgroud)

其他控制字符,如\x1b(ESC)、不可见/双向标记或任何类型的二进制垃圾都可以正常工作。例如,您可以尝试:ip link add dev $'\e[1;41;33m' type bridge;-)