1P by GN⁺ 8일전 | ★ favorite | 댓글 1개
  • 안드로이드의 EthernetTracker 서비스는 이름이 ethX인 네트워크 인터페이스만 인식함
  • Linux의 CDC 이더넷 드라이버는 인터페이스 이름을 usbX로 생성
  • 이로 인해, 표준 CDC 이더넷 장치는 안드로이드에서 자동으로 활성화되지 않음
  • 이를 해결하려면 사용자가 직접 폰을 루팅하고 config_ethernet_iface_regex 값을 변경해야 가능함
  • 표준을 따르는 USB 이더넷 어댑터가 아니라, 벤더 특화 드라이버가 있는 특정 칩셋 제품만 사용하는 것이 현실적 방법임

서론 및 문제 개요

  • 안드로이드 기기에서 CDC Ethernet이 작동하지 않는 핵심 원인은 인터페이스 네이밍 규칙 때문임
  • 시스템적으로는 USB 이더넷 어댑터를 지원하지만, Ethernet 메뉴가 활성화되는 조건에는 제약이 있음
  • 호환 가능한 칩셋 정보를 얻기 어렵고, 실질적으로는 사용자 간 "소문"에 의존하는 구조임
  • 안드로이드도 리눅스 커널 기반이지만, 커널 설정만으로 모든 것이 결정되진 않음

USB 디버깅 및 ADB 설정

  • 안드로이드 기기에서 USB 디버깅 활성화 후 ADB 설치 필요
  • 네트워크 어댑터를 테스트하려면, ADB를 Wi-Fi를 통한 네트워크 모드로 전환해야 함
  • 커맨드를 통해 현재 커널 버전과 아키텍처를 확인 가능

커널 버전 및 설정 확인 방법

  • 최신 폰(Android 11 이상)은 GKI(Generic Kernel Image) 커널 구조를 가짐
    • Google이 기본 커널을 빌드하고, 제조사가 모듈만 추가하는 방식
    • 해당 커널 설정 파일(gki_defconfig)에서 지원 기능을 파악 가능
  • 구형 폰은 제조사별로 따로 제공하는 커널 소스에서 defconfig 파일을 찾아 확인해야 함
  • 운이 좋다면, /proc/config.gz 경로에서 현재 커널의 설정을 직접 확인할 수도 있음

지원되는 USB 이더넷 어댑터 확인법

  • 대부분의 관련 커널 설정값은 CONFIG_USB_NET_XXX 형태임
    • y이면 내장, m이면 모듈로 빌드(아마도 사용 가능함), is not set이면 지원 안 함
  • drivers/net/usb/Kconfig 파일에서 각 설정값 설명을 참고 가능
  • 어댑터 칩셋 정보는 여전히 명확히 표시되는 경우가 드묾

CDC 이더넷(Communications Device Class) 및 안드로이드 적용 사례

  • CDC는 USB 네트워킹 표준으로, EEM/ECM/NCM 다양한 프로토콜을 제공
  • Linux, Windows, macOS에서 표준 CDC 이더넷 장치는 별도 드라이버 없이 자동 인식
  • 안드로이드 역시 커널 레벨에서는 관련 드라이버 빌드가 되어 있음
    • 예시: CONFIG_USB_NET_CDCETHER, EEM, NCM 모두 y로 설정된 삼성 기기
  • 그러나, 이더넷 메뉴는 여전히 비활성화

안드로이드의 네트워크 인터페이스 추적 로직

  • 안드로이드는 네트워크 인터페이스 탐지에 EthernetTracker.java 클래스를 사용
  • EthernetTracker는 새 인터페이스가 등장할 때 이름 패턴(정규표현식) 매칭을 수행함
  • 매칭 기준은 리소스(config_ethernet_iface_regex)에서 가져옴
    • 기본값은 eth\d (eth로 시작하고 숫자가 뒤에 오는 네트워크 인터페이스만 유효)
  • 커널이 생성하는 이름(usb0)은 해당 패턴에 부합하지 않아 추적 및 활성화에서 무시

해결 제한 및 결론

  • 이 네이밍 정규표현식은 사용자가 직접 변경 불가(루팅 없이 불가능)
  • 결과적으로 표준 CDC 이더넷 제품은 연결되어도 네트워크 메뉴에서 사용할 수 없음
  • 반대로, 벤더나 칩셋 드라이버로 직접 등록되는 일부 어댑터만 사용 가능
  • Google이 EEM 모듈 등 표준 지원 코드를 커널에 포함하더라도, 실제 동작은 불가함
  • 최소한 (eth|usb)\d로 정규표현식을 바꾸면 해결될 심플한 문제지만, 현재는 그대로 남아 있음

