Raspbian Strechでネットワークデバイスを正しく設定するための基本知識

Debian JessieとStretchの間で色々と大きな変更があったのですが、その中ネットワークインタフェースの扱いの違いが大きいです。ですが、きちんとしたドキュメントが無いためにかなり分かりにくいことになってます。Linuxのネットワーク管理について一から書くと大変な分量が必要なので、Jessie以前の設定に知識のある人向けに、Stretchでの変更点のみを書いてきます。

predictable interface names

predictable interface namesとは、eth0やwlan0, wlan1のようなOSが認識した順番で付いた名前で扱うのではなく、Mac addressをベースにしたデバイス名をインタフェースネームに用いるということです。例えば私の外付けwifiドングルの名前はwlan1ではなく、wlx0013ef6b19cbとなります。これがRaspbian Stretchの一番最初の公式リリースで有効になっていました。

ネットワーク技術者にはデバイス名が必ず一位に決定されるため好評でしたが、Jessieからの移行組には非常に評判が悪く、Raspberry Foundationは三ヶ月後のStretchリリース版からデフォルトで無効にしました。

どちらかを使うかはお好み次第ですが、有効/無効にするには、raspi-configの中の、2) Netowrk Options, N3 Network Interface Namesからpredictable interface namingの設定を変更できます。

または/boot/cmdline.txtの中の最後に

net.ifnames=0
1 (有効) 0 (無効)

を追加します。変更したらrebootが必要です。この設定を変更するとすべてのネットワーク関連のコンフィグファイル内にあるインタフェースネームを書き直すことになります。本当に必要かどうかよく考えてから変更してください。

/etc/network/interfaces – (Debian networking serviceの扱い)

Jessieでおなじみだった/etc/network/interfacesですが、Stretchでの最大の変更点はnetworking serviceがデフォルトでは事実上使用されないということです(OS起動時にexit statusになっている)。これはnetworkingサービスが動いていない状態ですから/etc/networkの下を変更しても意味はなく混乱するだけです。Stretchでは、dhcpを使うならネットワークインタフェースのip管理はすべてdhcpcdが行います

dhcpcdを使わずに完全に固定ipアドレスのみを使用する場合には、networkingサービスでinterfacesおよび/etc/network下での設定が有効になります。この場合、dhcpcdの干渉を避けるため、dhcpcdを起動しないようにして、networkingサービスだけを有効にしてください。具体的には

systemctl disable dhcpcd
systemctl enable networking

とします。Stretchではnetworkingとdhcpcdは排他サービスと捉えて同時に起動することは絶対に避けてください

Static IP アドレスはdhcpcd serviceで管理する!

「dhcpcdってDHCP clientデーモンさん、、、どうしてdhcpcdがstatic IPの管理までするの?」

ごもっとも。とてもまともな疑問ですが、偉い人たちが考えてStretchではそうすることにした、としか答えられません。各インタフェースにdhcpアドレスを与えるだけの場合は何も記述する必要はありませんが、static IPを与える場合には/etc/dhcpcd.confで次のように設定します。

interface wlan1
  static ip_address=172.24.1.1/24
  static routers=172.24.1.1
  static domain_name_servers=172.24.1.1 8.8.4.4 8.8.8.8

以上の例では内蔵wifiはwlan0、wlan1はUSB wifiドングルと暗黙的に仮定しています。そして、そのwlan1にstatic IPを与える、という設定です。dhcpcdは記述されていないインタフェースに対しては適切なdhcpアドレスを与えます。思ったように特定のデバイスが特定のインタフェース名に割り振られない場合、前述のpredictable netowrking namesを有効すればそこに割り振られます。

Stretchのdhcpcdは結構バギーで、アドレスがうまく割り振られてたりしなかったりします。これは多くの人が経験していろいろな情報が飛び交って特定のコマンドを入れたら動いた、動かないの報告があります。私の経験では下手なコマンドを追加するよりも、dhcpcdを使うならまずはnetworkingサービスが動いていないことを確認してください。

/etc/wpa_supplicant/wpa_supplicant.conf

wpa_supplicantはwifiアクセス用のサイト情報を書くファイルでした。これも今でも動きます、、、動きますが多少推奨動作が変更になってます。まず重要なこと。wpa_supplicantはdhcpcdから呼び出されます。そして、wpa_supplicant.conf自体は触ってはいけない、です。なぜならwpa_supplicant.conf自体はすべてのwifiネットワークデバイスに適応されるからです。従ってこれも放置してください。次がデフォルト(米国の場合)です。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US

ではwifiアクセスの方法はどうやって記述するかになりますが、特定のネットワークインタフェースごとに記述することになります。具体的には、

/etc/wpa_supplicant/wpa_supplicant-InterfaceName.conf

が自動的にInterfaceNameに対して実行されます。例えばwlan0を用いてwifi APにアクセするなら、wpa_supplicant-wlan0.confというファイルを作って、その中にwifi接続用の情報を書き込むことになります。例えば次のようになります。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US
network={
  ssid=”ねこの家”
  psk=”ねこの家パスワード”
  key_mgmt=WPA-PSK
}

もし、<InterfaceName>に相当する(例えばwlan1)にwpa_supplicant-InterfaceName.confが存在しない場合には(wlan1に対してwpa_supplicant-wlan1.confが無い場合)、デフォルトでwpa_supplicant.confがそのネットワークインタフェースに対して適用されます。Jessieからのwpa_supplicant.confをコピーして動作するのはこれが理由ですが、かならずしも想定どおりに動いているわけではありません。

ネットワーク・インタフェースのリスタート方法

