🎃

L-03FでLTEでインターネットに接続する方法2025年版

に公開

TL;DR

以下を行えばL-03Fでインターネットに接続できる

  • (docomo以外のsimを使うなら)sim lock解除
  • (qcserialドライバをちゃんと当てたいなら)kernel module書き換え
  • nas-attachを出せるようにqmicliを改造
  • qmicliとqmi-networkを適切に発行するscriptを作る

背景

  • NWをリモートからメンテするため、既存のNWに依存しない通信手段が欲しくなった
  • 中古で安いLTEモデムとしてL-03Fを1200円程度で手に入れた
    • 今日日バッテリーを積んでいない素のUSB-LTEモデムがほとんど売られていないため
  • せっかくならATコマンドモードではなくRASモードで高速接続したくなった
    • まさかここまで大変な目に遭うとは

課題

L-03Fは約10年前にdocomoから発売されたLTEモデムです。
とにかく古いデバイスかつ類似デバイスとは異なる部分が多く、インターネットに接続するまでには以下の複数の課題の解決が必要でした。

  • docomo以外のSIMを受け付けない
  • 接続時にCDドライブとして認識される
  • CDドライブ認識を解除してもwwanデバイスとして認識されない
  • nas-attachコマンドを送らないとLTEが有効にならない

以降、順番に解決方法を書いていきます。

docomo以外のSIMを受け付けない

普段SIMロックありのデバイスを買わないので存在ごと忘れていたのですが、このL-03FにもSIMロックが掛かっています。
今回使用したSIMはdocomo回線のMVNOであるiijmioのものなのでSIM lockを解除しなくても動いたかもしれませんが、念の為解除をしました。

SIMロック解除方法は店舗に持ち込んで依頼するだけです。お値段も0円です。詳細は以下を参照してください。
https://www.docomo.ne.jp/support/unlock_simcard/

店舗来店には予約が必要かつ預かり作業となるため、SIMロック解除だけで1週間くらいはかかります。

接続時にCDドライブとして認識される

L-03シリーズは接続直後はCDドライブとして認識されて、ejectするとLTEモジュールにアクセスできるようになるようです。

先人の記事を参考にudev ruleに以下を記述して、接続後に自動でejectされるようにします。

# /etc/udev/rules.d/99-l03f.rules
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6367", RUN+="/usr/bin/eject /dev/sr0"

CDドライブ認識を解除してもwwanデバイスとして認識されない

CDドライブとして認識されなくなったあとも、適切なドライバを当てないとLTEモデムとして利用できません。
こちらについては動きはする楽な方法と、少し手間だけど丁寧な方法の2つがあります。

楽な方法

QualcommのUSB-LTEモデムは類似デバイスが多数出ているため、udevで他のデバイスとして認識させるとドライバを正しく当てられると書かれている記事があります。

この記事を参考にudev ruleを書き換えるとqmi_wwanドライバを適応できます。

# /etc/udev/rules.d/99-l03f.rules
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6367", RUN+="/usr/bin/eject /dev/sr0"

ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6366", RUN+="/sbin/modprobe -b qcserial"
SUBSYSTEM=="drivers", ENV{DEVPATH}=="/bus/usb-serial/drivers/qcserial", ATTR{new_id}="1004 6366 0000 05c6 9212"
SUBSYSTEM=="usb", ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6366", RUN+="/sbin/modprobe -b qmi_wwan"
SUBSYSTEM=="drivers", ENV{DEVPATH}=="/bus/usb/drivers/qmi_wwan", ATTR{new_id}="1004 6366 0000 05c6 9212"

ただし、実はL-03Fは類似デバイスとUSB composite deviceの構成が異なるため、ドライバが適切に当たらずwwanが2つ生えてしまいます。
とはいえ片方(wwan1)はちゃんと使えるので、気持ち悪いですがlinux kernelのリビルド不要で動かすにはリーズナブルな選択肢かなと思います。

ちゃんとやる方法

前述の通り、L-03Fは類似デバイスとUSB composite deviceの構成が異なる上、bInterfaceClassなどの情報もすべて255になっていてデバイスの識別に使える情報がないので、ドライバを適切に当てられません。

具体的に先人の記事のL-03Cと比較してみると、L-03FはNMEA Serial Portがなくなっているようです。

