Linux 시스템에서 이더넷 및 Wi-Fi 인터페이스의 이름 지정 규칙 표준 표시하는 도구를 개발

Linux 시스템에서 이더넷 및 Wi-Fi 인터페이스명명 규칙 표준 은 무엇입니까 ?

Linux 시스템이더넷 및 Wi-Fi 인터페이스와 현재 상태 만 표시하는 도구를 개발 중입니다.

예를 들어, 아래는 Linux (Ubuntu) 시스템의 네트워크 인터페이스 (실제 및 가상 모두) 목록입니다.

docker0, enp0s25, lo,wlp3s0

도구를 실행하면 다음과 같은 결과가 나타납니다.

enp0s25, wlp3s0

모든 이더넷 인터페이스는 항상 문자로 시작 e하고 Wi-Fi 인터페이스는 항상 문자로 시작한다는 논리를 사용하여 코드를 작성했습니다 w.

논리가 맞습니까? 그렇지 않다면 어떻게 해결할 수 있습니까?



답변

네트워크 인터페이스는 무엇이든 명명 할 수 있으므로 무엇을 하든지 (1) 패턴과 일치하지 않는 이름의 “물리적”네트워크 인터페이스가 있거나 (2) 패턴과 일치하는 “물리적”네트워크 인터페이스.

또한, 내가 도구를 사용하는 사용자라면 “가상”네트워크 인터페이스를 가지고 있기 때문에 도구에서 원하는 작업을 수행 할 수없는 순간은 “실제 목적으로” 설치 프로그램에서 물리적 “이라고 표시되면 앱에서 큰 소리로 저주를 시작하고 다시는 사용하지 않습니다.

물리적 및 가상 네트워크 인터페이스는 모두 공통 API를 공유하므로 Linux를 실제로 유연하게 만들 수 있습니다. 사용자를 보모하지 말고 그에게서 빼내십시오. 귀하의 사용자는 감사합니다.


답변

체계적으로 예측 가능한 인터페이스 이름 의 경우 접두사를 다음에서 볼 수 있습니다 udev-builtin-net_id.c.

* Two character prefixes based on the type of interface:
*   en — Ethernet
*   ib — InfiniBand
*   sl — serial line IP (slip)
*   wl — wlan
*   ww — wwan

따라서 전통적인 ethX스타일의 이름 지정 방식과 새로운 시스템 이름 지정 방식 모두 초기 문자 e 는 자동으로 생성 된 인터페이스 이름에 대한 이더넷 인터페이스 여야합니다. 모든 무선 랜 인터페이스는 시작해야 w 모든 인터페이스로 시작하지만, 두 제도의 와이파이 될 것입니다.

이 도구는 사용자는 [같은 임의의 이름을 가진 리눅스 시스템에서 인터페이스 이름을 바꿀 수 있습니다 (오히려 단지 내부를 제어 환경보다) 임의의 환경에서 작업 할 경우 wan0, lan0, lan1, dmz0] 초기 문자에 대한 가정을 깰 것이다을 .


답변

명명 규칙은 LAN 인터페이스의 이름 eth0eth1, …이고 WLAN 인터페이스의 이름 wlan0wlan1,, …입니다.

시스템에 도입 된 소위 “예측 가능한 이름”이 표시됩니다. 실제로는 예측할 수 있지만 하드웨어가 변경되면 변경 될 수도 있습니다. 이는 바로 피해야 할 문제입니다.

