ip link add dev mgmt0 type vrf table 10
ip link set dev mgmt0 up
ip link set dev eth3 master mgmt0
ip link set dev eth3 up
ip route add default via 192.168.1.1 table 10
ip route add ::/0 via 2001:470:fe36:1::1 table 10
ip link add dev lb0 type vrf table 4
ip link set dev lb0 up
ip link set dev eth4 master lb0
ip link set dev eth4 up
ip route add default via 192.168.202.1 table 4
route delete default
route delete default
route delete default
route add default gw 192.168.22.1
route delete -host 192.168.1.1
route delete -host 192.168.202.1
ip route del ::/0 via 2001:470:fe36:1::1
ip route del ::/0 via 2001:470:fe36:face::1
ip route del 2001:470:fe36:1::1/64
route -6 add default gw 2001:470:fe36:face::1
sysctl -w net.ipv4.tcp_l3mdev_accept=1
sysctl -w net.ipv4.udp_l3mdev_accept=1
$ ip route show
default via 192.168.22.1 dev eth0
192.168.22.0/24 dev eth0 proto kernel scope link src 192.168.22.218 metric 100
192.168.52.0/24 dev eth1 proto kernel scope link src 192.168.52.218 metric 101
192.168.111.0/24 dev eth2 proto kernel scope link src 192.168.111.218 metric 102
$ ip route show table 10
default via 192.168.1.1 dev eth3
broadcast 192.168.1.0 dev eth3 proto kernel scope link src 192.168.1.218
local 192.168.1.218 dev eth3 proto kernel scope host src 192.168.1.218
broadcast 192.168.1.255 dev eth3 proto kernel scope link src 192.168.1.218
$ ip route show table 4
default via 192.168.202.1 dev eth4
broadcast 192.168.202.0 dev eth4 proto kernel scope link src 192.168.202.218
local 192.168.202.218 dev eth4 proto kernel scope host src 192.168.202.218
broadcast 192.168.202.255 dev eth4 proto kernel scope link src 192.168.202.218
$ ip -6 route show
::1 dev lo proto kernel metric 256 pref medium
2001:470:fe36:111::/64 dev eth2 proto kernel metric 102 pref medium
2001:470:fe36:cafe::/64 dev eth1 proto kernel metric 101 pref medium
2001:470:fe36:face::/64 dev eth0 proto kernel metric 100 pref medium
fe80::/64 dev eth0 proto kernel metric 1024 pref medium
fe80::/64 dev eth1 proto kernel metric 1024 pref medium
fe80::/64 dev eth2 proto kernel metric 1024 pref medium
fe80::/64 dev eth3 proto kernel metric 1024 pref medium
default via 2001:470:fe36:face::1 dev eth0 metric 1 pref medium
$ ip -6 route show table 10
anycast 2001:470:fe36:1:: dev eth3 proto kernel metric 0 pref medium
local 2001:470:fe36:1::218:1 dev eth3 proto kernel metric 0 pref medium
anycast fe80:: dev eth3 proto kernel metric 0 pref medium
local fe80::8785:99b6:f03b:cf5e dev eth3 proto kernel metric 0 pref medium
multicast ff00::/8 dev eth3 proto kernel metric 256 pref medium
default via 2001:470:fe36:1::1 dev eth3 metric 1024 pref medium
$ ip -d link show type vrf
7: mgmt0: mtu 65575 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 56:64:d2:f2:ee:55 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 1280 maxmtu 65575
vrf table 10 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
8: lb0: mtu 65575 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 2e:68:9e:22:5f:0e brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 1280 maxmtu 65575
vrf table 4 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
VRF しているインターフェースのルーティング情報が乗っていると削除して、正しいルーティング情報に直すので roure del したり route add しています。上記になっているのが、僕は一番美しいルーティングテーブルだと思っているのであります。
この辺り、nmcli だとちゃんとやってくれるのかなぁ?
$ traceroute -n 192.168.1.217
traceroute to 192.168.1.217 (192.168.1.217), 30 hops max, 60 byte packets
1 192.168.22.1 0.416 ms 0.460 ms 0.456 ms
2 192.168.1.217 0.659 ms 0.654 ms *
$ ip vrf exec mgmt0 traceroute -n 192.168.1.217
traceroute to 192.168.1.217 (192.168.1.217), 30 hops max, 60 byte packets
1 192.168.1.1 0.405 ms 0.323 ms 0.324 ms
2 192.168.1.217 0.665 ms 0.668 ms 0.687 ms
$ ip vrf exec mgmt0 ssh 192.168.1.217
>
# ip link set dev br0 up
# ip link set dev eth0 promisc on
# ip link set dev eth0 up
# ip link set dev eth0 master br0
# ifconfig eth0 0.0.0.0 up
# ifconfig eth0 inet6 del 2001:470:fe36:face::218:1/64 up
# route add default gw 192.168.22.1 dev br0
# ip route del ::/0 via 2001:470:fe36:face::1
# route -6 add default gw 2001:470:fe36:face::1 dev br0
上から順に説明すると、
docker network create で生成した br0 を UP します
eth0 のプロミスキャス・モードを有効化します
eth0 を UP します
eth0 と br0 をブリッジ化します
br0 に IPv4/IPv6 アドレスが付加されるので eth0 側から削除します
最後にルーティング情報を設定します
こんな感じでしょうか。
ロードバランサセグメント用の設定も書いておきます。
# docker network create LB-Segment \
-o "com.docker.network.bridge.name"="br4" \
--driver=bridge \
--subnet 192.168.202.0/24 \
--gateway 192.168.202.218
# ip link set dev br4 up
# ip link set dev eth4 promisc on
# ip link set dev eth4 up
# ip link set dev eth4 master br4
# ifconfig eth4 0.0.0.0 up
# ip link set dev lb0 up
# ip link set dev br4 master lb0
# ip link set dev br4 up
# ip route add default via 192.168.202.1 table 4
# ip link set eth0 promisc off
# ip link set eth0 down
# ip link set dev eth0 nomaster
# ip link delete br0 type bridge
# docker network rm Service-Segment
# ifconfig eth0 192.168.22.218/24
# ifconfig eth0 inet6 add 2001:470:fe36:face::218:1/64
# route add default gw 192.168.22.1 dev eth0
# ip route del ::/0 via 2001:470:fe36:face::1
# route -6 add default gw 2001:470:fe36:face::1 dev eth0
# ping -q -c 3 192.168.22.1 > /dev/null 2>&1
3. IPv4/IPv6 デアルスタク対応コンテナの起動
最後に Docker コンテナの使い方について書いておきます。何回も書いている通り bridge-utils を捨てて ip link set dev コマンドに移行したので Docker コンテナは IPv4/IPv6 のデアルスタクで動作させられます。