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。