Ferramentas de configuração de pilha de rede

O sistema operacional Android contém utilitários de rede Linux padrão, como ifconfig , ip e ip6tables . Esses utilitários residem na imagem do sistema e permitem a configuração de toda a pilha de rede do Linux. Em dispositivos com Android 7.xe inferior, o código do fornecedor pode chamar esses binários diretamente, o que apresenta os seguintes problemas:

  • Como os utilitários de rede são atualizados na imagem do sistema, eles não fornecem uma implementação estável.
  • O escopo dos utilitários de rede é tão amplo que é difícil evoluir a imagem do sistema enquanto garante um comportamento previsível.

Em dispositivos que executam o Android 8.0 e superior, a partição do fornecedor permanece a mesma enquanto a partição do sistema recebe uma atualização. Para conseguir isso, o Android 8.0 oferece a capacidade de definir uma interface estável e com controle de versão, ao mesmo tempo em que usa restrições do SELinux para manter a interdependência do fornecedor e da imagem do sistema em um bom conjunto conhecido.

Os fornecedores podem usar os utilitários de configuração de rede fornecidos pela plataforma para configurar a pilha de rede Linux, mas esses utilitários ainda não incluem um wrapper de interface HIDL. Para definir essa interface, o Android 8.0 inclui a netutils-wrapper-1.0 .

Wrapper Netutils

O utilitário netutils wrapper fornece um subconjunto da configuração da pilha de rede do Linux que não é afetado pelas atualizações de partição do sistema. O Android 8.0 contém a versão 1.0 dos wrappers, que permite passar os mesmos argumentos dos utilitários encapsulados, instalados na partição do sistema em /system/bin da seguinte forma:

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

Os links simbólicos mostram os utilitários de rede envolvidos pelo wrapper netutils , que incluem:

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

Para usar esses utilitários no Android 8.0 e superior, as implementações do fornecedor devem seguir as seguintes regras:

  • Os processos do fornecedor não devem executar /system/bin/netutils-wrapper-1.0 diretamente; tentativas de fazê-lo resultarão em erro.
  • Todos os utilitários envolvidos pelo netutils-wrapper-1.0 devem ser iniciados usando seus links simbólicos. Por exemplo, altere o código do fornecedor que fez isso antes ( /system/bin/ip <FOO> <BAR> ) para /system/bin/ip-wrapper-1.0 <FOO> <BAR> .
  • A execução dos wrappers sem transição de domínio é proibida na política SELinux da plataforma. Essa regra não deve ser alterada e é testada no Android Compatibility Test Suite (CTS) .
  • Executar os utilitários diretamente (por exemplo, /system/bin/ip <FOO> <BAR> ) dos processos do fornecedor também é proibido nas políticas do SELinux da plataforma. Esta regra não deve ser alterada e é testada em CTS.
  • Qualquer domínio de fornecedor (processo) que precise iniciar um wrapper deve adicionar a seguinte regra de transição de domínio na política do SELinux: domain_auto_trans( VENDOR-DOMAIN-NAME , netutils_wrapper_exec, netutils_wrapper) .

Filtros de wrapper Netutils

Os utilitários encapsulados podem ser usados ​​para configurar praticamente qualquer aspecto da pilha de rede do Linux. No entanto, para garantir que seja possível manter uma interface estável e permitir atualizações na partição do sistema, apenas certas combinações de argumentos de linha de comando são permitidas; outros comandos serão rejeitados.

Interfaces e cadeias de fornecedores

O wrapper tem um conceito de interfaces de fornecedores . Essas são interfaces normalmente gerenciadas pelo código do fornecedor, como interfaces de dados de celular. Normalmente, outros tipos de interfaces (como Wi-Fi) são gerenciados pelos HALs e pela estrutura. O wrapper reconhece as interfaces do fornecedor pelo nome (usando uma expressão regular) e permite que o código do fornecedor execute muitas operações nelas. Atualmente, as interfaces do fornecedor são:

  • Interfaces cujos nomes terminam em "oem" seguido por um número, como oem0 ou r_oem1234 .
  • Interfaces usadas por implementações SOC e OEM atuais, como rmnet_data[0-9] .

Nomes de interfaces que normalmente são gerenciadas pela estrutura (como wlan0 ) nunca são interfaces de fornecedor.

O wrapper tem um conceito semelhante de cadeias de fornecedores . Estes são usados ​​nos comandos do iptables e também são reconhecidos pelo nome. Atualmente, as redes de fornecedores:

  • Comece com oem_ .
  • São usados ​​por implementações SOC e OEM atuais, por exemplo, cadeias começando em nm_ ou qcom_ .

Comandos permitidos

Os comandos atualmente permitidos estão listados abaixo. As restrições são implementadas por meio de um conjunto de expressões regulares nas linhas de comando executadas. Para obter detalhes, consulte system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp .

IP

O comando ip é usado para configurar endereços IP, roteamento, criptografia IPsec e vários outros parâmetros de rede. O wrapper permite os seguintes comandos:

  • Adicione e remova endereços IP de interfaces gerenciadas pelo fornecedor.
  • Configure a criptografia IPsec.

iptables/ip6tables

Os comandos iptables e ip6tables são usados ​​para configurar firewall, desmembramento de pacotes, NAT e outros processamentos por pacote. O wrapper permite os seguintes comandos:

  • Adicione e exclua cadeias de fornecedores.
  • Adicione e exclua regras em qualquer cadeia que se refira a pacotes entrando ( -i ) ou saindo ( -o ) de uma interface de fornecedor.
  • Pule para uma cadeia de fornecedores de qualquer ponto em qualquer outra cadeia.

ndc

ndc é usado para se comunicar com o daemon netd que executa a maioria das configurações de rede no Android. O wrapper permite os seguintes comandos:

  • Crie e destrua redes OEM ( oemXX ).
  • Adicione interfaces gerenciadas pelo fornecedor a redes OEM.
  • Adicione rotas a redes OEM.
  • Habilite ou desabilite o encaminhamento de IP globalmente e nas interfaces do fornecedor.

tc

O comando tc é usado para configurar o enfileiramento de tráfego e a modelagem nas interfaces do fornecedor.