GRE ( Generic Routing Encapsulation )
GRE ( Generic Routing Encapsulation ) はトンネルプロトコルの1つです。RFC1701, 2784で定義されています。
トンネルプロトコル
トンネリングとは、インターネット上の情報通信において、ある通信プロトコルを、同じまたはより上位の階層(レイヤ)のプロトコルのデータとして通信する技術である。この、別のプロトコルのデータとすることを特にカプセル化(encapsulation)という。通信したいプロトコルそのままでは通信することが不可能な場合などに利用される。
パケットのカプセル化とその解除はトンネルの両端の機器で行う為、両端の機器が直結しているように見えます。
お試し環境構築
Vagrant を OSX Maverics へ
- http://www.vagrantup.com/downloads.html より 1.6.3 をダウンロード
 - dmg を マウントして Vagrant.pkg から install
 
Ubuntu Server A を準備
http://www.vagrantbox.es より Official Ubuntu 14.04 daily Cloud Image amd64 (Development release, No Guest Additions)をう使うことにする。
$ mkdir -p ~/vagrant_work/alpha
$ cd ~/vagrant_work/alpha
$ vagrant init ubuntu14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
$ vagrant up
$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-64:~$ cat /etc/issue
Ubuntu 14.04.1 LTS \n \l
vagrant@vagrant-ubuntu-trusty-64:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:db:07:90 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fedb:790/64 scope link 
       valid_lft forever preferred_lft forever
vagrant@vagrant-ubuntu-trusty-64:~$ wget google.com
Ubuntu Server B を準備
$ mkdir -p ~/vagrant_work/beta
$ cd ~/vagrant_work/beta
$ vagrant init ubuntu14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
$ vagrant up
$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-64:~$ cat /etc/issue
Ubuntu 14.04.1 LTS \n \l
vagrant@vagrant-ubuntu-trusty-64:~$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:db:07:90 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fedb:790/64 scope link 
       valid_lft forever preferred_lft forever
vagrant@vagrant-ubuntu-trusty-64:~$ wget google.com
AとBが同じIP?
曰く、VirtualBoxのNATには種類があって、デフォルトでは前者が選択されているようだ。
NATではホストOSが使っているネットワークとは別の、VitualBoxの内部に用意されたネットワークがゲストOSのネットワークとして割り当てられます。
VirtualBoxがホストOSとゲストOSの間に立ち、ルーターの役割を果たします。
後述するポートフォワーディングの設定ができます。
NATはNAでも後者のほうを選択して、一応パケットが通るようにする。
NATネットワーク
4.3で追加されたネットワークモードです。
通常のNATではそれぞれの仮想マシンが独立したネットワークとなっていたために、NAT接続の仮想マシン同士は通信できませんでした。
それに対しNATネットワークは1つのNATネットワークに複数の仮想マシンを接続することで、相互の通信がとれるNAT接続です。NATネットワークにした場合は接続するNATネットワークを選択します。
このNATネットワークは環境設定の項目で複数作成することが可能です。
NATネットワーク設定
まずNAT/DHCPサーバを持つネットワークを提供する必要があるので
VirtualBox > 環境設定 > ネットワーク > NATネットワーク > 右のグリーンの+
でNatNetworkを追加してやる。
NATネットワークIF追加
追加しないと、Vagrantからsshからつながらなくなってしまうので注意!config.vm.provider行をVagrantファイルから見つけて以下のように書く。参考 → http://qiita.com/tnaoto/items/12e9496a4f960bcbc389
  config.vm.provider "virtualbox" do |vb|
     vb.customize ["modifyvm", :id, "--nic2","natnetwork"]
     vb.customize ["modifyvm", :id, "--nictype2","82540EM"]
     vb.customize ["modifyvm", :id, "--nicpromisc2","allow-all"]
  end
