systemd-networkdで場所によって固定IPアドレス、動的と振り分ける
家や会社では固定IPアドレス、それ以外は動的にIPアドレスを決めたいという事がある
と思います。
それ以外の場所ではネットワークアドレスがわからないし、DNSもGatewayもわからない。
IPアドレスがかぶるかもなので、DHCPにすべて任せたいということです。
設定
下記のように/etc/systemd/network/配下に.networkという拡張子でファイルを
置くと設定に応じたネットワークで固定IPアドレス、動的IPアドレスが
割当られます。
この設定ファイルは数字、アルファベットの名前順に優先されるため、
10-home.network
20-parenthome.network
99-unknown.network
のように優先したい設定ファイルに若い番号を接頭辞としてつけることが推奨されています。
これを設定したい数だけ配置してください。
家や会社
ネットワークに接続するときのSSIDから固定IPアドレスを設定するように
ファイルを書けば良い。
[Match]
# 使うnicの名前。white-spaceで区切って複数指定する事もできる。
Name=wlp3s0
# 複数のSSIDを指定するときは下記のようにwhile-spaceで区切る。
SSID=Buffalo-A-XXXX Buffalo-G-XXXX
[Network]
Address=192.168.11.19/24
# ipv6用
Address=XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/64
Gateway=192.168.11.1
# ipv6用
Gateway=XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
DNS=192.168.11.1
# ipv6用
DNS=XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
ipv6は直接グルーバルIPアドレスに当たっているので、XXXXと伏せて書いています。
NetworkのAddress, Gateway, DNSなどはwhite-space区切りでかけないため、
1行に一つの設定を書く。
それ以外の場所
カフェなど知らないネットワークでは動的にIPアドレスを決める。
SSIDを指定しない場合は、他の設定にないすべての場所になる。
[Match]
Name=wlp3s0
[Network]
DHCP=yes
トラブルシューティング
systemd-networkdで固定IPアドレスで接続できないが、DHCPに完全に任すと接続できる場合
networkctlで見ると設定に失敗していると表示され、
systemd-networkdのログをとると下のようになる。
ログを見ると確かに設定ファイルを参照できているが、
Cinfiguring with /etc/systemd/network/10-myhome.network
Failed to configure DHCPv4 client: No such file or directory
や
Failed to configure DHCPv4 client: No such file or directory
となり、ipアドレスが正しく設定できず、外部ネットワークにつなぐことができない。
この場合はおそらく、gentooやarchなど自分で大部分を設定するディストリでmachine-idを設定し忘れたのだと思います。
下のようにmachine-idを設定すると接続できるようになります。
systemd-machine-id-setup
reference
他のOSで説明あるとこ無いんで、Archwiki見ることになります。
ただ、systemdなので設定一緒ですが。
まとめ
その後のwpa_supplicantの設定はここを参考にしてください。
windowsも同じ要領でSSIDから固定IPアドレス、動的IPアドレスと切り替える
事ができます。windowsの場合はGUIから出ないと無理か、かなり複雑ですが。
詳しくはBuffaloのサイトを見てください。これをSSIDごとに自動、手動で設定していくことになります。
Discussion
カンマ区切りは使えません。Name=, SSID=, DNS= はスペース区切りで複数指定が出来ます。以下のように複数行に書いても大丈夫です。
Address=, Gatway=は1行につき1つのアドレスしか対応してません。
あと、alphanumeric orderで.networkファイルが適用されるので、.networkファイルに優先順位に基づいた数字のprefixを付けておくことが推奨されています。数字の小さいものが優勢順位が高くなります。例えば、
のような感じに。上記記事では、たまたまmyhome.networkがunknown.networkより辞書順で先に来ていたため上手く機能していましたが、もし、unknown.network -> default.networkのようにrenameするとmyhome.networkは使われなくなってしまいます。
ご指摘ありがとうございます。
確認して直しました。