Ferramentas de configuração da pilha de rede

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

  • Como os utilitários de rede são atualizados na imagem do sistema, e fornece uma implementação estável.
  • O escopo dos utilitários de rede é tão amplo que é difícil evoluir a imagem do sistema, garantindo 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 fazer isso, o Android 8.0 fornece a capacidade de definir uma interface estável com controle de versão, além de usar Restrições do SELinux para manter a interdependência entre o fornecedor e a imagem do sistema a 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 da interface HIDL. Para definir essa interface, o Android 8.0 inclui a Ferramenta netutils-wrapper-1.0.

Wrapper do Netutils

O utilitário wrapper netutils fornece um subconjunto do Linux configuração da pilha de rede que não seja afetada pelas atualizações de partição do sistema. O Android 8.0 contém a versão 1.0 dos wrappers, que permite que você transmita a os mesmos argumentos dos utilitários empacotados, 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 unidos pela 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 siga as seguintes regras:

  • Os processos do fornecedor não podem ser executados /system/bin/netutils-wrapper-1.0 diretamente; tentar fazer isso resulta em erro.
  • Todos os utilitários unidos por netutils-wrapper-1.0 precisam ser iniciados usando links simbólicos. Por exemplo, mudar o código do fornecedor que fez isso antes (/system/bin/ip <FOO> <BAR>) para /system/bin/ip-wrapper-1.0 <FOO> <BAR>.
  • É proibida a execução dos wrappers sem a transição de domínio na plataforma política do SELinux. Essa regra não pode ser alterada e é testada no Conjunto de teste de compatibilidade (CTS) do Android.
  • 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 de fornecedor (processo) que precise iniciar um wrapper deve adicionar o 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 do Netutils

Os utilitários unidos podem ser usados para configurar quase todos os aspectos do Linux pilha de rede. No entanto, para garantir que seja possível manter interface de usuário e permitir atualizações na partição do sistema, apenas algumas combinações de argumentos de linha de comando são permitidos. outros comandos serão rejeitados.

Interfaces e redes de fornecedores

O wrapper tem um conceito de interfaces do fornecedor. São interfaces geralmente gerenciada por código do fornecedor, como interfaces de dados móveis. Normalmente, outros tipos de interfaces (como Wi-Fi) são gerenciadas pelas HALs, de análise de dados em nuvem. O wrapper reconhece interfaces de fornecedores pelo nome (usando um endereço e permite que o código do fornecedor execute muitas operações neles. Atualmente, as interfaces do fornecedor são:

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

Nomes de interfaces que normalmente são gerenciadas pelo framework (como wlan0) nunca são interfaces do fornecedor.

O wrapper tem um conceito semelhante de cadeias de fornecedores. Elas são usadas em comandos iptables e também são reconhecidos pelo nome. Atualmente, cadeias de fornecedores:

  • Comece com oem_.
  • São usadas pelas implementações atuais de SOC e OEM, por exemplo, cadeias que começam em nm_ ou qcom_.

Comandos permitidos

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

IP

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

  • Adicione e remova endereços IP das interfaces gerenciadas pelo fornecedor.
  • Configurar criptografia IPsec.

iptables e ip6tables

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

  • Adicione e exclua redes de fornecedores.
  • Adicione e exclua regras em qualquer cadeia relacionada aos pacotes que entram (-i) ou fora de (-o) a interface de um fornecedor.
  • Acesse uma cadeia de fornecedores a partir de qualquer ponto de 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 que o seguinte comandos:

  • Criar e destruir redes OEM (oemXX).
  • Adicionar interfaces gerenciadas pelo fornecedor a redes OEM.
  • Adicione rotas para redes OEM.
  • Ativar ou desativar o encaminhamento de IP globalmente e nas interfaces do fornecedor.

TC

O comando tc é usado para configurar o enfileiramento e a modelagem de tráfego. sobre interfaces de fornecedores.