はじめに
FreeBSDでWiFiを使おうとして3時間ハマった。
Linuxだとnmcliで一発なのに、FreeBSDだとそうはいかない。
ハマりポイントと解決策を共有する。
FreeBSDのWiFiアーキテクチャ
┌─────────────────────────────────────────────────────────────┐
│ WiFi Stack │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ wlan0 (仮想インターフェース) │ │
│ │ net80211 フレームワーク │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ath0/iwn0/rtwn0/... (物理デバイス) │ │
│ │ ハードウェアドライバ │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ファームウェア(必要な場合) │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
重要: 物理デバイス(ath0等)から仮想インターフェース(wlan0)を作る必要がある。
ハマりポイント1: ドライバが認識されない
症状
ifconfig
# em0: ...
# lo0: ...
# (WiFiデバイスがない!)
原因と対策
デバイスの確認
pciconf -lv | grep -A3 -i wireless
# none0@pci0:3:0:0: class=0x028000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x24f3
# vendor = 'Intel Corporation'
# device = 'Wireless 8260'
dmesg | grep -i wifi
dmesg | grep -i wireless
対応ドライバの確認
| チップベンダー | ドライバ | ファームウェア |
|---|---|---|
| Intel (古い) | iwn | iwn-firmware |
| Intel (新しい) | iwlwifi | (LinuxKPIベース) |
| Atheros | ath | 不要 |
| Realtek | rtwn | rtwn-rtl*-firmware |
| Ralink | rum, run | 不要 |
| Broadcom | bwn | bwi-firmware-kmod |
ドライバのロード
# Intel (iwn)
kldload if_iwn
# Realtek
kldload if_rtwn
kldload if_rtwn_usb
# Atheros
kldload if_ath
ファームウェアのインストール
# Intel iwn
pkg install iwn-firmware
# Realtek
pkg install rtwn-rtl8188eufw
pkg install rtwn-rtl8192cfwU
# Broadcom
pkg install bwi-firmware-kmod
永続化
# /boot/loader.conf
if_iwn_load="YES"
iwn8265fw_load="YES"
ハマりポイント2: wlanインターフェースを作ってない
症状
ifconfig iwn0
# iwn0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> ...
# (IPアドレスがない、UPしてない)
ifconfig iwn0 up
# ifconfig: SIOCSIFFLAGS: Invalid argument
原因
FreeBSDでは物理デバイスからwlanインターフェースを作成する必要がある。
対策
# wlan0を作成
ifconfig wlan0 create wlandev iwn0
# 確認
ifconfig wlan0
# wlan0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
# ether 00:11:22:33:44:55
# groups: wlan
# ssid "" channel 1 (2412 MHz 11b)
永続化
# /etc/rc.conf
wlans_iwn0="wlan0"
ハマりポイント3: SSIDが見つからない
症状
ifconfig wlan0 up scan
# (何も表示されない)
対策
カントリーコードの設定
# 日本の場合
ifconfig wlan0 country JP
# 確認
ifconfig wlan0
# ...
# country JP regdomain ETSI
5GHz帯の有効化
# 11a (5GHz)を有効化
ifconfig wlan0 mode 11a
# または自動選択
ifconfig wlan0 mode 11na # 11n 5GHz
ifconfig wlan0 mode 11ac # 11ac
スキャン再実行
ifconfig wlan0 up scan
# SSID/MESH ID BSSID CHAN RATE S:N INT CAPS
# MyWiFi 00:11:22:33:44:55 6 54M -65:-95 100 EPS RSN
# Neighbor_WiFi aa:bb:cc:dd:ee:ff 11 54M -75:-95 100 EPS RSN
ハマりポイント4: WPA認証が通らない
症状
ifconfig wlan0 ssid MyWiFi
wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf
# wlan0: WPA: 4-Way Handshake failed - pre-shared key may be incorrect
対策
wpa_supplicant.confの正しい書き方
# /etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
eapol_version=2
ap_scan=1
fast_reauth=1
network={
ssid="MyWiFi"
psk="MyPassword"
key_mgmt=WPA-PSK
proto=RSN WPA
pairwise=CCMP TKIP
group=CCMP TKIP
}
パスワードを平文で書きたくない場合
wpa_passphrase "MyWiFi" "MyPassword"
# network={
# ssid="MyWiFi"
# #psk="MyPassword"
# psk=a1b2c3d4e5f6...(ハッシュ値)
# }
WPA3 (SAE)の場合
network={
ssid="MyWiFi"
key_mgmt=SAE
psk="MyPassword"
ieee80211w=2
}
ハマりポイント5: DHCPでIPが取れない
症状
dhclient wlan0
# DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 3
# DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 6
# (タイムアウト)
対策
接続状態の確認
ifconfig wlan0 | grep status
# status: associated
associatedになっていなければWPA認証に問題あり。
wpa_supplicantをデバッグモードで
wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf -d
# ...
# wlan0: State: COMPLETED -> DISCONNECTED
# wlan0: CTRL-EVENT-DISCONNECTED bssid=...
手動でIPを設定してみる
ifconfig wlan0 inet 192.168.1.100 netmask 255.255.255.0
route add default 192.168.1.1
ping 192.168.1.1
pingが通ればDHCPサーバーの問題。
完全な設定手順
1. ドライバとファームウェア
# /boot/loader.conf
if_iwn_load="YES"
iwn8265fw_load="YES"
2. rc.conf
# /etc/rc.conf
wlans_iwn0="wlan0"
ifconfig_wlan0="WPA DHCP country JP"
3. wpa_supplicant.conf
# /etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
eapol_version=2
ap_scan=1
fast_reauth=1
network={
ssid="MyWiFi"
psk="MyPassword"
}
4. 再起動または手動適用
# 再起動
reboot
# または手動で
service netif restart
トラブルシューティングコマンド集
# デバイス確認
pciconf -lv | grep -i wireless
usbconfig list | grep -i wireless
# ドライバ確認
kldstat | grep if_
# インターフェース確認
ifconfig -a
# wlanの詳細
ifconfig wlan0
# スキャン
ifconfig wlan0 list scan
# 接続状態
wpa_cli -i wlan0 status
# ログ確認
dmesg | tail -50
tail -f /var/log/messages
# wpa_supplicantのデバッグ
wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf -dd
便利なツール
# wpa_cliでインタラクティブに操作
wpa_cli -i wlan0
> scan
> scan_results
> add_network
> set_network 0 ssid "MyWiFi"
> set_network 0 psk "MyPassword"
> enable_network 0
> save_config
NetworkManager的なものは?
FreeBSDには公式のNetworkManager的なものはないけど、いくつかの選択肢:
# wifimgr (GUIツール)
pkg install wifimgr
# networkmgr (TrueOS由来)
pkg install networkmgr
まとめ
FreeBSDのWiFi設定でハマるポイント:
- ドライバとファームウェアを確認
- wlanインターフェースを作成(これ忘れがち)
- countryを設定(5GHzが見えない原因)
- wpa_supplicant.confを正しく書く
- status: associatedを確認してからDHCP
一度設定すれば安定するけど、最初の設定がLinuxより面倒なのは事実。
この記事が役に立ったら、いいね・ストックしてもらえると嬉しいです!