Как настроить параметры DHCP для WIFI Tethering (Hotspot) на Android?

27

При подключении моего компьютера к точке доступа Wi-Fi на Android он назначил 192.168.42.xадрес моему компьютеру. Мне действительно нужно изменить это, так как это конфликтует с одной из наших рабочих подсетей - возможно ли это?

ВВК
источник
2
Мой мобильный рутирован. Я не против изменения системных файлов при необходимости.
ВВК
Так же, как ответ на нюансы в некоторых из вышеперечисленных великолепных ответов, в моей практике диапазон 192.168.43.0/24 по умолчанию для Android / поставщика назначен для модема WiFi, а 192.168.42.0/24 для модема USB.
Джим Климов

Ответы:

25

К сожалению, нет способа изменить диапазон IP-адресов для встроенной поддержки модема, даже в CyanogenMod. IP-адрес точки доступа Wi-Fi жестко задан в android.net.wifi.WifiStateMachine.startTethering () ; IP-адрес USB-подключения жестко запрограммирован в com.android.server.connectivity.Tethering .

Однако, если ваш телефон рутирован, вы можете попробовать использовать сторонние приложения для модема, у которых есть возможность изменить диапазон IP-адресов. Например, когда встроенный USB-модем был нарушен в CyanogenMod alphas для Samsung Galaxy W, я использовал Wired Tether для корневых пользователей , у которого есть такая опция. Для подключения к Wi-Fi вы можете попробовать приложение Wireless Tether for Root Users от тех же авторов, у которого также есть возможность изменить диапазон IP-адресов.


Поскольку код Google был закрыт, вышеуказанные ссылки больше не работают. Некоторые люди экспортировали исходный код из этих репозиториев в GitHub:

Однако дальнейших разработок не было, и приложения, вероятно, больше не работают на последних версиях Android.

На тот случай, если кто-то захочет попробовать эти устаревшие приложения, я смог найти некоторые APK-файлы в архиве кода Google :

Сергей Власов
источник
+1 за информацию. Мое устройство подключено, но приложение Wireless Tether for Root Users не работает на моем мобильном телефоне. Должен быть какой-то способ изменить диапазон IP-адресов на рутированном телефоне, C'Mon Man !, в конце концов, Android - открытая ОС.
ВВК
@VVK Есть способ. Просто перекомпилируйте источник.
Сякур Рахман
Приложения, о которых вы упоминаете, похоже, больше не существуют. Можете ли вы найти какие-либо новые версии в Интернете, так как вы знаете имя издателей? Я нашел несколько других, но никто из них не был свободен ...
стр.
@pgr Найдены некоторые рабочие ссылки, но нет новых версий.
Сергей Власов
21

Встроенный Wi-Fi-модем Android предназначен для использования 192.168.43.1/24 в качестве сервера с netdиспользованием модема-модема dnsmasq. Первый диапазон DNS 192.168.42.1-254и 2-й диапазон DNS 192.168.43.1-254.

Netd не легко изменить. Для связи с ним требуется сокет, и этот разъем берется, когда андроид начинает подключаться. Но, просматривая исходные файлы для Tethering.java(я использовал Froyo), мы видим:

// 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";

И позже мы увидим эти диапазоны, как резервные копии .

    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;
    }

Основным источником для диапазонов dhcp являются не жестко закодированные 42 и 43, а чтение из array.config_tether_dhcp_range, внутреннего строкового массива. Но это в настоящее время пусто.

Вы можете редактировать рамки Android. На моем телефоне это так /system/framework/framework-res.apk. Есть целая тонна учебников онлайн для редактирования рамки-res.apk, от простых строк до полной тематизации. Найти один для вашего телефона и Android-версии.

Главное, что вы хотите изменить, это /res/values/arrays.xml

Искать <array name="config_tether_dhcp_range" />

Изменить на:

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

скомпилируйте / запакуйте / подпишите как необходимо (следуйте инструкциям), затем переустановите.

