前提
未だに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 add
のfrom
はSource=
, src
はPreferred Source=
が対応するようだ。
[Route]での対応
* dest
: Destination=
* via
: Gateway=
* dev
: networkファイルに対応するインターフェース自身
* from
: Source=
* src
: PreferredSource=
ip rule
は[RoutingPolicyRule]
が対応する。
ここではip rule add src
がFrom=
に対応。統一してよ……
[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が優先されることを確認