Ubuntu上でeth1を有効にする手順
各インスタンスに vagrant ssh でログインし、以下の手順を行い eth1 を起動時にアクセスできるようにする。VM を再起動すればOK。
root@vagrant-ubuntu-trusty-64:/etc/network/interfaces.d# sed -e "s/eth0/eth1/g" eth0.cfg > eth1.cfg
この結果AとBでは以下のようになる。eth1が10.0.2.5/24と10.0.2.6/24にわかれたのがわかる。pingをうてばかえってくるし、`
A
vagrant@vagrant-ubuntu-trusty-64:~$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:db:07:90 brd ff:ff:ff:ff:ff:ff
    inet 192.168.255.15/24 brd 192.168.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fedb:790/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:54:05:c5 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.6/24 brd 10.0.2.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe54:5c5/64 scope link 
       valid_lft forever preferred_lft forever
B
vagrant@vagrant-ubuntu-trusty-64:~$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:db:07:90 brd ff:ff:ff:ff:ff:ff
    inet 192.168.255.15/24 brd 192.168.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fedb:790/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:2a:5e:f5 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.5/24 brd 10.0.2.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe2a:5ef5/64 scope link 
       valid_lft forever preferred_lft forever
kernel module ip_gre の組み込み
sudo modprobe ip_gre してやること。
vagrant@vagrant-ubuntu-trusty-64:~$ sudo lsmod |grep gre
ip_gre                 18245  0 
gre                    13796  1 ip_gre
ip_tunnel              23768  1 ip_gre
コマンド
http://ask.xmodulo.com/create-gre-tunnel-linux.html
http://www.kanadas.com/program/2013/02/2_gre.html
IP/GRE/IPのためのスクリプト
# addgreip REMOTE_IP LOCAL_IP GRE_KEY LOCAL_SLICE_IP
ip tunnel add gre0 mode gre remote ${1} local ${2} key ${3}
ip addr add ${4} dev gre0
ip link set gre0 up
ip link set gre0 mtu 1460
IP/Ethernet/GRE/IP のためのスクリプトのスクリプト
# addgreether REMOTE_IP LOCAL_IP GRE_KEY LOCAL_SLICE_IP
ip link add gre1 type gretap remote ${1} local ${2} key ${3}
ip addr add ${4} dev gre1
ip link set gre1 up
ip link set gre1 mtu 1450
??
こんなエラーがでた。 gre0 を誰かがもう使っているらしい?gre0をgree0でいったん試す。
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ip tunnel add gre0 mode gre remote 10.0.2.5 local 10.0.2.6 ttl 255
add tunnel "gre0" failed: No buffer space available
実行
Ubuntu A
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ip tunnel add gree0 mode gre remote 10.0.2.5 local 10.0.2.6 key 1
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ip link set gree0 up
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ip addr add 192.168.1.1/24 dev gree0
vagrant@vagrant-ubuntu-trusty-64:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:db:07:90  
          inet addr:192.168.255.15  Bcast:192.168.255.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fedb:790/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1548 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1022 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:119782 (119.7 KB)  TX bytes:91629 (91.6 KB)
eth1      Link encap:Ethernet  HWaddr 08:00:27:54:05:c5  
          inet addr:10.0.2.6  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe54:5c5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:77 errors:0 dropped:0 overruns:0 frame:0
          TX packets:79 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:19851 (19.8 KB)  TX bytes:10911 (10.9 KB)
gree0     Link encap:UNSPEC  HWaddr 0A-00-02-06-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:192.168.1.1  P-t-P:192.168.1.1  Mask:255.255.255.0
          inet6 addr: fe80::5efe:a00:206/64 Scope:Link
          UP POINTOPOINT RUNNING NOARP  MTU:1472  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:192 (192.0 B)
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
vagrant@vagrant-ubuntu-trusty-64:~$ ip route show
default via 10.0.2.1 dev eth1 
10.0.2.0/24 dev eth1  proto kernel  scope link  src 10.0.2.6 
192.168.1.0/24 dev gree0  proto kernel  scope link  src 192.168.1.1 
192.168.255.0/24 dev eth0  proto kernel  scope link  src 192.168.255.15 
Ubuntu B
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ip link set gree0 up
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ip addr add 192.168.1.2/24  dev gree0
vagrant@vagrant-ubuntu-trusty-64:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:db:07:90  
          inet addr:192.168.255.15  Bcast:192.168.255.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fedb:790/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2371 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1601 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:199693 (199.6 KB)  TX bytes:138770 (138.7 KB)
eth1      Link encap:Ethernet  HWaddr 08:00:27:2a:5e:f5  
          inet addr:10.0.2.5  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe2a:5ef5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1086 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1381 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1313637 (1.3 MB)  TX bytes:157002 (157.0 KB)
gree0     Link encap:UNSPEC  HWaddr 0A-00-02-05-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:192.168.1.2  P-t-P:192.168.1.2  Mask:255.255.255.0
          inet6 addr: fe80::5efe:a00:205/64 Scope:Link
          UP POINTOPOINT RUNNING NOARP  MTU:1472  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:192 (192.0 B)
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
vagrant@vagrant-ubuntu-trusty-64:~$ ip route show
default via 10.0.2.1 dev eth1 
10.0.2.0/24 dev eth1  proto kernel  scope link  src 10.0.2.5 
192.168.1.0/24 dev gree0  proto kernel  scope link  src 192.168.1.2 
192.168.255.0/24 dev eth0  proto kernel  scope link  src 192.168.255.15 
間違えてしまったりしたとき消す方法
sudo ip link set gree0 down
sudo ip tunnel del gree0
確認
Ubuntu A から以下などで試せる。
vagrant@vagrant-ubuntu-trusty-64:~$ ping 192.168.1.1
vagrant@vagrant-ubuntu-trusty-64:~$ ssh 192.168.1.1
Dockerでブリッジ
それぞれDockerを入れる
$ sudo apt-get install docker.io
$ sudo docker.io pull ubuntu:latest