name L-03C L-03F
serial MI_00 MI_00 COMポート
NMEA MI_01 COMポート
Modem MI_02 MI_01 ATコマンド用COMポート
NDIS driver MI_03 MI_02 qmi/net

よって、次のようにqcserialドライバをあてる場所を0,1番目に絞って、qmi/netのいる2番目には当てないような修正をkernel側に入れました。

https://gist.github.com/tnishinaga/018b3054bb64e10a9c2723e679bb4dda

あとはKernelごとリビルドして入れ替えたあと再起動すれば、wwanデバイスが1つだけ認識されるはずです。

Raspberry PiにこのLTEモデムを刺している場合、kernelのリビルド方法は以下に書かれているので参考にしてください。

https://www.raspberrypi.com/documentation/computers/linux_kernel.html

もう少し実用的にするにはDKMS化してKernel update時に勝手にリビルドされるようにして、もともとのqcserialのドライバをblacklistに入れておくというやり方があるようなのですが、まだそこまでたどり着けていません。もしやったらまたなにか書きます。
(このやり方はKernelVM discordでpepepperさんから教えていただきました。ありがとうございます!)

nas-attachコマンドを送らないとLTEが有効にならない

L-03Cからある仕様として、L-03Fも初期状態ではLTEが利用不可となっており、nas-attachコマンドを送ると使えるようになるそうです。

ただし2025年現在のqmicli 1.32.2にもnas-attachコマンドを単体で発行する方法はないので、qmicliにコマンドを足す必要があります。
これも先人の記事があるので、これを参考に修正を行いました。それが以下です。

https://github.com/tnishinaga/libqmi_l03f/tree/support_l03f

当時との差分としてattachの定義だけはlibqmi側に増えたので、これを用いるようにしつつnas-attachコマンドを足しています。
また、L-03CとL-03Fの差分としてattach時に渡す値が0x01(L-03C)から0x04(L-03F)に変わっていたので、ここも書き換えています(この違い見つけるためにwindows上でのUSBパケットを読み込んだのですが、長くなるので省略)。

https://github.com/tnishinaga/libqmi_l03f/commit/7e5e76f3eb4ba53cf48e47ec89e8163dc3c94a1b

qmicliのビルドは以下のコマンドで行います。

$ sudo apt-get -y install --no-install-recommends \
        meson ninja-build \
        pkg-config \
        libglib2.0-dev \
        libgudev-1.0-dev \
        libmbim-glib-dev \
        libgirepository1.0-dev \
        help2man \
        libqrtr-glib-dev
$ cd libqmi
$ meson build/
$ cd build
$ ninja

あとはqmi-nwtworkの設定を作ってから以下のようにすればLTEで接続ができます。

$ cat /etc/qmi-network.conf
APN=iijmio.jp
AUTH=CHAP
APN_USER=mio@iij
APN_PASS=iij
IP_TYPE=4

$ sudo ./src/qmicli/qmicli -d /dev/cdc-wdm0 --device-open-sync --nas-attach
[/dev/cdc-wdm0] Successfully message ID 0x0023

$ sudo ./utils/qmi-network /dev/cdc-wdm0 start
Loading profile at /etc/qmi-network.conf...
    APN: iijmio.jp
    APN user: mio@iij
    APN password: iij
    qmi-proxy: no
    IP_TYPE: 4
    PROFILE: unset
Checking data format with 'qmicli -d /dev/cdc-wdm0 --wda-get-data-format '...
Device link layer protocol retrieved: 802-3
Getting expected data format with 'qmicli -d /dev/cdc-wdm0 --get-expected-data-format'...
Expected link layer protocol retrieved: 802-3
Device and kernel link layer protocol match: 802-3
Starting network with 'qmicli -d /dev/cdc-wdm0 --wds-start-network=apn='iijmio.jp',username='mio@iij',password='iij',ip-type='4'  --client-no-release-cid '...
Saving state at /tmp/qmi-network-state-cdc-wdm0... (CID: 26)
Saving state at /tmp/qmi-network-state-cdc-wdm0... (PDH: 93191584)
Network started successfully

ちゃんと接続できていれば以下のコマンドでIPアドレスが取れるはず。

$ sudo qmicli -d /dev/cdc-wdm0 --wds-get-current-settings
[/dev/cdc-wdm0] Current settings retrieved:
           IP Family: IPv4
        IPv4 address: XXX.XXX.XXX.XXX
    IPv4 subnet mask: XXX.XXX.XXX.XXX
