Linux で GRE トンネルを作成する方法
IHAnetのサイトでは BSD での解説しかありませんので、ここでは Linux の iproute2 を使い接続する方法を解説します。
gre tunnel を張る
まずはgreモジュールをロードします。
# /sbin/modprobe ip_gre
次に、お互いの gre tunnel end point となるアドレスを教え合います。相手のアドレスを <REMOTE_IPV4_ADDR> とします。インターフェース名は <IF_NAME> とします。自分のアドレスを <LOCAL_IPV4_ADDR> とします。TTLを<TTL>とします。Over IPv4のトンネルでは、TTLを指定しないとInnerパケットのTTLがコピーされ、eBGPが確立出来なくなってしまいますので注意が必要です。Linuxの場合、IF_NAMEには、例えばtunnel0 などを使えばよいです。
# /sbin/ip tunnel add <IF_NAME> mode gre remote <REMOTE_IPV4_ADDR> local <LOCAL_IPV4_ADDR> ttl <TTL>
次に相互接続に使用するアドレスを選択します。これはどちらかが払い出さないといけないので、相談します。 割り振られた自分のアドレスを <LOCAL_IPV6_ADDR> 、相手のアドレスを <REMOTE_IPV6_ADDR>、prefixを、<PREFIXLEN>とします。また、通信する際のMTUを、<MTU>とします。
# /sbin/ip link set <IF_NAME> mtu <MTU> up
# /sbin/ip addr add <LOCAL_IPV6_ADDR>/<PREFIXLEN> dev <IF_NAME>
ここまで、ping6による疎通確認ができるはずです。疎通できない場合は
ip6tables で制限していないか
gre の end point のアドレスを間違えていないか
iptables で protocol/47 を制限していないか
iptables -A INPUT -p gre -j ACCEPT
iptables -A OUTPUT -p gre -j ACCEPT
あたりを疑いましょう。
起動時の設定(未完)
Debian
Debianでは /etc/network/interfaces に設定します。以下にサンプルを示します。
# /etc/network/interfaces サンプル
# GREの場合
auto トンネル名
iface トンネル名 inet6 manual
up ip tunnel add $IFACE mode gre \
remote TUNNEL_REMOTE_IPV4_ADDR local TUNNEL_LOCAL_IPV4_ADDR ttl 255
up ip addr add dev $IFACE local LOCAL_IPV6_ADDR/64
up ip link set $IFACE up
down ip tunnel del name $IFACE
# IP6IP (IPv6 over IPv6, Protocol 41ベース) のトンネルの場合
# ip6ip6をやる場合は,/etc/modulesにtunnel6, ip6_tunnelを足すのを忘れずに:
# echo "tunnel6" >> /etc/modules
# echo "ip6_tunnel" >> /etc/modules
auto トンネル名
iface トンネル名 inet6 manual
up ip -f inet6 tunnel add $IFACE mode ip6ip6 \
remote TUNNEL_REMOTE_IPV6_ADDR local TUNNEL_LOCAL_IPV6_ADDR ttl 255
up ip addr add dev $IFACE local LOCAL_IPV6_ADDR/64
up ip link set $IFACE up
down ip tunnel del name $IFACE
Gentoo
Gentooでは、 /etc/conf.d/net に設定します。net.exampleに設定例があります。また、ハンドブックにも記載があります。