요약

  • 핵심 원인: 안드로이드가 CDC 이더넷 표준을 무시하는 것이 아니라, 네트워크 인터페이스 이름이 정규표현식(eth\d)과 일치하지 않아 활성화되지 않는 구조임
  • 우회 방법: 폰을 루팅한 후 config_ethernet_iface_regex 값을 (eth|usb)\d 등으로 변경해야 가능함
  • 실제 선택: 표준 USB CDC 지원 어댑터보다는, 칩셋별로 드라이버 연동이 명확한 제품을 선택하는 것이 현실적인 대안임
  • 구조적 문제: 사용자 가시성 및 표준 호환성 측면에서 소프트웨어 상위 스택의 네이밍 정책 미비가 시스템적 한계로 작용하는 사례임
Hacker News 의견
  • 예전 직장에서 Android 기기와 CDC Ethernet 어댑터를 연결하려다 고생한 후 이 글을 작성한 경험 공유, 그 후 몇몇 사람들로부터 MAC 주소의 특정 비트를 바꾸면 커널이 ethX 이름을 할당하게 된다는 사실을 들었다는 이야기, 본인은 직접 테스트하거나 해당 내용을 게시글에 반영하지는 않았고, 요즘은 Android 기기를 거의 사용하지 않는다는 설명, 이 방법은 오로지 MAC 주소를 컨트롤할 수 있을 때만 쓸 수 있다는 전제 추가
    • 이 정보 내게 도움이 될 수 있을 것 같다는 반응, 어느 비트인지 찾았다며 관련 링크 공유
    • 해당 포스트에 긍정적 반응 표출
  • 흥미로운 딥다이브 아티클이라는 평가, 소스를 확인해보니 2023년 10월에 문제의 정규식이 eth\d에서 *로 변경된 것 같고, 이로 인해 문제가 해결된 것으로 추정, 관련 코드 변경 링크 제시, Android U+ (아마 버전 14)부터 기본적으로 usb\d+와 eth%d 모두를 포함하게 됐다는 설명
    • 해당 변경 사항이 나중에 "usbX 인터페이스로 테더링하는 기기가 있기 때문"에 대해 롤백(되돌림) 됐다는 사실, 곧이어 Android V+ 버전(신규 버전)만 지원하도록 다시 반영됐다고 설명, 롤백 관련 링크, 최종 적용 링크도 첨부
  • Android의 EthernetTracker 서비스가 ethX로 네이밍된 인터페이스만 인정한다는 부분에 대한 강한 비판, 리눅스 배포판에서는 이미 2000년대에 이런 문제를 해결했다는 설명, 드라이버마다 자기만의 네임 프리픽스를 쓰는 경우가 많아 시스템 전체를 조사해야 하는 불편함이 있었다는 회고, 오늘날 리눅스 배포판은 udev와 같은 도구로 네트워크 인터페이스명을 자동 변경하고, 이 과정이 커널의 SIOCSIFNAME ioctl 호출로 작동한다는 설명, 최신 커널에서는 "wlan*" 혹은 "wlan%d" 식의 이름에 자동 숫자가 부여되는 편리함까지 제공한다는 점 덧붙임
  • LineageOS 커밋 히스토리를 보면 해당 문제가 수정됐다가 다시 호환성 문제로 되돌려졌고, 최신 Android 버전에는 다시 적용된 상태라는 분석, 커밋 내용을 보면 Google 소속도 관여한 것으로 보여서 구글 공식 빌드에서도 적용됐을 가능성이 있다는 의견
  • "<i>config_ethernet_iface_regex 값을 바꾸기 위해선 폰을 루팅하는 것 외엔 방법이 없다</i>"는 글의 문장에 공감하며, 내가 소유한 기기에서 루트 권한이 중요한 또 다른 이유라고 주장
    • 네트워크 트래픽을 임의로 우회할 수 있다는 점이 사용자 영역에 superuser 권한을 부여해선 안 되는 가장 큰 이유라 생각, OEM에 부트로더 언락 허용 압박하는 건 찬성하지만, Android에서 루트 권한이 공격자에게 허용하는 큰 위협 범위에 비해 정당화될 만한 용도를 딱히 못 떠올리겠다는 입장
  • "안된다"고 하는 의미를 묻는 질문, 맥북용 USB 허브 동글을 Android 폰에 꽂으면 Ethernet 포트가 문제 없이 동작했고, 셀룰러 모뎀이 Ethernet 장치로 인식되어 Android에서 잘 작동한 경험 공유
    • 이런 문제는 이미 수정됐으며, 원본 기사는 2년 전 글이라는 안내
  • Android는 매우 불편하게도 여러 네트워크 동시 연결이 되지 않는다는 불만, 예를 들어 인터넷이 없는 WiFi(기본 라우터도 없음)와 셀룰러 네트워크를 동시에 연결하고 싶어도 불가, 리눅스나 윈도우에선 당연히 가능한데 Android는 이를 억지로 막고 있고, 심지어 많은 변형 버전에서는 인터넷 없는 WiFi에 집착할 경우 혼란스러운 방식으로 끊기게 된다거나 추가적으로 앱에서만 좀 돌아가는 API가 제공될 뿐 사용자 자체는 이런 제어를 할 수 없게 막혀 있다는 지적
    • iOS도 비슷하며, 블랙박스에서 영상을 받으려고 WiFi에 접속하면 "인터넷 없음, 셀룰러로 전환?" 팝업이 뜨고, 계속 WiFi에 머물겠다고 해도 결국 iOS가 알아서 CarPlay 네트워크로 강제 전환해버린다는 경험 공유, 수동 해제 방법조차 제공되지 않는 점 덧붙임
    • 윈도우도 실제로 두 개의 무선 어댑터로 두 개의 wifi 네트워크에 동시에 접속은 불가, 적어도 GUI에서는 안되고 터미널로는 시도해보지 않았다는 언급
    • 이 제한이 정말 짜증난다는 의견, 인터넷이 장애날 때 폰으로 진단하려는 순간 WiFi에 머물지 않아 어려움을 겪는 상황 공유, Android의 DNS 설정 또한 DHCP로 받아오지 않는 등 복잡한 문제도 있다는 불만
    • 서양 Android폰을 가지고 중국 본토에 들어가면 더욱 불편했던 경험 토로, Android가 인터넷 연결을 Google 서비스로 확인해 로컬 WiFi는 매번 인터넷 없음 경고를 띄움, 그럴 때마다 사용자가 수동으로 계속 연결 유지할 지 답해야 하는 번거로움 설명
  • 펌웨어 요구 사항도 꼭 확인해야 한다는 조언, 어떤 장치는 정상 인식돼도 펌웨어가 마련되어 있지 않으면 ifup에서 실패하고, Android UI는 이 상황을 전혀 보여주지 못하며 dmesg 로그만 확인해야 문제가 보임, CDC 장치에도 해당되는지는 확실치 않지만 많은 USB 이더넷 동글이 Realtek, Kawasaki 칩셋 위주였고 펌웨어 요구 케이스가 있었다는 경험담, 해당 Android 변화는 최근 일인 것 같지만 바닐라 AOSP 디버깅 기기에서는 USB 네트워크 동글을 잘 사용했으니 커널 혹은 CDC 드라이버 쪽의 네이밍 관행이 아닐까 추측, 결국 동글의 칩셋과 펌웨어 필요 여부는 신경 써야 한다는 조언
  • 15개 넘는 USB 이더넷 어댑터를 소유중이고 Realtek, AXIS 등 서로 다른 칩셋인데도 모두 아주 잘 동작했다는 경험, 리눅스에서 드라이버가 안 필요한 모델만 확보하면 사실상 모든 OS와 BIOS에서 문제 없이 쓸 수 있다는 확신
    • 2023년에 이슈가 수정됐다는 정보와 관련 Hacker News 링크 제시
    • 썬더볼트/USB 독에 달린 이더넷 어댑터가 pixel 5, pixel 9 두 폰 모두에서 잘 작동했다는 추가 경험
  • 완벽한 디버깅 저니로, 정규식 하나로 인해 전체 기기군이 작동 불능이 된 사례가 흥미로웠다는 감탄, 얼마 전 GPT-4와 OpenAI의 alignment/escalation 시스템에서 비슷한 구조적 한계에 부딪혔던 경험 회고, 공식 문서와 로그까지 갖춰서 내부 로직을 트리거하려 했지만 결국 사람이 볼 땐 합리적으로 보이지만 내부 인터페이스의 정규식에 매치되지 못해 막혀버린 것 같았다는 설명, 관련 기록을 별도 링크로 공유, 시스템 구조나 보이지 않는 인터페이스 경계에 관심 있다면 의견을 듣고 싶다는 제안