本日は2021年8月19日(木)、天気は快晴です。 盛夏そのものです。
ここ数日前線が日本の上空に滞留していたので天候が不順でした。 まだ大雨に注意が必要なようです。

既にご案内のとおり、今年6月に買った中古のDynabook R634/MにはNomadBSD(中身はFreeBSD 13.0-RELEASE+Openbox)がインストールしてあります。 あろうことかFreeBSDなのにWi-Fiが気軽に使えているのでandroidなスマートフォンからのWi-Fiテザリングが可能です。 FreeBSDをインストールしたラップトップPCをどこかに持ち出してもインターネットに接続できるわけです。 Wi-FiもEthernet(いわゆる有線LAN)がない場所でも、FreeBSDマシンでインターネット接続ですよ。 ロマンですね。(笑)
今回は更に調子に乗ってスマートフォンからUSBテザリングで有線でFreeBSDマシンにインターネットまでご案内しようという企画です。
Wi-Fiテザリングができればそれでいいじゃん。 わざわざケーブルつないでインターネットって、いまどきどういう趣味?と疑問に思う方もいるかもしれません。
ご説明します。
私はコンピュータに関する限り無線というものが好きでありません。
以上です。

それはともかく、なぜUSBテザリングにこだわるのか?
世の中には場合によっては長く滞在しなければならないけれど、有線LAN(イーサネット)はない、Wi-Fiは厳禁、携帯電話回線だけは許されるという厳しい環境があるのです。
わかる人にはわかると思いますが、その厳しい環境というのは、一部の大きな病院の病棟です。 私がかつて入院した病院では、実際にWi-Fiが厳禁でした。 イーサネットが引いてある個室ベッドもあるのですが、そんな病床を使用すると目の玉が飛び出るような差額ベッド代がかかります。医療保険に入っていれば、2日や3日そういう個室を利用して羽根を伸ばすのもいいと思いますけどね。周りを気にせずイヤホンなしで音楽や落語やラジオを聞いてもいいのですから。
だから、いざとなったらUSB有線テザリングを受けられるというのはPCにとっては重要なことなのです。
病棟に入院しているひとのイラスト

ちなみにLinux、特にUbuntuであれば、androidスマートフォンからUSBテザリングを受けるなんてことは笑っちゃうくらい簡単なことです。 適切な設定をしたスマートフォンと適切なUSBケーブルを使ってUbuntuマシンとスマートフォンをつなぐと、いきなりインターネット接続してしまったりします。
つくづく、Ubuntuおそるべし。

私は、FreeBSDでもこれができたら、ビューティフルだなぁ、と思いました。
入院の予定はないですし、あまり入院したくないですけれど。 有備無患ともいいますからね。

 
条件
PC側:
Toshiba Dynabook R634/M
OSはNomadBSD(FreeBSD 13.0-RELEASE p-3)
Window Manager: Openbox
 
スマートフォン側
HTC U11 HTV33
OSはAndroid Ver. 9
キャリアはKDDI(au)
次に、結論を書きます。 NomadBSD(FreeBSD 13.0-RELEASE)でもandroidスマートフォンからUSBテザリングを受けてインターネットに接続することができます。 FreeBSDなラップトップPCを持って入院する日が来ないことを祈っていますが、万一Ubuntuが入院前日に起動しなくなっても、これで大丈夫です。
 
自宅でテストをして、つながった後の状態を書きます。
具体的なつなぎ方は、最後に。

まず、ifconfigの結果。 各ネットワークインターフェイスをざっと説明します。
em0というのは、Ethernetインターフェイスです。 いわゆる有線LAN。 LANケーブル経由です。
lo0: Loopbackインターフェイス。 自分自身のことです。
wlan0は、Wi-Fiインターフェイス。 いわゆる無線LAN。
ue0: USBインターフェイス。 USB(有線)テザリングした時のネットワークインターフェイス。
下の例では、em0はEthernetケーブルを抜いているのでno carrierです。
wlan0は自宅のWi-Fiルーター(正確には無線ハブ)の電源を落としているのでno carrier。
EthernetとWi-Fiが使えない状態でPCの電源を入れてFreeBSDが起動しているので、これでいいのです。
ue0は、いくつかの手順を踏んだらつながっていました。
ゲートウェイになっているのはandroidスマートフォン、HTCのU11 HTV33。