추측을 위해 시작 편지가 충분할 수 있습니다. 일부 인터페이스, 특히 WLAN의 힌트는 /sys/class/net/*/uevent다음 과 같습니다.

DEVTYPE=wlan

불행히도 DEVTYPELAN 인터페이스 에는 그런 것이 없습니다 .


답변

내 대답에 대한 한 가지주의 사항 (대부분의 다른 사람들에게도 적용됨) : 귀하의 신청서의 목적을 모르겠습니다. 하나의 특정 문제를 해결하거나 네트워킹을 더 잘 이해하기위한 끔찍한 응용 프로그램 인 경우 다시는 사용하지 마십시오. 인터페이스의 첫 글자를 사용하는 것이 매우 빠르고 까다로운 옵션 일 수 있습니다. 다음 경쟁 업체를 Wireshark 또는 tcpdump에 작성하려는 경우 모든 종류의 엣지 케이스에 적합한 경쟁 업체인지 확인해야합니다.

그리고 작성중인 응용 프로그램이 이러한 극단 사이에있는 경우 자신과 고객 만 논리를 구현하는 데 얼마나 신중해야하는지 알 수 있습니다.

다른 사람들은 이미 여러 가지 이유로 이름이 신뢰할 수 없다고 지적했습니다. 궁극적 인 문제는 소프트웨어에서 매우 일반적인 문제입니다. 알려진 / 문서화 된 사실에 의존하는 대신 하드 코딩 가정.

언급되지 않은 두 번째 문제는 요구 사항에 대한 가정을 기반으로합니다. 나열하려는 인터페이스 목록은 항상 “하드웨어 이더넷 인터페이스”및 “wifi 인터페이스”라는 것입니다.

세 번째 문제는 또 다른 가정입니다. 모든 인터페이스는 현재 생각할 수있는 범주에 속합니다. @ user4556274에서 언급했듯이 Infiniband는 어떻습니까? VPN의 터널 인터페이스는 어떻습니까? 브리지 된 인터페이스는 어떻습니까? 물리적 인터페이스와 논리적 인터페이스를 결합한 브리지 된 인터페이스는 어떻습니까?

그러나 원하는 것을 달성하기위한 옵션이있을 수 있습니다. 먼저, 나열하려는 인터페이스의 특성과 그렇지 않은 인터페이스를 정확하게 정의하십시오.

대부분의 경우 신뢰할 수있는 특성 중 하나는 라우팅 테이블입니다. 그러나 인터페이스가 작동하는 동안에 만 작동하므로 실제로는 원하는 것이 아닐 수 있습니다.

기본 경로가있는 인터페이스 (즉, 0.0.0.0에 대한 경로)는 원하는 인터페이스 일 수 있습니다.

이것은 여전히 ​​가정에 기반하고 있으며보다 안정적인 가정에 기반합니다. 시스템이 모든 아웃 바운드 트래픽을 가상 머신 또는 도커 컨테이너 (예 : 방화벽을 실행하는 컨테이너가있는 경우)를 통해 라우팅하도록 구성 될 수 있습니다. ). 그 반대도 마찬가지입니다. sysadmin은 기본 경로를 삭제하여 외부 트래픽을 잠글 수 있습니다.

다른 옵션은 실제 하드웨어를 사용하여 어떤 드라이버를 사용하는지 확인하는 것입니다. 그런 다음 잘 알려진 특정 드라이버를 제외 할 수 있습니다


답변

본딩 또는 팀 구성 인터페이스를 명시 적으로 제외하고 있습니까? 여기에 우리의 기본값은 사용하는 것입니다 bond0또는 team0우리의 서버에 대한 기본 인터페이스.

나는 당신이 당신의 논리를 다시 생각해야한다고 생각합니다. 주어진 시스템에서 정의 된 모든 네트워크 인터페이스를 반복하면서 이더넷, Wi-Fi, 인피 밴드, 직렬 등으로 나누고 마술을 시도하십시오.


답변

하드웨어 이름을 하드 코드하거나 패턴 일치하지 마십시오. 이것은 모든 장치에 적용됩니다. 장치 목록을 확인하고 적절한 조치를 취하려면 udev에서 제공 한 도구를 사용하십시오. 참조 16.7 영구 장치 이름 지정을 한 다음 해당 읽어 전체 문서 구체적으로, 16.2 및 16.3을. udev는 이제 리눅스에서 장치 관리를 위해 선호되는 방법이므로 udev는 배포에 구애받지 않고 init 시스템에 구애받지 않습니다.

@ user4556274는을 언급 할 때 그의 대답에서 이것을 암시했습니다. udev-builtin-net-id.c즉, 달성하려는 패턴 일치가 내장 부분이라는 것을 의미합니다 udev.

PredictableNetworkInterfaceName 인용 :

systemd 197을 사용하여 systemd / udevd에 여러 가지 다양한 이름 지정 정책에 대한 기본 지원을 추가하고 biosdevname과 유사하지만 (일반적으로 더 강력하고 커널 내부 장치 식별 체계에 더 가까운) 체계를 기본값으로 만들었습니다. udev는 기본적으로 다음과 같은 네트워크 인터페이스 이름 지정 체계를 지원합니다.

  1. 온보드 장치에 대해 제공된 펌웨어 / BIOS 통합 이름 색인 번호 (예 : eno1)
  2. 펌웨어 / BIOS를 통합 한 이름으로 PCI Express 핫 플러그 ​​슬롯 인덱스 번호 제공 (예 : ens1)
  3. 하드웨어 커넥터의 물리적 / 지리적 위치를 포함하는 이름 (예 : enp2s0)
  4. 인터페이스의 MAC 주소를 통합 한 이름 (예 : enx78e7d1ea46da) 예측할 수없는 클래식 커널 고유 ethX 이름 (예 : eth0)

기본적으로 systemd v197은 이제 정책 1) 펌웨어의 정보가 적용 가능하고 사용 가능한 경우 2), 펌웨어의 정보가 적용 가능하고 사용 가능한 경우 3), 해당되는 경우 3으로 떨어지는 정책에 따라 인터페이스 이름을 지정합니다. 5) 다른 모든 경우. 정책 4)는 기본적으로 사용되지 않지만 사용자가 원하는 경우 사용할 수 있습니다.

이 결합 된 정책은 최후의 수단으로 만 적용됩니다. 즉, 시스템에 biosdevname이 설치되어 있으면 우선합니다. 사용자가 커널 장치의 이름을 변경하는 udev 규칙을 추가 한 경우이 규칙도 우선합니다. 또한 배포 특정 명명 체계가 일반적으로 우선합니다.


답변

다른 사람들이 말했듯이 이름에 전적으로 의존 할 수는 없습니다.

내 경우는 것 같다 무선에 대한 것으로 /sys/class/net/<ifacename>/는 무선 인터페이스 인 경우 디렉토리가 거기에 “무선”라는 것이다 :

# kbrandt @ kbrandtlx in /sys/class/net [9:47:43] C:130
$ ls
br-b293588ecdae  enp11s0  lo    veth6061cd8  virbr0-nic
docker0          enp12s0  ppp0  virbr0       wlp13s0

# kbrandt @ kbrandtlx in /sys/class/net [9:47:44]
$ echo  /sys/class/net/*/wireless
/sys/class/net/wlp13s0/wireless