前提
未だに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が優先されることを確認