PCをAndroid Wi-Fiホットスポットに接続すると、PCに192.168.42.x
アドレスが割り当てられました。作業サブネットの1つと競合するため、これを本当に変更する必要があります-これは可能ですか?
PCをAndroid Wi-Fiホットスポットに接続すると、PCに192.168.42.x
アドレスが割り当てられました。作業サブネットの1つと競合するため、これを本当に変更する必要があります-これは可能ですか?
回答:
残念ながら、CyanogenModであっても、組み込みテザリングサポートのIPアドレス範囲を変更する方法はありません。Wi-FiホットスポットIPはandroid.net.wifi.WifiStateMachine.startTethering()にハードコーディングされています。USBテザリングIPはcom.android.server.connectivity.Tetheringにハードコードされています。
ただし、電話がルート化されている場合は、IPアドレス範囲を変更するオプションがあるサードパーティ製のテザリングアプリを使用して試すことができます。たとえば、Samsung Galaxy WのCyanogenModアルファで組み込みのUSBテザリングが壊れたとき、そのようなオプションがあるルートユーザー用の有線テザーを使用しました。Wi-Fiテザリングの場合、同じ作成者のルートユーザー向けワイヤレステザーアプリを試すことができます。このアプリには、IPアドレス範囲を変更するオプションもあります。
Google Codeがシャットダウンされたため、上記のリンクは機能しなくなりました。一部の人々は、これらのリポジトリからGitHubにソースコードをエクスポートしました。
ただし、それ以上の開発活動はなく、アプリはおそらく最近のAndroidバージョンでは動作しません。
誰かがこれらの古いアプリを試してみたい場合に備えて、Google Code ArchiveでAPKファイルを見つけることができました。
AndroidのビルトインWiFiテザリングは、192.168.43.1 / 24をサーバーとして使用するように設計されてnetd
おり、テザリングを処理するには、を使用しdnsmasq
ます。最初のDNS範囲は192.168.42.1-254
andで、2番目のDNS範囲は192.168.43.1-254
です。
Netdは簡単に変更できません。それと通信するためにソケットが必要であり、そのソケットは、Androidがテザリングを開始するときに取得されます。しかし、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";
そして、後でこれらの範囲が使用されていることをAS 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;
}
dhcp範囲の主なソースはハードコードされた42および43ではなく、内部文字列配列であるarray.config_tether_dhcp_rangeから読み取られます。しかし、現在は空です。
Androidフレームワークを編集できます。私の電話では、です/system/framework/framework-res.apk
。ありますトンのチュートリアルのは、完全なテーマに、単純な文字列から、フレームワーク-res.apkを編集するためのオンライン。お使いの携帯電話とAndroidバージョン用の1つを見つけてください。
変更したい主なものは /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 /署名し(チュートリアルに従って)、再インストールします。
複数の範囲が必要な場合は、2つのアイテムを繰り返しコピーします。各範囲の開始と停止を常に提供する必要があります。同じ/ 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
アドレスがデフォルトになった理由がわかりません。
これは古い投稿であることは知っていますが、アップデートを提供すると思いました。一部のメーカーとAndroidのバージョンでは、WiFiホットスポット機能を使用する場合、UIを介してDHCPサーバーのIPサブネット範囲を変更できるようになりました。ここでは、Android 6.0を実行しているHTC One M8でそれを見つけることができます。YMMV。
[モバイルホットスポット]画面で、3つのドットのアイコン(詳細)をクリックし、[詳細設定]、[LAN設定]の順に移動します。[ローカルIP]で、IPアドレスを目的のIPに変更します。[ローカルDHCP]で、開始IPを変更してIPアドレスのサブネットに一致させます。
トレント
注:ルートが必要です。
デフォルトのDHCP IPアドレスの範囲はハードコード(1)されており、変更されたソースコードでROMを再構築せずに変更することはできません。または、小さなハックを使用します。
テザリングをオンにすると、何が起こりますか(少なくとも):
hostapd
-アクセスポイントを管理するデーモンが開始されます。dnsmasq
-DHCP / DNSサーバー(パイまで)-ハードコードされたコマンドライン引数(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
ます。マジスク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*
楽しい!
または、コマンドラインから完全なテザリングをセットアップして、独自のプロセスを実行できます。この答えには指示が含まれていますが、質問は異なります。
関連: