AndroidのWi-FiホットスポットにPCを接続すると、PCに「192.168.42.x」のアドレスが割り当てられました。職場のサブネットの1つと競合するため、どうしてもこれを変更する必要があるのですが、可能でしょうか?
残念ながら、CyanogenModであっても、内蔵されているテザリングサポートのIPアドレス範囲を変更する方法はありません。Wi-FiホットスポットのIPはandroid.net.wifi.WifiStateMachine.startTethering()に、USBテザリングのIPはcom.android.server.connectivity.Tetheringにハードコードされています。
しかし、お使いの携帯電話がRoot化されている場合は、IPアドレスの範囲を変更するオプションを持つサードパーティ製のテザリング用アプリを使用してみることができます。例えば、Samsung Galaxy WのCyanogenMod alphasで内蔵のUSBテザリングが使えなくなったときには、そのようなオプションがあるWired Tether for Root Usersを使いました。Wi-Fiテザリングの場合は、同じ作者のWireless Tether for Root Usersというアプリを試してみてください。このアプリにもIPアドレスの範囲を変更するオプションがあります。
Google Codeが閉鎖されたため、上記のリンクは機能しなくなりました。これらのリポジトリからソースコードをGitHubにエクスポートしている人もいます。
しかし、その後の開発活動はなく、おそらく最近のAndroidバージョンではアプリは動作しなくなっています。
ただ、これらの古いアプリを試してみたいという人のために、Google Code ArchiveにいくつかのAPKファイルを見つけることができました。
Androidに内蔵されている無線LANのテザリングは、192.168.43.1/24をサーバーとし、netd
がdnsmasq
を使ってテザリングを処理するように設計されています。第一DNS範囲は192.168.42.1-254
、第二DNS範囲は192.168.43.1-254
です。
Netdは簡単には変更できません。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から読み込まれます。しかし、それは現在空です。
アンドロイドフレームワークを編集してみてください。私の携帯電話では、/system/framework/framework-res.apk
となっています。framework-res.apkを編集するためのチュートリアルは、単純な文字列から完全なテーマ設定まで、オンラインでたくさんあります。あなたの携帯電話とアンドロイドのバージョンに合ったものを見つけてください。
主に変更したいのは /res/values/arrays.xml
です。
配列名="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つの項目を何度もコピーしてください。各範囲には必ず開始点と停止点を設ける必要があります。192.168.50.5 と
192.168.50.99のように、同じ /24 に収めるようにしてください。動作しているかどうかは、
busybox ps | grep dnsmasqで確認できますし、もしbusyboxがない場合は
ps dnsmasqで、
cat /proc/pid/cmdline`でpidを使用します。次のような結果が得られるはずです:
(似たようなもの):
/system/bin/dnsmasq --no-daemon --no-poll --no-resolv --dhcp-range=192.168.50.5,192.168.50.99,1h
ところで、私の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に変更します。 Local DHCP"では、開始IPをIPアドレスのサブネットに合わせて変更します。
トレント
注意:ルートが必要です。。
デフォルトのDHCP IPアドレス範囲はハードコードされています(1)< / sup>、変更されたソースコードでROMを再構築せずに変更することはできません。 または、少しハックを使用します。
テザリングをオンにすると、(少なくとも)何が起こりますか。
-hostapd
-アクセスポイントを管理するデーモン-が開始されます。
-ネットワークインターフェイスがセットアップされ、IPアドレスがWi-Fiインターフェイスに追加されます(Android Pieの前にハードコードされます([2][2]、[3][3])< / sup>、ランダム化後で([4])< / sup>)、ルーティングテーブルが追加されます>.
-dnsmasq
-DHCP / DNSサーバー(Pieまで)-ハードコードされたコマンドライン引数(7)< / sup>で開始されます。 ( / etc / dnsmasq.conf
(8)<.
したがって、 / system / bin / dnsmasq
をカスタムシェルスクリプトに置き換えて、その間のプロセスを制御できます。 元のバイナリの名前を別の名前に変更します。
``。
。 スクリプト `/ system / bin / dnsmasq`を作成します。
。
OLD_SUBNET = '192.168.43'。 NEW_SUBNET = '192.168.1'。 WIFI_INTERFACE = 'wlan0'。 LOCAL_TABLE = '97'。
PATH = / system / binをエクスポートします。
ip route del $ {OLD_SUBNET} .0 / 24 dev $ {WIFI_INTERFACE}テーブル$ LOCAL_TABLE。 ipルートは$ {NEW_SUBNET} .0 / 24 dev $ {WIFI_INTERFACE}テーブル$ LOCAL_TABLEを追加します。
ipアドレスに$ {NEW_SUBNET} .1 / 24 dev $ WIFI_INTERFACEを追加します。
セット-$(printf '%s' "$*" | sed 's / '$ {OLD_SUBNET} '/' $ {NEW_SUBNET} '/ g')。 設定を解除OLD_SUBNET NEW_SUBNET WIFI_INTERFACE LOCAL_TABLE。
exec dnsmasq.bin $ *。
`。 Wi-Fiインターフェイスの名前を確認します(通常「wlan0」)。
ip linkまたは
ls / sys / class / net /`で確認します。
また、ローカルネットワークルーティングテーブルが 97
であることを確認します: grep local_network / data / misc / net / rt_tables
。 Androidのルーティングは混乱しており、新しいリリースごとに複雑になっています。 これが永続的であるかどうかはわかりません。 また、変更を行う前に、ルーティングポリシーとテーブルをチェックして、スクリプトに何を入れるべきかを理解してください。
。 〜#RULES = "$(ipルール| grep -vE '到達不可能|ローカル') "。 〜#エコー "$ RULES"。 〜#t in $(echo "$ RULES" | awk '{print $ NF}' | uniq); ip r sテーブル$ tを実行します。完了しました。
。
SELinuxルールは、(すべてまたは一部)がまだ定義されておらず、ステータスが「強制」されている場合にも定義する必要があります。 Magiskの「スプロシー」または「セポリシーインジェクト」のような他の同様のツールを使用します。
``。
netd system_file dir {開いているgetattr検索を読む}を許可します。 netd system_fileファイルを許可します{gettattr open secut_no_transを読み取ります}。
netd shell_execファイルを許可します{getattr op secut _no_transを読み取ります}。
netd toolbox_execファイルを許可します{gettattr open secut ece_no_transを読み取ります}。
netd netd機能{sys_admin}を許可します。
`。 <sup> *再起動全体で永続的ではありません。
init.dスクリプトを使用するか、
ramdisk< / sup>の
/ sepolicy`を置き換えます。
ファイルに権限を設定します。
。 〜#0.0 / system / bin / dnsmasq *を唱えます。 〜#chmod 0755 / system / bin / dnsmasq *。 〜#chcon u:object_r:dnsmasq_exec:s0 / system / bin / dnsmasq *。
。
楽しい。!
または、コマンドラインから完全なテザリングをセットアップして、独自のプロセスを実行することもできます。 この回答には指示が含まれていますが、質問は異なります。
関連:。
-静的IPアドレスをWi-FiまたはUSBテザークライアントに永続的に割り当てるにはどうすればよいですか?。 -ホットスポットテザリングIPアドレスを永続的に変更するにはどうすればよいですか?。
[2]:https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-8.1.0_r65/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine .java#69。 [3]:https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-8.1.0_r65/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine .java#193。 [4]:https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-9.0.0_r42/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine .java#210。 [5]:https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-9.0.0_r42/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine .java#199。