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に設定例があります。また、ハンドブックにも記載があります