docker: frrouting/frr vrrp
dockerでfrrを使ってvrrpを組んでみようと思った時のメモ
frrでvrrpを構築する際にはfrrに設定する前にインタフェースを用意する必要がある。これはfrrのユーザガイドサイト(http://docs.frrouting.org/en/latest/)にも掲載される通り、次のようなコマンドで設定できる。
# ip link add vrrp_ipv4 link eth0 addrgenmode random type macvlan mode bridge
# ip link set dev vrrp_ipv4 address 00:00:5e:00:01:05
# ip addr add 192.168.100.10 dev vrrp_ipv4
# ip link set dev vrrp_ipv4 up
#
# ip link add vrrp_ipv6 link eth0 addrgenmode random type macvlan mode bridge
# ip link set dev vrrp_ipv6 address 00:00:5e:00:02:05
# ip addr add fd00:abcd:abcd:abcd::10/64 dev vrrp_ipv6
# ip link set dev vrrp_ipv6 up
dockerでコマンドを実行した際、ipv6向けのコマンドでエラーが発生した。
# ip link set dev vrrp_ipv6 address 00:00:5e:00:02:05
RTNETLINK answers: Permission denied
調べるとワークアラウンドは次のようだ。先達には感謝を。dockerで起動する際に –sysctl net.ipv6.conf.all.disable_ipv6=0 を付ければよいようだ。
docker-compose.yamlのサンプルを残しておく。
version: '2.3'
services:
pod01:
image: frrouting/frr:multiarch
container_name: pod01
init: true
cap_add:
- NET_ADMIN
- SYS_ADMIN
cap_drop:
- fowner
- sys_chroot
- audit_write
- setfcap
- fsetid
networks:
nw:
ipv4_address: "192.168.100.11"
ipv6_address: "fd00:abcd:abcd:abcd::11"
sysctls:
- net.ipv6.conf.all.disable_ipv6=0
networks:
nw:
enable_ipv6: true
driver: bridge
ipam:
driver: default
config:
- subnet: "192.168.100.0/24"
gateway: "192.168.100.1"
- subnet: "fd00:abcd:abcd:abcd::/64"
gateway: "fd00:abcd:abcd:abcd::1"
driver_opts:
com.docker.network.bridge.name: docker_nw001
※cap_dropは権限を削っているだけなので設定は無くてもよい。純粋にfrrを動かすだけならcapabilitiesはもう少し削れそうだが、実際に立ち上げてるコンテナはfrr以外も立ち上げているため必要なものが増えている。商用で使う場合はcapabilitiesを最小限に絞ったりしてるのだろうか……
frrでのvrrp設定は今回のサンプルだとvrrp id=5を使っているので次の様になる。
!
interface eth0
vrrp 5
vrrp 5 priority 140
vrrp 5 ip 192.168.100.10
vrrp 5 ipv6 fd00:abcd:abcd:abcd::10
!
priorityはprimaryがsecondaryよりも高くなるように設定する。初期値は100。