# 2021-08-08 FreeBSD 13.0-RELEASE
# After USB Tethering
# Wi-fi router turned off
# Ethernet unplugged
#
# Command
# 
# ifconfig
em0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=481249b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,NOMAP>
    ether b8:6b:23:44:62:7f
    inet6 fe80::ba6b:23ff:fe44:627f%em0 prefixlen 64 scopeid 0x1
    media: Ethernet autoselect
    status: no carrier
    nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
    options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
    inet6 ::1 prefixlen 128
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
    inet 127.0.0.1 netmask 0xff000000
    groups: lo
    nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
wlan0: flags=8c43<UP,BROADCAST,RUNNING,OACTIVE,SIMPLEX,MULTICAST> metric 0 mtu 1500
    ether 28:b2:bd:7e:b1:a2
    inet6 fe80::2ab2:bdff:fe7e:b1a2%wlan0 prefixlen 64 scopeid 0x3
    groups: wlan
    ssid "" channel 1 (2412 MHz 11g)
    regdomain JAPAN country JP authmode WPA1+WPA2/802.11i privacy MIXED
    deftxkey UNDEF txpower 23 bmiss 10 scanvalid 60 protmode CTS wme
    roaming MANUAL
    parent interface: iwm0
    media: IEEE 802.11 Wireless Ethernet autoselect (autoselect)
    status: no carrier
    nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
ue0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
    ether 46:22:c1:8d:9e:39
    inet 192.168.42.23 netmask 0xffffff00 broadcast 192.168.42.255
    nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

 

どうやらHTV33からプライベートIPアドレス 192.168.42.23 をもらってUSBテザリングが成立しているらしいです。
HTV33がUSBテザリングをすると、192.168.42.0/24というネットワークを構築し、今回は0.0.0.23というホストIPアドレスをFreeBSDなPCに貸し出したようです。 HTV33自身がゲートウェイになっており、そのIPアドレスは192.168.42.129なようです。 なぜ192.168.42.1でないのか、謎ですが、これはどうやら、ちょっと旧いandroidの仕様らしいです。

ルーティングが出来ているか、確認しましょう。
FreeBSDでは
netstat -rn
というコマンドを使います。

Linuxの場合はrouteというコマンドです。

netstat -rnの結果。

root@NomadBSD:~ # uname -a
FreeBSD NomadBSD 13.0-RELEASE-p3 FreeBSD 13.0-RELEASE-p3 #0: Tue Jun 29 19:46:20 UTC 2021     root@amd64-builder.daemonology.net:/usr/obj/usr/src/amd64.amd64/sys/GENERIC  amd64
root@NomadBSD:~ # date
2021年 8月 8日 日曜日 16時53分12秒 JST
root@NomadBSD:~ # netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags     Netif Expire
default            192.168.42.129     UGS         ue0
127.0.0.1          link#2             UH          lo0
192.168.42.0/24    link#4             U           ue0
192.168.42.23      link#4             UHS         lo0

Internet6:
Destination                       Gateway                       Flags     Netif Expire
::/96                             ::1                           UGRS        lo0
::1                               link#2                        UHS         lo0
::ffff:0.0.0.0/96                 ::1                           UGRS        lo0
fe80::/10                         ::1                           UGRS        lo0
fe80::%em0/64                     link#1                        U           em0
fe80::ba6b:23ff:fe44:627f%em0     link#1                        UHS         lo0
fe80::%lo0/64                     link#2                        U           lo0
fe80::1%lo0                       link#2                        UHS         lo0
fe80::%wlan0/64                   link#3                        U         wlan0
fe80::2ab2:bdff:fe7e:b1a2%wlan0   link#3                        UHS         lo0
ff02::/16                         ::1                           UGRS        lo0
root@NomadBSD:~ # 

 

default の行のgatewayのフィールドに192.168.42.129とあります。これがandroidスマートフォンのHTV33のIPアドレスです。
IPv4の最後の行の192.168.42.23の目的地がlo0(自分自身)になっているので、これがFreeBSDが動いているDynabookのIPアドレスです。

接続の確認をしましょう。pingのお時間ですよ。

# ping -c 10 www.freebsd.org

PING wfe0.nyi.freebsd.org (96.47.72.84): 56 data bytes
64 bytes from 96.47.72.84: icmp_seq=0 ttl=43 time=302.245 ms
64 bytes from 96.47.72.84: icmp_seq=1 ttl=43 time=256.288 ms
64 bytes from 96.47.72.84: icmp_seq=2 ttl=43 time=212.202 ms
64 bytes from 96.47.72.84: icmp_seq=3 ttl=43 time=273.708 ms
64 bytes from 96.47.72.84: icmp_seq=4 ttl=43 time=368.193 ms
64 bytes from 96.47.72.84: icmp_seq=5 ttl=43 time=297.567 ms
64 bytes from 96.47.72.84: icmp_seq=6 ttl=43 time=364.147 ms
64 bytes from 96.47.72.84: icmp_seq=7 ttl=43 time=323.865 ms
64 bytes from 96.47.72.84: icmp_seq=8 ttl=43 time=275.318 ms
64 bytes from 96.47.72.84: icmp_seq=9 ttl=43 time=229.335 ms

