Ferramentas de configuração da 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 o Android 7.x e versões anteriores, 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 oferecem uma implementação estável.
  • O escopo dos utilitários de rede é tão amplo que é difícil evoluir a imagem do sistema e garantir um comportamento previsível.

Em dispositivos com o Android 8.0 e versões mais recentes, a partição do fornecedor permanece a mesma enquanto a partição do sistema recebe uma atualização. Para isso, o Android 8.0 oferece a capacidade de definir uma interface estável e versionada, além de usar restrições do SELinux para manter a interdependência do fornecedor e da imagem do sistema em um conjunto conhecido.

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

Wrapper Netutils

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

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 encapsulados pelo wrapper netutils, que incluem:

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

Para usar esses utilitários no Android 8.0 e versões mais recentes, as implementações do fornecedor precisam estar em conformidade com as seguintes regras:

  • Os processos do fornecedor não podem executar /system/bin/netutils-wrapper-1.0 diretamente. As tentativas de fazer isso resultam em um erro.
  • Todos os utilitários encapsulados por netutils-wrapper-1.0 precisam ser iniciados usando os links simbólicos. Por exemplo, mude 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 do SELinux da plataforma. Essa regra não pode ser alterada e é testada no Conjunto de teste de compatibilidade do Android (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. Essa regra não pode ser alterada e é testada no CTS.
  • Qualquer domínio do fornecedor (processo) que precise iniciar um wrapper precisa 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 do wrapper Netutils

Os utilitários agrupados podem ser usados para configurar quase 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 determinadas combinações de argumentos de linha de comando são permitidas. Outros comandos são rejeitados.

Interfaces e cadeias de fornecedores

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

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

Os nomes de interfaces que normalmente são gerenciados pelo framework (como wlan0) nunca são interfaces do fornecedor.

O wrapper tem um conceito semelhante de cadeias de fornecedores. Eles são usados em comandos iptables e também são reconhecidos pelo nome. No momento, as cadeias de fornecedores:

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

Comandos permitidos

Confira abaixo os comandos permitidos no momento. As restrições são implementadas por um conjunto de expressões regulares nas linhas de comando executadas. Para mais 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 e ip6tables

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

  • Adicionar e excluir cadeias de fornecedores.
  • Adicione e exclua regras em qualquer cadeia que se refira a pacotes que entram (-i) ou saem (-o) de uma interface do fornecedor.
  • Ir para uma cadeia de fornecedores de qualquer ponto em qualquer outra cadeia.

ndc

O 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 às redes OEM.
  • Adicionar rotas a redes OEM.
  • Ative ou desative o encaminhamento de IP globalmente e nas interfaces do fornecedor.

tc

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