Jessieまでは、個別のネットワーク・インタフェースが反応しなくなっときに停止・再起動することによってリセットする方法がいくつかありました。以下、<dev>はデバイス名として、

  1. ifup <dev>, ifdown <dev>コマンド
  2. ifconfig <dev> up, ifconfig <dev> down
  3. ip link set <dev> up, ip link <dev> down

この中で1がStretchのデフォルト設定では動作しなくなりました。理由はifup / ifdownは/etc/network/interfacesで定義されている名前を元にデバイスの操作を行おうとします。しかし、前述したとおり、Stretchでは/etc/network/interfacesは通常何も書かれていません。そのため、このコマンドを用いてもデバイス名が見つからないと実行されません。

2と3に関してはカーネル内部のデバイス名を直接参考するので問題なく動作します。どちらがいいかは慣れの問題もありますが、できれば3のipコマンドに慣れましょう。ifconfigは実装が古く、Linux自体でipコマンドの使用がおすすめになっているからです。

ipコマンドに不慣れな人には、便利なチートシートがありますので、参考にしてください。

ネットワーク・インタフェースのイベントフック方法

ネットワーク・インタフェースが起動/終了された時にコマンドを実行させることができます。以前は/etc/network/interfacesにhookされた時に実行するコマンドを書き込めたり、/etc/networkの下のif-up.d / if-down.dなどにスクリプトファイルを置いて実行させていました。

しかし、networkingサービスを使用しないですから、どこでhookさせるかと言えばdhcpcdの設定にファイルになります。もしくはwpa_supplicantもdhcpcdからhookされているので、そちらからでも可能でしょう。でも、この2つにスクリプトを追加する方法はあまりみかけません。随分と長くなってしまったので、これらはおいおい解説していきます。

ラズベリーパイ3のwifi中継器をリスタート後も有効にする方法

別稿でラズベリーパイをwifi中継器にする方法を書きましたが、私の所では最初、リスタート後にAPからの信号が出ないという問題が何度か起こりました。コンソールを開いて調べて見た所、必要なサービスが勝手にexitしていました。そこで止まっていたサービスを再起動したらAPは動きはじめました。どうも起動時のレースコンディションが問題のようです。今回はこれをやっつけましょう。
続きを読む »

ラズベリーパイをwifi AP(アクセスポイント)/wifi中継器にしよう

wifi AP(アクセスポイント)とは、インターネットへのwifiアクセスを提供するものです。wifi APの中でも特にwifi APの上流がさらにwifiの場合は、wifi中継器とかwifiリピータと呼ばれます。wifi中継器は、上流のwifiと同じSSID/Passwordを提供してシームレスにネットワークを拡張するものをさす場合も多いですが(ブリッジ接続とも言います)、別のAPを提供することもあります。

今日、ここで紹介するのは後者になります。そちらの方が自由度が高くwifi範囲の拡張にとどまらず、APに専用の機能を割振るといったことが可能になるからです。続きを読む »

ラズベリーパイのファームウェアとカーネルの違いとバージョンアップ方法

ラズベリーパイのファームウェアとカーネルの違いについて簡単に説明します。カーネルは一般的なLinuxカーネルのことを差し、こちらはARM系CPUとメモリを管理します。これに対してラズベリーパイで言うはファームウェア(firmware)とは、GPUのハードウェアコードのことを言います。この二つはどちらも起動時にファイルからロードされます。
続きを読む »

ラズベリーパイ・サーバで特定IPアドレスをブロックする(iptablesの操作例)

私の昔のルームメートの話ですが、彼女は、アメリカ人にありがちな図々しい人の上に中途半端にコンピュータのことを知っていたので、Air Printで写真印刷を勝手に大量にしたり、iTunesのライブラリとかファイルサーバが見えるとパスワード教えて!とうるさいので辟易してました。その時以来、例えおうちClass Cネットワークでもサーバ隠しをしてます。それで今日はサーバ側で特定アドレスをブロックする方法を説明します。

続きを読む »

ラズベリーパイのIPv6を無効にする方法

Raspbian JessieのIPv6の扱いが一定でないため、オフにする方法に混乱が生じているようです。以前のバージョンではIP v6はデフォルトでオフだったため、明示的にカーネルモジュールをロードする必要があったらしいのですが、最新バージョンではIP v6がデフォルトになっています。そのためネットを検索すると幾つか方法が見つかるのですが、問題のある方法もあるようです。
続きを読む »

PuTTY X11 proxy: Authorisation not recognisedの対処法(Windows)

Xウィンドウのアプリケーションも便利に動くようになって、慣れてきたときに次のエラーメッセージが出てソフトを起動でないことがありませんか。今回はこの問題を解決する方法を考えてみましょう。

pi@RPi-Dev:~$ sudo gparted
PuTTY X11 proxy: Authorisation not recognised
(gpartedbin:2613): Gtk-WARNING **: cannot open display: localhost:10.0

続きを読む »

minibianとminibian wifi

minibian(ミニビアン)とは?

ラズベリーパイの公式OSには2016年09月現在、Raspbian (Jessie)およびRaspbian (Jessie) Liteの二種類がある。Raspbianは、デスクトップ版のOSであり、ブラウザ、開発環境、サーバ類などのすべてのツールが既に導入されている。Raspbian Liteはそれを軽量化し、ヘッドレス運用に特化したものである。これに対してユーザの間からは最低限のOSが求められて、minibianが作られた。

続きを読む »

パソコンでX11サーバを動かして、ラズベリーパイのGUIソフトを使おう!

私はラズベリーパイをヘッドレスで動かしていて、今後モニターとキーボードを繋ぐ予定はまったくありません。とは言ってもプログラミングを始めるとエディタ、IDE、terminalソフトぐらいはGUIで動かしたくなります。そこで今回はパソコン側でXサーバを動かして、ラズベリーパイのソフトをXクライアントとしてパソコン上で表示させてみましょう。
続きを読む »