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

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

https://stackoverflow.com/questions/24932172/what-length-can-a-network-interface-name-have,有人询问网络接口名称可以有多长(显然是 16 字节)。然而,该问题的答案似乎没有链接到有关该名称的其他限制的任何信息,例如:

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

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

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

答案1

接口名称不应类似于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;
}

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

相关内容