Como definir as configurações de DHCP do WIFI Tethering (Hotspot) no Android?

27

Ao conectar meu PC ao ponto de acesso Wi-Fi do Android, ele atribuiu um 192.168.42.xendereço ao meu PC. Eu realmente preciso mudar isso, pois entra em conflito com uma de nossas sub-redes de trabalho - isso é possível?

VVK
fonte
2
Meu celular está enraizado. Não me importo de alterar os arquivos do sistema, se necessário.
VVK
Assim como a resposta às nuances em algumas das ótimas respostas acima, na minha prática, o intervalo 192.168.43.0/24 é o padrão do Android / fornecedor atribuído ao compartilhamento WiFi e 192.168.42.0/24 é o compartilhamento USB.
Jim Klimov

Respostas:

25

Infelizmente, não há como alterar o intervalo de endereços IP para o suporte de compartilhamento integrado, mesmo no CyanogenMod. O IP do ponto de acesso Wi-Fi é codificado em android.net.wifi.WifiStateMachine.startTethering () ; o IP de compartilhamento USB é codificado em com.android.server.connectivity.Tethering .

No entanto, se o telefone estiver enraizado, você pode tentar usar aplicativos de terceiros para amarrar, que têm a opção de alterar o intervalo de endereços IP. Por exemplo, quando o tethering USB incorporado foi quebrado nos alfas CyanogenMod para Samsung Galaxy W, usei o Wired Tether para usuários raiz , que tem essa opção. Para compartilhamento de Wi-Fi, você pode experimentar o aplicativo Wireless Tether for Root Users dos mesmos autores, que também tem a opção de alterar o intervalo de endereços IP.


Como o Google Code foi desligado, os links acima não funcionam mais. Algumas pessoas exportaram o código fonte desses repositórios para o GitHub:

No entanto, não houve mais atividades de desenvolvimento e os aplicativos provavelmente não funcionam mais nas versões recentes do Android.

Caso alguém queira experimentar esses aplicativos obsoletos, encontrei alguns arquivos APK no Google Code Archive :

Sergey Vlasov
fonte
+1 para a informação. Meu dispositivo está enraizado, mas o aplicativo Tether sem fio para usuários raiz não está funcionando no meu celular. Deve haver alguma maneira de alterar o intervalo de IP no telefone raiz, C'Mon Man !, afinal o Android é um sistema operacional aberto.
VVK
@VVK Existe um caminho. Apenas recompile a fonte.
Syakur Rahman
Os aplicativos que você mencionou parecem não existir mais. Você pode encontrar novas versões online, já que sabe o nome dos editores? Encontrei alguns outros, mas nenhum deles estava livre ...
pgr 27/10
@pgr Foram encontrados alguns links de trabalho, mas nenhuma versão mais recente.
Sergey Vlasov 30/10
21

O tethering wifi interno do Android foi projetado para usar 192.168.43.1/24 como servidor, com o netdmanuseio do tethering dnsmasq. O primeiro intervalo de DNS é 192.168.42.1-254e o segundo intervalo de DNS é 192.168.43.1-254.

Netd não é fácil de mudar. Ele requer um soquete para se comunicar com ele, e esse soquete é usado quando o Android inicia o compartilhamento. Mas, passando os arquivos de origem para Tethering.java(eu usei o Froyo), vemos:

// usb client will be provided 192.168.42.129
private static final String USB_NEAR_IFACE_ADDR      = "192.168.42.129";
private static final String USB_NETMASK              = "255.255.255.0";

// FYI - the default wifi is 192.168.43.1 and 255.255.255.0

private String[] mDhcpRange;
private static final String DHCP_DEFAULT_RANGE1_START = "192.168.42.2";
private static final String DHCP_DEFAULT_RANGE1_STOP  = "192.168.42.254";
private static final String DHCP_DEFAULT_RANGE2_START = "192.168.43.2";
private static final String DHCP_DEFAULT_RANGE2_STOP  = "192.168.43.254";

E mais tarde, vemos esses intervalos usados, como backups .

    mDhcpRange = context.getResources().getStringArray(
            com.android.internal.R.array.config_tether_dhcp_range);
    if ((mDhcpRange.length == 0) || (mDhcpRange.length % 2 ==1)) {
        mDhcpRange = new String[4];
        mDhcpRange[0] = DHCP_DEFAULT_RANGE1_START;
        mDhcpRange[1] = DHCP_DEFAULT_RANGE1_STOP;
        mDhcpRange[2] = DHCP_DEFAULT_RANGE2_START;
        mDhcpRange[3] = DHCP_DEFAULT_RANGE2_STOP;
    }

A fonte principal para os intervalos dhcp não são os 42 e 43 codificados, mas lidos em array.config_tether_dhcp_range, um array interno de strings. Mas está vazio no momento.

Você pode editar a estrutura do Android. No meu telefone, é /system/framework/framework-res.apk. Há uma tonelada de tutoriais on-line para edição de quadro res.apk, de cordas simples para theming completo. Encontre um para o seu telefone e a versão do Android.

A principal coisa que você deseja alterar é a /res/values/arrays.xml

Olhe para <array name="config_tether_dhcp_range" />

Mudar para:

<string-array name="config_tether_dhcp_range">
     <item>192.168.x.y</item>
     <item>192.168.x.z</item>
</string-array>

compile / zip / sign conforme necessário (siga um tutorial) e reinstale.

Se você deseja mais de um intervalo, basta copiar os dois itens repetidamente. Você sempre precisa fornecer um começo e uma parada para cada intervalo. Tente mantê-lo no mesmo / 24, ou seja, 192.168.50.5 e 192.168.50.99ou o que for. Você pode confirmar que está funcionando busybox ps | grep dnsmasqou, se não tiver o busybox ps dnsmasq, use o pid in cat /proc/pid/cmdline. Você deve obter (ou similar):

