Linuxのネットワークインタフェース名にはどのような制限がありますか?

Linuxのネットワークインタフェース名にはどのような制限がありますか?

存在するhttps://stackoverflow.com/questions/24932172/what-length-can-a-network-interface-name-have、誰かがネットワークインターフェイス名の長さ(明らかに16バイト)を尋ねました。ただし、その質問に対する回答は、次のような名前の他の制限に関する情報に関連付けられていないようです。

  • charset(たとえば、有効な名前をip link取得できますが空白の名前を解析できないようです(たとえこれは引数パーサーのアーティファクトであり、実際に値の問題を防ぐことはできません))。;rm-f
  • 最小長(1バイト名が有効)
  • エンコード(端末にα表示を生成し__、名前で削除することはできませんα

インターフェイスを呼び出すことができるエントリと適用されるレベル(カーネル、iproute2、libcなど)に関するドキュメントはありますか?

コンテキスト:データベースに保存されるインターフェイス名を許可するCLIコマンドを作成し、奇妙な名前の(敵対的ではありませんが)インターフェイスに問題を引き起こすことなく、間違った名前に対してどのようにフィルタリングできるかを確認したいと思います。

答え1

インタフェース名は、またはに似てはいけませんethNUMwlanNUMusbNUM

これらの名前はカーネルで使用され、インターフェイス名を同じ名前に変更しようとすると問題が発生します。私は私の経験を通してこれを知っています(カーネルが初期化する順序にかかわらず、2つのインタフェース名を安定して保持しようとしています)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;-)

関連情報