--- wfe0.nyi.freebsd.org ping statistics ---
10 packets transmitted, 10 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 212.202/290.287/368.193/49.311 ms
ちゃんとwww.freebsd.orgまでpingが届いて、返事が帰ってきていますね。
素晴らしい。
 
ここから手順を書きますよ。

[A] 事前準備

FreeBSDにusbmuxdをインストールする。

 

# pkg install usbmuxd

 

インストールしたら、一旦FreeBSDが入ったDynabook R634/Mの電源を落とす。

[B] 実際にUSBテザリングの動作確認

(01) 自宅のWi-Fiルーターの電源を切る
 
(02) Ethernet(有線LAN)のケーブルをFreeBSDが入ったラップトップPCから抜く。
 
(03) NomadBSD(FreeBSD 13.0-RELEASE)を起動する。
 
(04) スマートフォンとDynabookをUSBケーブルでつなぐ。
このUSBケーブルは、事前にスマートフォンとUbuntuでUSBテザリングが成立することを確認済みのケーブルです。
 
以下はDynabook (FreeBSD)でsuをしてrootアカウントになってから続ける。
 
(05) if_ipheth.koをロード。
# kldload if_ipheth.ko

 

(06) usbmuxdを実行。

# usbmuxd -vzU root

 

(07) dmesgでUSBテザリングのインターフェイスIDを確認。

# dmesg

 

たいていはUSBテザリングのインターフェイスは”ue0″ですけれど。
 
(08) スマートフォン(android)が「USBでデータを転送するか?」と尋ねてきます。
 
”Yes”をタップしてデータ転送を許可。
 
(09) スマートフォン側でUSBテザリングを開始。
 
私のキャリア契約(au)は、2021年7月からpovoプランです。 テザリングは無料に戻りました。
 
(10) FreeBSD側で、DHCPを何かする。
# dhclient ue0

 

(11) これで接続達成したはずなので、確認します。 pingの時間。

# ping -c 10 www.freebsd.org

 

(12) ifconfigでIPアドレスなどを確認。

# ifconfig

 

(13) netstat -rnでルーティングテーブルを確認。

# netstat -rn

 

(14) (必要なかったけど)上記(01)〜(10)でテザリング接続に失敗した場合は、たぶんFreeBSD側でルーティングを手動で設定するとなんとかなる。

# route add -net 192.168.42.0/24 192.168.42.129

 

最後の192.168.42.129がゲートウェイです。
あるいは、以下のようにゲートウェイだけ手動設定。

# route add default 192.168.42.129

 

ここのあたりは、このWebサイトが頼りになります。
https://www.cyberciti.biz/faq/freebsd-setup-default-routing-with-route-command/
 
 
これでうまくスマートフォンとFreeBSDなラップトップPCでUSBテザリングによるインターフェイス接続が実現しました。
もう、入院直前にUbuntu環境のラップトップPCが故障しても大丈夫です。 
入院時に病棟でFreeBSDでInternet接続。 カッコいいですね。
 
実際に接続したときのエビデンスとスピードテストのスクリーンショットをここで見せびらかします。
 
 
USBテザリングしたFreeBSDのパブリックIPアドレス確認
USBテザリングしたFreeBSDのインターネットスピードテスト

[C] 後日の実験結果情報

(イ) if_ipheth.koのロードを省略しても、USBテザリングは成功しました。
不要なようです。
どうも、このカーネルモジュールは私には関係がなかったみたい。 if_iphethとか言っていますが、ifはインターフェイス、iphはきっとiPhoneです。 ethはきっとEthernetです。
 
(ロ) usbmuxdコマンドを省略しても、USBテザリングは成功しました。
Webの記事を読んでインストールしたのですが、私のFreeBSD環境で必須ではなかったようです。
 
(ハ) dhclient ue0を省略したら、USBテザリングは失敗しました。
これはどうしても必要なようです。
大事なことは、他のインターフェイス(本物のEthernetやWi-Fi)経由での接続の可能性をあらかじめ排除しておくことです。
ルーティングやゲートウェイの設定が必要以上に複雑になります。
 
それではみなさんも、入院などなるべくしないで良きFreeBSDライフを。