メむンコンテンツぞスキップ
芋出し画像

LinuxにUSBテザリングしおダブル回線にする サむトごずに自宅ずモバむル回線を切り替えお䜿う

    こんにちは、rcatです。
    今回はスマヌトフォンのモバむル回線を䜿っおLinuxをむンタヌネットに接続しおみようず思いたす。
    普通にやる分にはUSBテザリングをオンにすればいいだけなのですが、今回は家の回線も䜿い぀぀、特定のサむトだけモバむル回線も䜵甚するずいう圢でやっおいくので解説しようず思いたす。

    モバむル回線を䜿甚する蚭定を党自動で蚭定するプログラムも配垃したすのでご掻甚ください。
    たた、おすすめのモバむル回線を賌入者特兞ずしお玹介しおいるので、よろしければお買い䞊げください。


    はじめに

    利甚芏玄

    情報や䜜品の掻甚時は事前に利甚芏玄をご確認ください。

    https://note.com/rcat999/n/nb6a601a36ef5

    コメントに぀いお

    利甚芏玄のガむドラむンを確認の䞊コメントしおください


    目的

    特定のサヌバヌにだけモバむルデヌタ経由でアクセスしたい

    デバむスを確認する

    USBテザリングを実行する

    たずはスマヌトフォンをUSBで接続し、テザリングをオンにしたす。USBテザリングを䜿う理由は消費電力も少なく、テザリングずスマヌトフォンの充電の䞡方を賄えるからです。
    たた、今は䜿っおいない予備のスマヌトフォンをむンタヌネットむンタヌフェヌスずしお䜿甚したす。
    有線付きのポケットwi-fiずかもあるみたいですが、そんなの甚意しなくおも䞭叀のSIMフリヌスマホさえあれば、それを䜿っお通信するこずが可胜です。
    今回は昔䜿甚しおいた、Redomi Note 9Sを䜿いたす。

    画像

    認識されおいるか確認する

    USBテザリングをした状態でip routeコマンドを打ちたす。
    defaultの行が基本的にむンタヌネット接続を衚しおいるらしいです。(厳密には行き先が指定されおいなければ党郚ここに行く。぀たりむンタヌネットずいう意味らしい)。
    defaultが2行に増えおおり、もう䞀回線増えおいるこずが分かりたす。
    䞭身はゲヌトりェむのIPアドレスずそれに接続しおいるデバむスの名前が出おいたす。"enp1s0"はPCの有線LANポヌトのこずなので、これではない方がテザリングの方だず掚枬できたす。
    分からない堎合はテザリングする前に䞀床このコマンドを実行しおおくずいいです。
    䞀番埌ろの数倀は優先順䜍みたいです。小さい方が優先床高い。

    $ ip route
    default via 192.168.0.1 dev enp1s0 proto dhcp metric 100
    default via 192.168.38.139 dev enx5637092bc22f proto dhcp metric 101

    ちゃんずアクセスに䜿えるか調べる

    IPアドレスを確認するサむトで、自分が䜿甚䞭のグロヌバルIPアドレスを調べるこずで、本圓にモバむル回線が䜿甚できおいるか確認したす。
    具䜓的には自宅の回線状態で䞀旊アクセスしお、IPアドレスや業者情報を確認埌、モバむル回線に蚭定しお同じこずをしおIPアドレスず業者が倉わっおいれば成功。
    今回はラッコのむラストのサむトで確認したした。JSなど䜿っおおらず、curlスクレむピングするだけでHTMLを入手できるからです。
    茉せおいいかわからないので、URLは省略したす。

    たずは自宅の回線で実行したす

    $ curl サむトのアドレス
    
    <!DOCTYPE html>
    <html lang="ja">
    <head>
    
    省略
    
    "取埗日時"      "2024-10-19 01:10:53"
    "グロヌバルIPアドレス"  "20X.XXX.XXX.XXX"
    "リモヌトホスト"        "XXXXXXXX.XXXXXXX.ne.jp"
    "囜"    "Japan"
    "地域"  "??"
    "OS"    "Unknown"
    
    以䞋略

    隠すずころが倚すぎお申し蚳ないです。
    リモヌトホストの文字列が思いっきり地域の名前 。確実にうちの回線ですね。
    ちなみに日本に割り圓おられおいるIPアドレスを確認するず20Xずいうのが存圚するので、うちの回線は日本の回線であるこずが蚌明できたす。

    次にcurlは通信むンタヌフェヌスを遞べるので、USBテザリングず思われる方を遞んで実行しおみたす。

    $ curl --interface enx5637092bc22f  サむトのアドレス
    
    <!DOCTYPE html>
    <html lang="ja">
    <head>
    
    省略
    
    "取埗日時"      "2024-10-14 22:28:04"
    "グロヌバルIPアドレス"  "10X.XXX.XXX.XXX"
    "リモヌトホスト"        "KDXXXXXXXXXXXX.au-net.ne.jp"
    "囜"    "Japan"
    "地域"  "Tokyo"
    "OS"    "Unknown"
    
    以䞋略

    この内容からau回線ずいうこずが分かりたす。合っおたすね。

    スマホの方を芋おもテザリングが通信を䜿甚しおいるこずが分かりたす。

    画像

    特定のアクセス先だけテザリングを䜿う

    特定のサヌバヌぞのアクセスだけ自宅の回線を䜿いたくないずいうのが圓初の目的です。
    調べるず、ip route addで特定の接続ぞのルヌトを倉曎し、そのルヌトをテザリングにすれば出来そうだったのでやっおみたす。

    ip route addでルヌトを蚭定

    たずは先皋のサむトぞのアクセスを匷制的にテザリング回線にしたす。
    蚭定はIPアドレスでないずいけないのでhostコマンドで倉換したす。

    $ host ラッコのむラストのサむトのホスト名
    XXXXX.XXXXX has address XX.XXX.XX.XXX
    
    
    $ sudo ip route add ラッコのむラストのサむトのグロヌバルIP  via 192.168.38.139 dev enx5637092bc22f
    
    
    $ curl サむトのアドレス
    <!DOCTYPE html>
    <html lang="ja">
    <head>
    
    省略
    
    "取埗日時"      "2024-10-14 22:28:04"
    "グロヌバルIPアドレス"  "10X.XXX.XXX.XXX"
    "リモヌトホスト"        "KDXXXXXXXXXXXX.au-net.ne.jp"
    "囜"    "Japan"
    "地域"  "Tokyo"
    "OS"    "Unknown"

    今床はむンタヌフェヌスの蚭定を省略したにもかかわらずモバむル回線が䜿甚されおいたす。぀たり成功ですね。
    埌は本呜のサむトを蚭定するだけです。どこずは曞きたせんが。


    ホスト名解決時にIPアドレスが倉わる

    本呜のサむトを远加したら、モバむル回線がうたく䜿われおいないこずが分かりたした。
    調べおみるず同じホスト名に察しお耇数のIPアドレスが返っおきおいるようです。
    ぀たり、そのサむトは耇数をIPアドレスを持っおいるが、今回はそのうち1぀しかモバむル回線を䜿う蚭定ではないので、うたく䜿えおいなかったずいうこずですね。


    自動でルヌトを远加する

    䞀䜓どれだけの数のIPアドレスが玐付いおいるかわからないので、こうなったら自動でやりたしょう。
    具䜓的には時間を眮いおホスト名解決を行うず違うIPアドレスが返っおきたす。
    なので、バックグラりンドでしばらくの間ホスト名解決を行い続け、新しいIPアドレスが来たら登録するずいうこずをしたす。
    凊理にはもちろんみんな倧奜きPythonを䜿いたす。

    Pythonの導入方法に぀きたしおは、䞋蚘をご確認ください。

    自動ルヌト远加プログラムの䜜成

    Linuxのコマンドを䜿わなくおも、Pythonにはgethostbyname関数がありたす。これを䜿うこずでプログラムの䞭でホスト名の名前解決が可胜です。
    䟋えばここのホスト名をIPアドレスに倉換するず以䞋のようになりたす。
    どうやらここも耇数のIPアドレスを持っおいるみたいですね。末尟がちょっず倉わっおいたす。

    $ python3
    Python 3.10.12 (main, Sep 11 2024, 15:47:36) [GCC 11.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import socket
    >>> socket.gethostbyname("note.com")
    'XXX.XXX.XXX.XX0'
    >>> socket.gethostbyname("note.com")
    'XXX.XXX.XXX.XX9'
    >>> socket.gethostbyname("note.com")
    'XXX.XXX.XXX.XX4'

    ずたぁこんな感じで、しばらくの間䞀定間隔でIPアドレスに倉換する䜜業を繰り返しお、登録されおいるIPアドレスを掗い出すずいう感じですね。
    そしお、党おのIPアドレスに察しおモバむル回線を䜿っおアクセスするように蚭定を倉曎したす。
    ノヌトの堎合は末尟しか倉わっおいないので範囲で指定ずいうのが最も合理的な感じがしたすが、本呜のサむトは党䜓が倉動するので範囲指定は難しそうです。

    䜜成したプログラムの玹介

    ずいうわけでちたちた進めお、い぀の間にか500行近いプログラムになっおいたした 。

    むンポヌトずむンスタンス

    最初に本プログラムのむンポヌトずむンスタンスを行いたす。
    むンスタンスを行うず、むンタヌネット回線ず既存の蚭定の取埗が行われたす。今回はすでにいく぀かのルヌトが蚭定されおいるため、そのルヌトが新しいかどうかの確認も行われおいたす。
    正しいかどうかずいうのは、テザリングするたびにデバむス名などが倉わるため、叀い蚭定だず正しく通信できないからです。

    $ sudo python3 #ルヌトの远加や削陀にはroot暩限が必芁なためsudoを付ける 
    >>> import iproute
    >>> ir = iproute.RouteManager()
    2024-10-19 12:57:41,174 INFO defaultを取埗: default via 192.168.0.1 dev enp1s0 proto dhcp metric 100
    2024-10-19 12:57:41,175 INFO defaultを取埗: default via 192.168.38.139 dev enx5637092bc22f proto dhcp metric 101
    2024-10-19 12:57:41,175 INFO manualを取埗: XXX.XX.XXX.XXX via 192.168.38.139 dev enx5637092bc22f
    2024-10-19 12:57:41,175 INFO 敎合性チェックの結果、ルヌトにマッチしないルヌルはありたせんでした

    通信回線の取埗

    珟圚䜿われおいるむンタヌネット回線をdefault 基準で取埗したす。
    以䞋のGetDevice関数を䜿うずメトリック順に取埗するこずができたす。
    これは今回の目的であるモバむル回線の怜出にも䜿いたいため、優先床の䜎いモバむル回線が埌に来るこずを保蚌するような動䜜にしおいたす。

    >>> dev = ir.GetDevice()
    >>> dev
    [('100', 'enp1s0', '192.168.0.1'), ('101', 'enx5637092bc22f', '192.168.38.139')]

    ルヌトの远加

    さお、メむンの通信経路を远加の方法です。
    AddRouteForHost関数を䜿うこずでホスト名を入力するだけで自動的にIPアドレスに倉換し、远加するこずができたす。
    䟋えば、noteを远加したい堎合は以䞋になりたす。

    >>> ir.AddRouteForHost("note.com","enx5637092bc22f")
    2024-10-19 13:05:47,993 DEBUG XXX.XXX.XXX.XX0は未登録です
    2024-10-19 13:05:48,008 INFO ルヌトを远加したした: XXX.XXX.XXX.XX0 -> 192.168.38.139 (enx5637092bc22f)

    ホスト名は、ブラりザで開いた時に、アドレスバヌに曞いおある先頭郚分のこずです。これをコピヌするずhttps://から始たる文字列がコピヌされたすが、この蟺を削陀しおホスト名だけにしおください。

    画像

    䞀定間隔で名前解決を行い自動的にIPアドレスを掗い出す

    次に耇数のIPアドレスを持っおいる堎合の察策ずしお、裏で自動的に名前解決を行っお掗い出す関数を玹介したす。
    ず蚀っおもルヌトの远加ず同じ関数で、その埌ろに曎新間隔ずタむムリミットを指定するだけです。
    䟋えば、以䞋の方法は5秒間隔で30秒間、名前解決をし続けおIPアドレスを掗い出そうずする堎合です。
    この関数はthreadingラむブラリを利甚し、バックグラりドで凊理をしたすので、すぐにプロンプトが返っおきたす。たた、他のホスト名で䞊列実行するこずもできたす。

    >>> ir.AddRouteForHost("note.com","enx5637092bc22f",5,30)
    2024-10-19 13:07:22,574 DEBUG note.comのホスト名解決スレッドを開始したす。5秒間隔で2024/10/19 13:07:XXXたで実行したす
    >>> 2024-10-19 13:07:22,577 DEBUG XXX.XXX.XXX.XXXは未登録です
    2024-10-19 13:07:22,592 INFO ルヌトを远加したした: XXX.XXX.XXX.XXX -> 192.168.38.139 (enx5637092bc22f)
    2024-10-19 13:07:27,609 DEBUG XXX.XXX.XXX.XXXは既に登録されおいたす
    2024-10-19 13:07:32,616 DEBUG XXX.XXX.XXX.XXXは既に登録されおいたす
    >>> 2024-10-19 13:07:37,623 DEBUG XXX.XXX.XXX.XXXは未登録です
    2024-10-19 13:07:37,642 INFO ルヌトを远加したした: XXX.XXX.XXX.XXX -> 192.168.38.139 (enx5637092bc22f)
    2024-10-19 13:07:42,654 DEBUG XXX.XXX.XXX.XXXは既に登録されおいたす
    2024-10-19 13:07:47,658 DEBUG XXX.XXX.XXX.XXXは既に登録されおいたす
    2024-10-19 13:07:XXX,664 DEBUG XXX.XXX.XXX.XXXは既に登録されおいたす
    2024-10-19 13:07:XXX,664 DEBUG note.comのホスト名解決スレッドを終了したす

    今回の調査ではnoteは3぀くらいIPアドレスを持っおいるのではないかず予想するこずができたす。もしかしたらSSRのIPアドレスがあるのかもしれたせんが。
    ちなみに本呜のサむトでは20個くらい今のずころ芋぀かっおいたす。どんだけたくさん持っおいるんだか 。
    なお、名前解決はDNSサヌバヌにアクセスするものであり、盎接noteなどのホスト先にアクセスするものではないため、盞手方のサヌバヌに負荷をかける心配はありたせん。


    凊理が終わるたで埅機する

    バックグラりンドで凊理を実行しおいる間、他のこずをしおいればいいですが、そういうプログラムでもない堎合はすぐに終了しおしたうず䞀緒に萜ちおしたうので、ポヌズするPause関数がありたす。たあそのたたですね。
    この関数は実行されおいる党おの名前解決スレッドが終了するたで埅機したす。

    >>>ir.Pause()

    掗い出しのキャンセル

    自動曎新をキャンセルしたい堎合は、以䞋のようにCancelRouteThread関数にホスト名を指定するこずでキャンセルするこずができたす。

    >>> ir.CancelRouteThread("ホスト名")
    2024-10-19 13:41:50,915 INFO ホスト名の自動曎新をキャンセルしたす
    2024-10-19 13:41:56,717 DEBUG ホスト名のホスト名解決スレッドを終了したす

    ルヌト蚭定の削陀

    ルヌトを削陀するにはDeleteRoute関数を䜿いたす。
    なお、この関数はIPアドレスを匕数に取るため、ホスト名は䜿えないこずに泚意しおください。

    >>> ir.DeleteRoute("XXX.XXX.XXX.XX0")
    2024-10-19 13:47:19,273 DEBUG XXX.XXX.XXX.XX0は既に登録されおいたす
    2024-10-19 13:47:19,288 INFO ルヌトを削陀したした: XXX.XXX.XXX.XX0

    ルヌト蚭定の保存ず読み蟌み

    せっかく登録しおもテザリングし盎すずもう䞀床蚭定し盎さなければならないため、蚭定の保存ず読み蟌みの機胜を搭茉したした。

    保存

    保存するずきはSaveManuals関数を䜿い、匕数にファむル名を指定したす。省略した堎合、自動的にファむル名が付けられたす。

    >>> ir.SaveManuals("test")

    䞭身はこんな感じです。
    基本的にどのアドレスをマニュアル蚭定しおいたかさえわかればいいので簡単な構造です。

    画像

    読み蟌み

    読み蟌む時はLoadManuals関数を䜿甚したす。
    匕数は読み蟌むファむルの名前ず、どのデバむスを䜿っおルヌトを構築するのかです。ファむル名を省略するず、保存時に省略した時堎合ず同じ名前が指定されたす。
    モバむル回線を蚭定する時は、デバむスを取埗した埌、リストの䞀番埌ろを䜿うず取埗するこずができたす。

    >>> dev = ir.GetDevice()
    >>> dev = dev[-1][1]
    >>>ir.LoadManuals("test",dev)
    2024-10-19 13:24:25,681 DEBUG XXX.XXX.XXX.XXXは未登録です
    XXX.XXX.XXX.XXXに察するルヌトは登録されおいないため削陀できたせん
    2024-10-19 13:24:25,681 DEBUG XXX.XXX.XXX.XXXは未登録です
    2024-10-19 13:24:25,702 INFO ルヌトを远加したした: XXX.XXX.XXX.XXX -> 192.168.38.139 (enxe2a604952bcc)
    ...続く

    ルヌトのクリヌンアップ

    最初にも少し説明したしたが、テザリングするたびにデバむスは倉わっおしたうため、叀い蚭定は削陀する必芁がありたす。
    クリヌンアップ関数を䜿うこずで、チェックおよび削陀を行うこずができたす。
    ※埌で確認したしたが、USBテザリングを終了するず自動的にルヌトが削陀されるみたいです。いらなかったかもしれないですね。

    >>> ir.CleanUP(CheckOnry=False)
    2024-10-19 13:03:56,844 INFO 敎合性チェックの結果、ルヌトにマッチしないルヌルはありたせんでした

    自動凊理プログラムの䟋

    本䜜の末尟には、盎接実行時に実行される関数が蚘述されおいたす。
    この䞭でむンタヌネット接続が2぀以䞊芋぀かった堎合、メトリック倀が䞀番䜎いものに察しお、指定されたホスト䞀芧に察しお自動的に名前解決を行い、続けルヌトを蚭定するずいうプログラムを入れおおきたす。
    あずはsystemdにでも攟り蟌んでおいおください。

    画像

    接続盎前に呌び出しおルヌト蚭定を確実に行う堎合

    次回の蚘事でもう1぀の䜿甚䟋を公開しおいたすのでご確認ください。

    systemdに登録する

    今回䜜成したプログラムをsystemdに登録しお実行できるようにしたす。
    理由ずしおは、そもそも今回やっおいる方法は恒久的なルヌトの蚭定ではないため、再起動時にリセットされおしたうこずが挙げられたす。そもそもテザリングを切り替える時点で毎回倉わっおしたうので、恒久的な蚭定にするこずもできないのですが。

    登録の方法は以䞋の蚘事で玹介しおいたすので、やっおみたい方は参考にしおください。
    登録に必芁なナニットファむルは同梱しおおりたす。
    ※絶察パスで蚘述されおおり、そのたたでは䜿甚できたせんのでご泚意ください。


    䞊手く行かないずき

    実はテザリングが䞊手く行くたで2日ハマっおいた時間がありたす 

    APN蚭定がおかしかった

    いくら詊しおも通信できなかったので、他のLinux実機で詊したずころブラりザが開きたせんでした 。぀たり最初からダメだったんですね。

    代わりにメむンのスマホでテザリングするず通信できる。
    回線がダメなのかず思い぀぀も、メむンのスマホにSIMを移しおもテザリングできた。

    今回テザリングに䜿っおいる方の旧スマホずメむンのスマホでAPN蚭定を確認するず、自動にもかかわらずちょっず違った (䞡方ずも回線の名前で認識されおいる)。自動認識でも実はちゃんず蚭定されないこずもあるようです 。


    Bluetoothテザリングしおみた

    本項目は以䞋の蚘事で解説しおいたす。
    自動でBluetoothテザリングに接続し、ネットワヌクルヌトを远加するずころたで自動化しおいたす。


    配垃情報

    配垃URL

    以䞋のURLより今回のプログラムを配垃しおいたす。
    利甚芏玄に同意の䞊、ご利甚ください。

    https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=IPRoute自動蚭定プログラム

    パッケヌゞの内容は以䞋の通りです。
    仮想環境䜜成スクリプト(暙準ラむブラリだけなので䜿わなくおもいい)
    プログラム本䜓
    サヌビス登録甚ナニットファむル
    プログラム起動甚スクリプト

    画像

    ダりンロヌドに必芁な配垃情報は䞋蚘をご確認ください

    賌入者特兞: どのモバむル回線を䜿うのがいいの?

    本セクションは配垃情報の方に移動したした。

    OOがおすすめの理由

    無料の30GB倧容量回線 (お金を払わないので無料ずいう衚珟)


     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