2011-12-16 2 views
2

NetworkInterface.getNetworkInterfaces()의 반환 값과 관련하여 다소 혼란 스럽습니다. NetworkInterface 객체 목록을 필터링하여 "실제"(실제 하드웨어가 뒷받침하는) 것을 파악하려고합니다. 코드는 ... 같은java.net.NetworkInterface.getNetworkInterfaces() "실제"인터페이스를 찾습니다.

Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); 
while (e.hasMoreElements()) { 
    NetworkInterface iface = (NetworkInterface) e.nextElement(); 
    if (!iface.isLoopback() && !iface.isVirtual()) { 
     byte[] macAddress = iface.getHardwareAddress(); 
     String message = String.format(
      "%s %s parent: %s", 
      iface.getName(), 
      byteArrayToHexString(macAddress), 
      iface.getParent()); 
     System.out.println(message); 
    } 
} 

... 그리고 출력 등 ...

vnic1 00 1C 42 00 00 09 parent: null 
vnic0 00 1C 42 00 00 08 parent: null 
en1 60 33 4B 20 C4 97 parent: null 

내가 아는을 보이는 "vnic1"그 "vnic0"사람은 ("진짜"아니다 Parallels는 때때로이 머신에서 실행되는 VM을 지원하기 위해이 머신을 사용했습니다.) NetworkInterface를 통해 "실제"가 아닌 것을 탐지 할 수있는 방법이 있습니까? 아니면 "en1"과 같은 실제 카운터와 효과적으로 구분할 수 있습니까? 나는 "그 이름이 en0 또는 en1이면 그 진짜"와 같은 이름에 의존하게되는 것에 의존해야한다는 것을 싫어합니다. 어떤 아이디어?

답변

2

MAC의 첫 번째 절반은 공급 업체 코드이므로 조회 할 수 있습니다. 대다수의 공급 업체는 아마도 물리적 또는 가상 (둘 다 아님) 장치를 만듭니다.

이 접근법을 사용하면 100 %의 공격을받지는 않지만 사용하기에 "충분 함"일 수 있습니다.

누군가가 MAC 주소를 스푸핑하는 경우에도 도움이되지 않습니다.

여기서 무엇을하려고합니까? 궁극적 인 목표를 설명하면 다른 접근법이있을 수 있습니다.

+0

궁극적 인 목표는이 게임에서 부자와 체크 아웃을하는 것이지만, 지금은 중요하지 않습니다. MAC 주소의 바이트를 가져 와서 UUID 생성을 시드하려고합니다. java.util.UUID는 기본적으로 난수입니다. MAC 주소를 사용하여 더 잘 만들 수 있는지 궁금 해서요. Java 6에서 사용 가능하다는 것을 알았습니다. 그게 내가 이걸로 갈거야. 시드 UUID MAC 주소입니다. –

+0

무작위 UUID는 모든 합당한 목적에 충분히 적합합니다. UUID를 시드하는 방법을 고안하면 계획을 더 잘 나타낼 수있는 모든 수학을 수행하지 않으면 상황이 악화 될 것입니다. UUID를 사용합니다 .randomUuid() –

0

완전히 테스트했지만 NetworkInterface을 사용해 보았습니다. isVirtual()? 설명서에서 :

이 인터페이스가 가상 인터페이스 (하위 인터페이스라고도 함)인지 여부를 반환합니다. 가상 인터페이스는 일부 시스템에서는 물리적 인 인터페이스의 하위로 생성되고 다른 설정 (예 : 주소 또는 MTU)이 주어진 인터페이스입니다. 일반적으로 인터페이스의 이름은 하나의 물리적 인터페이스에 여러 개의 가상 인터페이스가 연결될 수 있으므로 콜론 (:)과 자식을 식별하는 숫자 뒤에 부모 이름이옵니다.

+0

코드는 이미 isVirtual() 및 isLoopback()을 필터링하여 제거하므로 해당 의미에서 "실제"입니다. 게다가 그들은 부모가 없기 때문에 discriminator도 좋지 않습니다. 이 사소한 문제가 MAC 주소에 대한 나의 이해를 넓혔습니다. 마치 하나만 ​​지정하면됩니다. –

+0

실제로 할당 할 수 있습니다. mac 주소는 위조 할 수 없습니다. :) – Bombe

+1

그러나 MAC 주소의 일부는 공급 업체 코드입니다. "001C42"는 "Parallels, Inc."의 공급 업체 코드이므로 가상 수취인 공급 업체의 작은 데이터베이스가 필요한 것일 수 있습니다. – Bombe

관련 문제