IPv6
iproute2
systemd-networkd
multi-home

systemd-networkdでIPv6トンネルとネイティブIPv6を同時接続する


前提

未だにIPv6が/128しか振られなかったり不安定なルータに悩まされているため、he.netのIPv6 tunnel brokerを利用しつつ、ネイティブなIPv6も念の為維持したい。いわゆるマルチホームを行う。


  • systemd-networkdで設定をまとめたい。

  • 基本的なIPv4/IPv6は特に問題なく設定できている

  • Ubuntu 18.04で実施。netplanでは実現できそうにないので使わない。

  • 外向き接続時にtunnelをネイティブ割当より優先するが、両方でlistenできること。

  • 通常のインターフェースens3を通るsitトンネルをheとして作成。


ルーティング設定

Linux iproute2のPolicy Routingで複数のtableを使って実現できる。これはlinux multi homeあたりで検索すればいろいろ出てくる。

以下挙動の理解が怪しいが、外向きの接続の場合、



  • ip route show table mainを参照してリモートアドレスに対応するインターフェースが判定される


    • デフォルトルートのmetricを自動生成される1024より小さくしてdev heを優先させる



  • 決定したルートdev heにしたがってsrc節かip addrでインターフェースに設定されているアドレスが送信元として使用される

  • 生成されたパケットはip ruleの送信元IPアドレス範囲のフィルタでどのテーブルを使うか振り分ける

  • ネイティブならtable 10を参照させる



    • table 10にデフォルトルートと送信元IPアドレスを指定

    • ついでにon-linkなネットワークも指定



  • トンネルならtable 20を参照させる


    • これはmainテーブルと同じことをしているので本来は必要ない。優先度を簡単に切り替え(tunnel > native)したい時のために書いてある




systemd.network周り

systemd-networkdでは、.networkファイルの[Route]節が設定されたルーティングテーブル1エントリに対応する。

ややこしいことに[Route]ではip route addfromSource=, srcPreferred Source=が対応するようだ。

[Route]での対応

* dest: Destination=

* via: Gateway=

* dev: networkファイルに対応するインターフェース自身

* from: Source=

* src: PreferredSource=

ip rule[RoutingPolicyRule]が対応する。

ここではip rule add srcFrom=に対応。統一してよ……

[RoutingPolicyRule]での対応

* from: From=

* to: To=


設定例

# cat /etc/systemd/network/10-ens3.network

[Match]
Name=ens3

[Network]
Address=ipv4_addr/24
Gateway=ipv4_gw
Address=ipv6_addr/64
Gateway=ipv6_gw
Tunnel=he

[RoutingPolicyRule]
# source route
Table=10
From=ipv6_net/64
Priority=100

[Route]
# default route
Table=10
Gateway=ipv6_gw

[Route]
# link-local
Table=10
Destination=ipv6_net/64
Metric=256

# cat /etc/systemd/network/50-he.netdev

[NetDev]
Name=he
Kind=sit
MTUBytes=1480

[Tunnel]
Remote=tunnel_server
TTL=64

# cat /etc/systemd/network/50-he.network

[Match]
Name=he

[Network]
Address=tunnel_addr/64

[Route]
Gateway=tunnel_gw

# prefer he tunnel over native
Metric=512
# prefer native over he
# Metric=1536

[RoutingPolicyRule]
From=tunnel_net/64
Table=20
Priority=200
[Route]
Gateway=tunnel_gw
Table=20


動作確認


  • 外部からens3とheの両方にpingが通ること

  • 内部から外向きIPv6接続でheが優先されることを確認