네트워크 스택 구성 도구

Android 운영체제에는 ifconfig, ipip6tables와 같은 표준 Linux 네트워킹 유틸리티가 포함되어 있습니다. 이러한 유틸리티는 시스템 이미지에 있으며 전체 Linux 네트워킹 스택의 구성을 지원합니다. Android 7.x 이하를 실행하는 기기에서 공급업체 코드는 이러한 바이너리를 직접 호출할 수 있으므로 다음과 같은 문제가 발생할 수 있습니다.

  • 네트워크 유틸리티는 시스템 이미지에서 업데이트되기 때문에 안정적인 구현을 제공하지 않습니다.
  • 네트워킹 유틸리티의 범위가 너무 광범위하여 예측 가능한 동작을 보장하면서 시스템 이미지를 향상시키기가 어렵습니다.

Android 8.0 이상을 실행하는 기기에서는 시스템 파티션이 업데이트되는 동안 공급업체 파티션이 동일하게 유지됩니다. 이를 위해 Android 8.0은 버전이 지정된 안정적인 인터페이스를 정의할 수 있는 기능을 제공하는 동시에 SELinux 제한을 사용하여 공급업체 및 시스템 이미지의 상호 의존성을 정상으로 알려진 세트로 유지합니다.

공급업체는 플랫폼에서 제공하는 네트워크 구성 유틸리티를 사용하여 Linux 네트워킹 스택을 구성할 수 있지만, 이러한 유틸리티에는 아직 HIDL 인터페이스 래퍼가 포함되어 있지 않습니다. 이러한 인터페이스를 정의하기 위해 Android 8.0에는 netutils-wrapper-1.0 도구가 포함되어 있습니다.

Netutils 래퍼

netutils 래퍼 유틸리티는 시스템 파티션 업데이트의 영향을 받지 않는 Linux 네트워크 스택 구성의 하위 집합을 제공합니다. Android 8.0에는 다음과 같이 /system/bin에 있는 시스템 파티션에 설치된 래핑된 유틸리티와 동일한 인수를 전달할 수 있는 래퍼 버전 1.0이 포함되어 있습니다.

u:object_r:system_file:s0           /system/bin/ip-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/ip6tables-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/iptables-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/ndc-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:netutils_wrapper_exec:s0 /system/bin/netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/tc-wrapper-1.0 -> netutils-wrapper-1.0

심볼릭 링크는 다음과 같이 netutils 래퍼로 래핑된 네트워킹 유틸리티를 보여줍니다.

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

Android 8.0 이상에서 이러한 유틸리티를 사용하려면 공급업체 구현 시 다음과 같은 규칙을 준수해야 합니다.

  • 공급업체 프로세스는 /system/bin/netutils-wrapper-1.0을 직접 실행해서는 안 됩니다. 이를 시도하면 오류가 발생합니다.
  • netutils-wrapper-1.0으로 래핑된 모든 유틸리티는 심볼릭 링크를 사용하여 실행되어야 합니다. 예를 들어 이전에 이 작업을 실행한 공급업체 코드(/system/bin/ip <FOO> <BAR>)를 /system/bin/ip-wrapper-1.0 <FOO> <BAR>로 변경합니다.
  • 도메인 전환 없이 래퍼를 실행하는 것은 플랫폼 SELinux 정책에 따라 금지됩니다. 이 규칙은 변경되어서는 안 되며 Android 호환성 테스트 모음(CTS)을 통해 테스트됩니다.
  • 공급업체 프로세스에서 직접 유틸리티를 실행하는 것(예: /system/bin/ip <FOO> <BAR>)도 플랫폼 SELinux 정책에 따라 금지됩니다. 이 규칙은 변경되어서는 안 되며 CTS를 통해 테스트됩니다.
  • 래퍼를 실행해야 하는 모든 공급업체 도메인(프로세스)은 SELinux 정책에 다음 도메인 전환 규칙을 추가해야 합니다. domain_auto_trans(VENDOR-DOMAIN-NAME, netutils_wrapper_exec, netutils_wrapper)

