radvd

IPv6 Router Advertisement Daemon
 
IPv6で必要となるルータ広告を行う為のLinuxDaemon。
LinuxサーバをIPv6ルータとして動作させる時に利用する事が多い。
Raspberry PiをIPv6実験環境として利用したい場合には重宝する。

インストール

1. ビルド・インストール
radvdは細かいオプションを付与しなくてもビルドは成功する。
今回はインストール先を分離する為にprefixのみ付与しておく。

$ tar zxvf radvd-2.16.tar.gz
$ cd radvd-2.16
$ ./configure --prefix=/usr/local/radvd-2.16
$ make
$ make install
$ cd /usr/local
$ ln -s /usr/local/radvd-2.16 radvd
$ cd /etc
$ ln -s /usr/local/radvd/etc radvd



2. 起動オプションの設定
radvdを起動させる為のユーザ指定を行う。
chroot環境として動かす場合は、下記ファイルを書き換える事でchroot化出来る。

# vi /etc/default/radvd
--------------------------------------------------
# No chroot; /var/run/radvd must be owned by -u.
OPTIONS="-u radvd"

# Chroot; directory structure under /var/chroot/radvd has to be populated.
#OPTIONS="-u radvd -t /var/chroot/radvd"



3. 起動スクリプトの作成
Redhatの場合は、"SOURCE/redhat/radvd.init"をOS指定ディレクトリにコピーすれば良い。
Debianの場合は下記ファイルの様に、一部を改変する必要がある。

$ vi /etc/init.d/radvd
--------------------------------------------------
#!/bin/sh
#
# radvd           radvd is the router advertisement daemon for IPv6.
#
### BEGIN INIT INFO
# Provides:       radvd
# Required-Start: $network $remote_fs $syslog
# Required-Stop:  $network $remote_fs $syslog
# Default-Start:  2 3 4 5
# Default-Stop:
# Short-Description: Router Advertisement Daemon for IPv6
### END INIT INFO

# Source function library.
. /lib/lsb/init-functions

[ -f /etc/default/radvd ] && . /etc/default/radvd

RETVAL=0
PROG="radvd"
LOCKFILE=/var/lock/subsys/radvd

# See how we were called.
case "$1" in
    start)
        if [ ! -f /etc/radvd/radvd.conf ]; then
            echo $"Configuration file /etc/radvd/radvd.conf missing" 1>&2
            exit 6
        fi
        if [ `id -u` -ne 0 ]; then
            echo $"Insufficient privilege" 1>&2
            exit 4
        fi
        echo -n $"Starting $PROG: "
        /usr/local/radvd/sbin/radvd $OPTIONS
        RETVAL=$?
        echo
        if [ $RETVAL -eq 0 ]; then
            touch $LOCKFILE
        else
            if [ -f $LOCKFILE ]; then
                RETVAL=0
            fi
        fi
        ;;

    stop)
        echo -n $"Stopping $PROG: "
        killproc radvd
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
        ;;

    restart)
        $0 stop
        $0 start
        RETVAL=$?
        ;;

    reload|force-reload)
        echo -n $"Reloading $PROG: "
        killproc radvd -HUP
        RETVAL=$?       
        echo
        ;;

    condrestart|try-restart)
        if [ -f $LOCKFILE ]; then
            $0 stop
            $0 start
            RETVAL=$?
        fi
        ;;

    *)
        echo $"Usage: $0 {start|stop|restart|try-restart|reload|force-reload}"
        exit 2
esac

exit $RETVAL



4. 起動準備
実行ユーザ作成と、iptablesのフィルタリング解除を行う。
クライアントからRAへ通信を行うには、下記のICMPv6パケットを通す必要がある。

・iptables開放
==================================================
# ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request           -j ACCEPT
# ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-reply             -j ACCEPT
# ip6tables -A INPUT -p icmpv6 --icmpv6-type router-solicitation    -j ACCEPT
# ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement   -j ACCEPT
# ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation  -j ACCEPT
# ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
・実行ユーザ、グループ作成
==================================================
$ groupadd radvd
$ useradd -g radvd -d /var/run/radvd -s /usr/sbin/nologin radvd
・起動スクリプト登録
==================================================
$ chmod 755 /etc/init.d/radvd
$ systemctl enable radvd



5. コンフィグ作成

今回は出番が一番多そうな下記条件でコンフィグを作成。
細かい所は上記のドキュメントを読みながら作成する。
 
・アドレス、設定内容

EUI-64払出セグメント2001:aa:bb:cc::/64
プライマリDNS2001:aa:bb:cc::a
セカンダリDNS2001:aa:bb:cc::b
ManagedフラグOFF (IPアドレスはEUI-64生成)
OtherConfigフラグON (DNSサーバはDHCP取得)
RA用Interfaceeth0.1 (サブインターフェース)

 
・設定内容

# vi /etc/radvd/radvd.conf
--------------------------------------------------
interface eth0.1 {
    AdvManagedFlag       off;
    AdvOtherConfigFlag   on;
    AdvSendAdvert        on;
    AdvDefaultPreference high;
    MinRtrAdvInterval    30;
    MaxRtrAdvInterval    100;

    RDNSS 2001:aa:bb:cc::a 2001:aa:bb:cc::b {
        AdvRDNSSLifetime infinity;  #DNSサーバのアドレスキャッシュ自動削除を無効化
                                    #WindowsのDNSサーバが自動削除されるバグを抑制出来る
    };

    prefix 2001:aa:bb:cc::/64 {
        AdvOnLink     on;
        AdvAutonomous on;
        AdvRouterAddr on;
    };
};


冗長化設定(radvd+VRRP)

RAではリンクローカルアドレスからのIPv6アドレス配布を前提としている為、
Keepalived でユニキャストアドレスを生成し、
RA送信元もユニキャストアドレスに限定した場合、radvdはRAを送信出来なくなる。
この場合、Keepalivedにはリンクローカルアドレス(FE80::/10)も割り当てるように設定し、
radvdのRA送信元IPアドレスは、Keepalivedで生成したリンクローカルアドレスにする。

# vi /etc/keepalived/keepalived.conf
--------------------------------------------------
vrrp_instance eth1-ipv6 {
    native_ipv6
    vrrp_version      3
    state             BACKUP
    interface         eth1
    virtual_router_id 80
    garp_master_delay 5
    advert_int        1
    priority          2
    unicast_src_ip    fe80::10:0:0:2
    unicast_peer {
        fe80::10:0:0:1
        fe80::10:0:0:2
    }
    authentication {
        auth_type PASS
        auth_pass vrrp_pass
    }
    virtual_ipaddress {
        fe80::1                #RA送信用リンクローカルアドレス
        2001:aaaa:bbbb:cccc::1 #RA送信I/Fのユニキャストアドレス
    }
}
# vi /etc/radvd/radvd.conf
--------------------------------------------------
interface eth0.1 {
    AdvManagedFlag       off;
    AdvOtherConfigFlag   on;
    AdvSendAdvert        on;
    AdvDefaultPreference high;
    MinRtrAdvInterval    30;
    MaxRtrAdvInterval    100;

    AdvRASrcAddress {
        fe80::1;
    };

    RDNSS 2001:aa:bb:cc::a 2001:aa:bb:cc::b {
        AdvRDNSSLifetime infinity;
    };

    prefix 2001:aa:bb:cc::/64 {
        AdvOnLink     on;
        AdvAutonomous on;
        AdvRouterAddr on;
    };
};