Если вы хотите более одного диапазона, просто скопируйте два элемента снова и снова. Вы всегда должны обеспечить старт и остановку для каждого диапазона. Старайтесь держать его в том же / 24, то есть 192.168.50.5 и 192.168.50.99или что-то еще Вы можете подтвердить, что он работает, busybox ps | grep dnsmasqили если у вас нет busybox, ps dnsmasqиспользуйте pid cat /proc/pid/cmdline. Вы должны получить (или подобное):

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

FWIW, мой WIFI-модем использует dnsmasqдиапазоны по умолчанию , но мой компьютер был назначен 192.168.43.147/24и шлюз 192.168.43.1/24. Не уверен, почему ваш 42.xадрес по умолчанию .

CDE
источник
2
42 для USBNET 43 для Wi-Fi
Зибри
приятно найти, где ты это видишь?
CDE
1
Потому что, если вы привязываете по USB, вы получаете 42. Если вы привязываете по Wi-Fi, вы получаете 43.
Зибри
5

Я знаю, что это старый пост, но думал, что предоставлю обновление. Похоже, некоторые производители и версии Android теперь позволяют изменять диапазон IP-подсетей для DHCP-сервера через пользовательский интерфейс при использовании функции точки доступа WiFi. Вот где его можно найти на HTC One M8 под управлением Android 6.0. YMMV.

На экране «Мобильная точка доступа» щелкните значок 3 точки (подробнее), перейдите в раздел «Дополнительно», а затем «Параметры локальной сети». В разделе «Локальный IP» измените IP-адрес на нужный вам IP. В разделе «Локальный DHCP» измените начальный IP-адрес, чтобы он соответствовал подсети вашего IP-адреса.

Трент

Трент
источник
Знаете ли вы, если новые телефоны HTC также имеют эту опцию?
Арья
1

ПРИМЕЧАНИЕ. Требуется рут.

Диапазон IP-адресов DHCP по умолчанию жестко задан ( 1 ) , вы не можете изменить его, не восстанавливая ПЗУ с измененным исходным кодом. Или использовать небольшой взломать.

Когда вы включаете модем, что происходит (по крайней мере):

  • hostapd - демон, который управляет точками доступа - запущен.
  • Сетевые интерфейсы настроены, IP-адрес добавлен к интерфейсу Wi-Fi (жестко задан до Android Pie ( 2 , 3 ) , рандомизирован после ( 4 ) ) и добавлена ​​таблица маршрутизации ( 5 ) для локальной сети ( 6 ) .
  • dnsmasq- сервер DHCP / DNS (до Pie) - запускается с жестко закодированными аргументами командной строки ( 7 ) (в противном случае можно задать /etc/dnsmasq.conf ( 8 ) ).

Таким образом, мы можем заменить /system/bin/dnsmasqпользовательский сценарий оболочки, взяв на себя управление процессом между ними. Переименуйте исходный бинарный файл в другое:

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

Создать скрипт /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 $*

Подтвердите название вашего интерфейса Wi-Fi ( wlan0обычно). Проверьте с помощью ip linkили ls /sys/class/net/.

Кроме того, убедитесь ваша локальная таблица маршрутизации сети является 97: grep local_network /data/misc/net/rt_tables. Маршрутизация Android - беспорядок, усложняющийся с каждым новым выпуском. Так что я не уверен, было ли это постоянным или нет. Также, прежде чем вносить какие-либо изменения, проверьте свою политику маршрутизации и таблицы, чтобы выяснить, что вы должны добавить в свой скрипт:

~# 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

Правила SELinux также должны быть определены, если (все или некоторые) еще не определены, и если статус равен enforcing. Используйте Magisk suploicyили другой подобный инструмент, например 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 }

* не сохраняется при перезагрузке, используйте какой-либо init.dскрипт или замените /sepolicyвramdisk

Установить права на файлы:

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

Наслаждайтесь!

Или вы можете настроить полную привязку из командной строки, запустив свои собственные процессы. Этот ответ включает в себя инструкции, хотя вопрос в другом.

СВЯЗАННЫЙ:

Ирфан Латиф
источник