Netutils 래퍼 필터

래핑된 유틸리티는 Linux 네트워킹 스택의 거의 모든 측면을 구성하는 데 사용할 수 있습니다. 그러나 안정적인 인터페이스를 유지하고 시스템 파티션 업데이트를 허용하기 위해, 특정한 명령줄 인수의 조합만 허용되며 그 외의 명령어는 거부됩니다.

공급업체 인터페이스 및 체인

래퍼에는 공급업체 인터페이스 개념이 있습니다. 이는 일반적으로 모바일 데이터 인터페이스와 같이 공급업체 코드에서 관리하는 인터페이스입니다. 일반적으로 다른 유형의 인터페이스(예: Wi-Fi)는 HAL 및 프레임워크에서 관리합니다. 래퍼는 정규 표현식을 사용하여 이름으로 공급업체 인터페이스를 인식하고 공급업체 코드가 이러한 인터페이스에서 여러 작업을 처리하도록 허용합니다. 현재 공급업체 인터페이스는 다음과 같습니다.

  • 'oem'으로 끝나는 이름 다음에 숫자(예: oem0 또는 r_oem1234)가 오는 인터페이스
  • 현재 SOC 및 OEM 구현에 사용되는 인터페이스(예: rmnet_data[0-9])

일반적으로 프레임워크에서 관리하는 인터페이스의 이름(예: wlan0)은 공급업체 인터페이스가 아닙니다.

래퍼에는 공급업체 체인이라는 유사한 개념이 있습니다. 이는 iptables 명령어에 사용되며 이름으로도 인식됩니다. 현재 공급업체 체인에는 다음과 같은 특징이 있습니다.

  • oem_으로 시작합니다.
  • 현재 SOC 및 OEM 구현에 사용됩니다(예: nm_ 또는 qcom_으로 시작하는 체인).

허용된 명령어

현재 허용되는 명령어는 다음과 같습니다. 제한사항은 실행 대상인 명령줄의 정규 표현식을 통해 구현됩니다. 자세한 내용은 system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp를 참조하세요.

ip

ip 명령어는 IP 주소, 라우팅, IPsec 암호화 및 기타 여러 네트워크 매개변수를 구성하는 데 사용됩니다. 래퍼는 다음 명령어를 허용합니다.

  • 공급업체에서 관리하는 인터페이스에서 IP 주소를 추가 및 삭제합니다.
  • IPsec 암호화를 구성합니다.

iptables/ip6tables

iptablesip6tables 명령어는 방화벽, 패킷 맹글링(mangling), NAT 및 기타 패킷당 처리 방식을 구성하는 데 사용됩니다. 래퍼는 다음 명령어를 허용합니다.

  • 공급업체 체인을 추가 및 삭제합니다.
  • 공급업체 인터페이스로 들어가거나(-i) 거기로부터 나오는(-o) 패킷을 참조하는 모든 체인의 규칙을 추가 및 삭제합니다.
  • 다른 모든 체인의 어느 지점에서 공급업체 체인으로 이동합니다.

ndc

ndc는 Android에서 대부분의 네트워크 구성을 처리하는 netd 데몬과 통신하는 데 사용됩니다. 래퍼는 다음 명령어를 허용합니다.

  • OEM 네트워크(oemXX)를 생성 및 폐기합니다.
  • 공급업체에서 관리하는 인터페이스를 OEM 네트워크에 추가합니다.
  • OEM 네트워크에 경로를 추가합니다.
  • 전역 및 공급업체 인터페이스에서 IP 전달을 사용 설정하거나 사용 중지합니다.

tc

tc 명령어는 공급업체 인터페이스에서 트래픽 대기열 및 셰이핑을 구성하는 데 사용됩니다.