Як налаштувати налаштування DHCP для WIFI Tethering (Hotspot) на Android?


27

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


2
У мене мобільний корінь. Я не проти змінити системні файли, якщо потрібно.
VVK

Так само, як відповідь на нюанси у деяких з вищезазначених чудових відповідей, в моїй практиці діапазон 192.168.43.0/24 призначений за замовчуванням для Android / постачальника, призначений для підключення Wi-Fi, а 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 для Samsung Galaxy W, я використовував Wired Tether для користувачів Root , який має таку можливість. Для підключення Wi-Fi ви можете спробувати бездротовий тетер для кореневих користувачів додаток від тих самих авторів, який також має можливість змінити діапазон IP-адрес.


Оскільки Google Code було вимкнено, вищезазначені посилання більше не працюють. Деякі люди експортували вихідний код із цих сховищ до GitHub:

Однак подальшої активності в розробці не було, і програми, ймовірно, більше не працюють на останніх версіях Android.

На випадок, якщо хтось захоче спробувати ці застарілі програми, я зміг знайти деякі файли APK в архіві Google Code :


+1 для інформації. Мій пристрій вкорінено, але додаток Wireless Tether for Root Users не працює на моєму мобільному пристрої. Має бути якийсь спосіб змінити діапазон IP на вкоріненому телефоні, C'Mon Man !, Android все-таки є відкритою ОС.
VVK

@VVK Є спосіб. Просто перекомпілюйте джерело.
Сякур Рахман

Згадані програми, які ви згадуєте, більше не існують. Чи можете ви знайти будь-які нові версії в Інтернеті, оскільки ви знаєте назву видавців? Я знайшов інших, але жоден із них не був вільним ...
пгр

@pgr Знайдено кілька робочих посилань, але нові версії немає.
Сергій Власов

21

Вбудований через Wi-Fi модем Android розроблений для використання 192.168.43.1/24 в якості сервера, для netdобробки тетерінгу, використовуючи dnsmasq. Перший діапазон DNS є 192.168.42.1-254і другий діапазон 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>

компілюйте / zip / підпишіть за потребою (дотримуйтесь підручника), а потім перевстановіть.

Якщо вам потрібно більше одного діапазону, просто скопіюйте два елементи знову і знову. Завжди потрібно передбачати старт і зупинку для кожного діапазону. Спробуйте зберегти його в такому ж / 24, тобто 192.168.50.5 і 192.168.50.99будь-якому іншому. Ви можете підтвердити, що він працює, busybox ps | grep dnsmasqабо якщо у вас немає зайнятої скриньки, ps dnsmasqтоді використовуйте pid cat /proc/pid/cmdline. Ви повинні отримати (або подібне):

/ system / bin / dnsmasq --no-daemon --no-опитування -no-resolutionv --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адресою.


2
42 - це для USBNET 43, - для wifi
Zibri

приємна знахідка, де ви це бачите?
cde

1
Тому що якщо ви прив’яжете до usb, ви отримаєте 42. Якщо ви прив’яжете до wifi, ви отримаєте 43.
Zibri

5

Я знаю, що це стара публікація, але я думав, що я б запропонував оновлення. Здається, деякі виробники та версії Android тепер DO дозволяють змінювати діапазон IP-підмереж для сервера DHCP через користувальницький інтерфейс під час використання функції Wi-Fi гарячої точки. Ось де його знайти на HTC One M8 під управлінням Android 6.0. YMMV.

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

Трент


Чи знаєте ви, що нові телефони HTC також мають цю опцію?
Ар'я

1

ПРИМІТКА: Корінь обов'язковий.

Діапазон IP-адрес за замовчуванням DHCP жорстко закодований ( 1 ) , ви не можете змінити його без відновлення ROM з модифікованим вихідним кодом. Або скористайтеся невеликим рубанням.

Коли ви вмикаєте прив'язку, що відбувається (принаймні):

  • 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's 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*

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

Або ви можете встановити повне прив’язання з командного рядка, запускаючи власні процеси. Ця відповідь містить інструкції, хоча питання інше.

ПОВ'ЯЗАНІ:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.