dhcpcdを使っている時にmtu値を変更する方法

terminal
Raspberry piのOS Raspbianでネットワーク・インターフェースのmtu値を変更したいと思いました。ipコマンドを打ってすぐに変える事はできますが起動時に自動で設定するにはどうしたら良いのでしょうか?

Raspberry Piを外に持ち出しスマートフォンのテザリングや3G/4Gモデムで通信をして使うことができます。
関連記事:RASPBIAN STRETCHでUSB 3G/4Gモデムを使い屋外でもネットワーク接続をする
外にいると時々家のLANへVPNで接続したくなります。こんな時、ネットワーク・インターフェースのmtuサイズを調整したくなりました。mtuサイズを最適化しないと無駄にパケットが増えてしまいギガがもったいないですし通信速度も下がります。
前述の関連記事の頃は/etc/network/interfacesでいろいろ設定できたのですが、最新のRaspbianは/etc/network/interfacesを使わなくなりました。
関連記事:Raspbian stretchでは/etc/network/interfacesファイルを使わない方が良いようだ
代わりにdhcpcdがネットワーク関連の設定を行っています。その流儀に合わせるべく、dhcpcdの使い方を調べています。

dhcpcdは機能豊富そうなのですがネットでの情報があまりありません。基本的にdhcpサーバーと連携してネットワークインターフェースの設定を行う思想のようで勝手に細かいネットワーク設定をやるものではないようです。DHCPサーバーが親切で賢ければ何も考えなくとも最適な設定になるようです。賢ければ・・・。
多くのDHCPサーバーはipアドレスを管理するだけでmtuサイズまで面倒を見てくれません。

ならば手動でmtuサイズを変更してしまえば良いのですがどうもイレギュラーな方法な気がします。Linux系にありがちな痒いところに手が届かない感。いや、本当はどこへでも届いてしまうのですが、届かしてよいのか?感。
高レベルなツールで設定している環境は低レベルなコマンドで変更しない方が良いという基本的原則をすぐに破ってしまいそうです。検索すると基本原則を破る方法がたくさん出てくるのにも困ります。

という事でdhcpcdでの作法を1週間ほど調べていました。
ですが情報が少ない・・・

最初は/etc/dhcpcd.confファイルでmtu値の設定ができるだろうと思っていたのですが、いろいろ試しても何も変わりませんでした。dhcpcdがそもそもどうやってインターフェースをいじっているのか?と更に深掘りする事に・・・いや、ソース読むなんて面倒なんでやりませんけど。
今の所の結論として、dhcpcdはmtu値には一切触れていない。Linuxのデフォルト値である1500に設定されているだけのようです。
じゃあdhcpcdでmtu値を全くいじれないのかというとそんな事は無く、関与や考慮はされている様です。
dhcpcdではdhcpサーバーから与えられるmtu値を管理できます。ですがmtu値を渡すdhcpサーバーは少なく、dhcpcd側でmtu値の設定をする事もありません。

ということでipコマンドでmtu値を設定します。ではそのipコマンドを何処に置くべきか?起動時に自動実行させる方法はいろいろあります。好きな場所で自動実行するようにできますがメンテナンス性が悪く1週間後の自分はどこに置いたか忘れているでしょう。汎用的な方法とは言えません。

dhcpcdではhookにより外部スクリプトを実行できます。例えばRaspbianでは/lib/dhcpcd/dhcpcd-hooksにスクリプトが置かれています。無線LANの設定はここからwpa_cliが呼び出されているようです。
また、外部スクリプトではdhcpcd特有の環境変数を使うことができます。mtu値はifmtuという名前の変数に保存されています。

dhcpcdでmtu値を設定する

mtu値は/etc/dhcpcd.confに記述します。環境変数ifmtuを上書き設定します。
/etc/dhcpcd.confの最後に次の文を追加します。
interface wlan0
env ifmtu=1500
interface eth0
env ifmtu=1454
wlan0やeth0はインターフェース名です。ご自分のインターフェース名に書き換えてください。インターフェース毎にmtu値を設定できます。
これでmtu値が環境変数に設定されました。次はこの値をインターフェースに反映させます。

ディレクトリ/lib/dhcpcd/dhcpcd-hooks/に90-set_mtuというテキストファイルを作ります。中身には次のスクリプトを書いておきます。
case "$reason" in
  PREINIT)        /sbin/ip link set dev $interface mtu $ifmtu;;
  RECONFIGURE)    /sbin/ip link set dev $interface mtu $ifmtu;;
esac
これでインターフェース毎にmtu値を設定する事ができるでしょう。
hookスクリプトは何度も呼び出されます。呼び出された理由は環境変数reasonに書かれています。無駄にipコマンドを実行しないよう条件文を付けています。

まとめ

dhcpcd環境下で正攻法っぽいmtu値の設定方法を紹介しました。より正しい方法があったらぜひ教えてください。

記事公開時最新の
Raspbian Stretch with desktop Version:April 2019
Linux raspberrypi 4.14.98+ #1200 Tue Feb 12 20:11:02 GMT 2019 armv6l GNU/Linux
で設定できています。

Linuxは同じ設定をするにもいろいろな実現方法があります。OSやそのバージョンが変わると最適な方法も変わってしまいます。検索するとやりたい事を実現する方法がすぐに見つかるでしょう。ですが本当にそれが良い方法なのか?考えながら設定する必要があります。WindowsにはMicrosoftという管理者がいますがLinuxには存在しません。時間が経つほど複雑怪奇なものになります。

今後ubuntuに倣ってnetplanを使うようになりそうな気がします。

コメント

最近のコメント

Threaded Recent Comments will be here.