IPv4 gateway address: XXX.XXX.XXX.XXX
    IPv4 primary DNS: XXX.XXX.XXX.XXX
  IPv4 secondary DNS: XXX.XXX.XXX.XXX
                 MTU: 1500
             Domains: none

実運用化

電源ON時に自動でLTEに繋いでくれないと遠隔地においてこられないので、自動でLTEを有効化してつながるようにします。
色々雑かもですが、趣味なので動けばOKで。

オレオレlibqmiのインストール

libqmiをビルドしたbuildディレクトリで以下を実行し、/usr/local/ 以下にlibqmiをインストールします。OS側の持つlibqmiと競合するかもなので、OS側にすでにlibqmiが入っている場合は削除しておいてください。

$ sudo ninja install

attach scriptの作成とservice化

起動時にattachを行うため、以下のスクリプトを作ります。
wdm0の部分は適宜書き換えてください。

#!/bin/bash -ue
# l03f_start.bash

set -o pipefail

CDC_WDM="/dev/cdc-wdm0"
COUNT=0
MAX_RETRIES=60
QMICLI="/usr/local/bin/qmicli"

while [ ! -e "$CDC_WDM" ] && [ $COUNT -lt $MAX_RETRIES ]; do
    sleep 1
    COUNT=$((COUNT + 1))
    echo "Retry $COUNT/$MAX_RETRIES..."
done

if [ ! -e "$CDC_WDM" ]; then
    echo "Error: $CDC_WDM not found"
    exit 1
fi

$QMICLI -d $CDC_WDM --device-open-sync --nas-attach

これを起動時に自動で動かすため、systemd service化します。

以下のファイルを /etc/systemd/system/l03f_start.service に作ります。

# /etc/systemd/system/l03f_start.service
[Unit]
Description = start L-03F
After=systemd-udev-settle.service
Before=network-pre.target

[Service]
ExecStart = /usr/local/bin/l03f_start.sh
Restart = no
Type = oneshot

[Install]
WantedBy = multi-user.target

次に以下のコマンドで有効化します。

$ sudo systemctl enable l03f_start.service

これでLTEにつなげる状態でモデムをセットできます。

qmi-networkの自動化

ネットワークへの接続には一般的にmmcliというものを使うそうですが、私の環境ではそれを使うと何故かLTEモデムがUSB接続ごと消える怪現象が起きたので諦めました。

よって、起動時と終了時にqmi-netoworkを呼ぶように設定します。

先ほどと同じように /etc/systemd/system/qmi_network.service を作ります。

# /etc/systemd/system/qmi_network.service
[Unit]
Description = qmi-network
After=l03f_start.service
Before=network-pre.target

[Service]
ExecStart = /usr/local/bin/qmi-network /dev/cdc-wdm1 start
ExecStop = /usr/local/bin/qmi-network /dev/cdc-wdm1 stop
Restart = no
Type = oneshot
RemainAfterExit=true

[Install]
WantedBy = multi-user.target

次にこれをenableで登録します。

$ sudo systemctl enable qmi-network

netplanの設定

デバイスのupとdhcpでのアドレス取得を行ってもらうため、netplanの設定を行います。
今回利用したのはUbuntu 24.04LTSなのでnetplanを使いましたが、他の環境の場合は適宜似たような設定を行ってください。

$ sudo cat /etc/netplan/01-network.yaml
network:
  version: 2
  ethernets:
    # LAN
    enp3s0:
      dhcp4: true
      dhcp6: true
    wwan1:
      dhcp4: true
      dhcp4-overrides:
        route-metric: 600

route-metricを設定して、LANがつながっているときはなるべくそちらで接続するようにしています。
果たしてうまく動くのかは試せてないので謎です。

firewall設定

firewallがないと危険なので有効化します。
tailscaleを使っているので、とりあえずこの口からは何でも許可、それ以外は弾きます。

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow in on tailscale0
sudo ufw enable

おしまい

これで一通り設定は終わり。
インターネットに繋げない環境

偉大なる先人の記事

特にair-ghさんの記事には大変助けられました。ありがとうございます。
もしご存じの方がいたら代わりにお礼を伝えていただけると嬉しいです。

Discussion