/ system / bin / dnsmasq --no-daemon --no-poll -no-resolv --dhcp-range = 192.168.50.5,192.168.50.99,1h

FWIW, meu compartilhamento WIFI usa os dnsmasqintervalos padrão , mas meu computador foi atribuído 192.168.43.147/24e gateway 192.168.43.1/24. Não sei por que o seu padrão foi um 42.xendereço.

cde
fonte
2
42 é para USBnet 43 é para wi-fi
Zibri
boa descoberta, onde você vê isso?
cde
11
Porque se você corda por usb você recebe 42. Se você corda por wi-fi você começa 43.
Zibri
5

Eu sei que este é um post antigo, mas pensei em fornecer uma atualização. Parece que alguns fabricantes e versões do Android agora permitem alterar o alcance da sub-rede IP do servidor DHCP por meio da interface do usuário ao usar o recurso de ponto de acesso WiFi. Aqui está onde encontrá-lo em um HTC One M8 executando o Android 6.0. YMMV.

Na tela Mobile Hotspot, clique no ícone de 3 pontos (mais), vá para Avançado e, em seguida, Configurações da LAN. Em "IP local", altere o endereço IP para o IP desejado. Em "DHCP local", altere o IP inicial para corresponder à sub-rede do seu endereço IP.

Trent

Trent
fonte
Você sabe se os novos telefones HTC também têm essa opção?
Arya
1

NOTA: A raiz é necessária.

O intervalo de endereços IP do DHCP padrão é codificado ( 1 ) , você não pode alterá-lo sem reconstruir a ROM com o código-fonte modificado. Ou use um pequeno truque.

Quando você ativa o tethering, o que acontece (pelo menos):

  • hostapd - o daemon que gerencia os pontos de acesso - é iniciado.
  • As interfaces de rede são configuradas, o endereço IP é adicionado à interface Wi-Fi (codificado antes do Android Pie ( 2 , 3 ) , randomizado depois ( 4 ) ) e a tabela de roteamento é adicionada ( 5 ) para a rede local ( 6 ) .
  • dnsmasq- o servidor DHCP / DNS (até Torta) - é iniciado com argumentos de linha de comando codificados ( 7 ) (que podem ser definidos em /etc/dnsmasq.conf ( 8 ) de outra forma).

Assim, podemos substituir /system/bin/dnsmasqpor um script de shell personalizado, assumindo o controle do processo no meio. Renomeie o binário original para outra coisa:

# mv /system/bin/dnsmasq /system/bin/dnsmasq.bin

Criar script /system/bin/dnsmasq:

#!/system/bin/sh

OLD_SUBNET='192.168.43'
NEW_SUBNET='192.168.1'
WIFI_INTERFACE='wlan0'
LOCAL_TABLE='97'

export PATH=/system/bin

# delete old route, add new
ip route del ${OLD_SUBNET}.0/24 dev ${WIFI_INTERFACE} table $LOCAL_TABLE
ip route add ${NEW_SUBNET}.0/24 dev ${WIFI_INTERFACE} table $LOCAL_TABLE

# set new IP address on Wi-Fi interface
ip address add ${NEW_SUBNET}.1/24 dev $WIFI_INTERFACE

# inject new subnet in hard-coded arguments received from netd
set -- $(printf '%s' "$*" | sed 's/'${OLD_SUBNET}'/'${NEW_SUBNET}'/g')
unset OLD_SUBNET NEW_SUBNET WIFI_INTERFACE LOCAL_TABLE

# execute original binary with new arguments
exec dnsmasq.bin $*

Confirme o nome da sua interface Wi-Fi ( wlan0normalmente). Verifique com ip linkou ls /sys/class/net/.

Também confirmam a sua tabela de roteamento de rede local é 97: grep local_network /data/misc/net/rt_tables. O roteamento do Android é uma bagunça, ficando mais complexo a cada nova versão. Portanto, não tenho certeza se isso foi persistente ou não. Antes de fazer alterações, verifique também suas políticas e tabelas de roteamento para descobrir o que você deve colocar em seu script:

~# RULES="$(ip rule | grep -vE 'unreachable|local')"
~# echo "$RULES"
~# for t in $(echo "$RULES" | awk '{print $NF}' | uniq); do ip r s table $t; done

As regras do SELinux também precisam ser definidas se (todas ou algumas) ainda não estiverem definidas e se o status for enforcing. Use Magisk's suploicyou alguma outra ferramenta similar como sepolicy-inject:

# execute binaries from /system/bin
allow netd system_file dir { read open getattr search }
allow netd system_file file { read gettattr open execute execute_no_trans }

# execute /system/bin/sh
allow netd shell_exec file { read getattr open execute execute_no_trans }

# execute /system/bin/toolbox and its applets
allow netd toolbox_exec file { read gettattr open execute execute_no_trans }

# configure RPDB rules / routing tables
allow netd netd capability { sys_admin }

* Não é persistente entre as reinicializações, use algum init.dscript ou substituir /sepolicyemramdisk

Defina permissões nos arquivos:

~# chown 0.0 /system/bin/dnsmasq*
~# chmod 0755 /system/bin/dnsmasq*
~# chcon u:object_r:dnsmasq_exec:s0 /system/bin/dnsmasq*

Apreciar!

Ou você pode configurar o compartilhamento completo da linha de comando, executando seus próprios processos. Esta resposta inclui as instruções, embora a pergunta seja diferente.

RELACIONADOS:

Irfan Latif
fonte