ほしいプロトコルは
カプセルすればいいじゃない	
ARAKI Yasuhiro (ar1@)
JAWS DAYS 2014
⾃自⼰己紹介
!   名前
•  荒⽊木  靖宏(twitter:  ar1)
!   肩書
•  JAWS-‐‑‒UG→AWSへ
•  プリンシパルソリューション
アーキテクト
!   好きなAWSサービス
•  Amazon  Virtual  Private  
Cloud
•  AWS  Direct  Connect
IPv6
Multicast
&
More!
方式! 対象! オーバー
ヘッド!
IP-in-
IP!
IP! 20バイト! 20バイトのヘッダ付与!
GRE! IP,AppleT
alk,Multic
ast等!
24バイト! 20バイトのヘッダ+4バイトの
GREヘッダ!
TUN! IP,AppleT
alk,Multic
ast等!
小! ネットワーク層を模擬!
TAP! イーサ
ネット!
大! イーサネットデバイスを模擬!
IPsec! IP(tunnel
mode)!
54〜78!
バイト!
暗号化コストのほうが。。!
ESP-3DES/DES ESP-SHA1/MD5 54バイト!
ESP-AES ESP-SHA512 78バイト!
2001:db8::/32
ボーダールータ	
6rd client
192.168.1.1	
6rd  (IP-‐‑‒in-‐‑‒IP)によるIPv6
IPv4IPv6
IPv6
2001:db8:c048:101::/64
2001:db8:c048:101::1234/64
16進表記での
192.168.1.1
IPv6の⼿手順
!   VPCを作り、VPC⽤用のEIPを取得
!   IPv6トンネル先を登録
•  https://tunnelbroker.net/  あたりがおすすめ(無料料)
•  EIPを⼊入れるとエンドポイントが作られる
!   エンドポイント情報を⼊入⼿手
•  Server  IPv4  Address
•  Client  IPv6  Address
!   Server  IPv4  Addressへ
!   Protocol番号41をServer  IPv4  Addressへ通す
!   あとはEC2からトンネルを作る
!   Route53で登録
IPv6
Internet	
IPv4
Internet	
6rd tunnel
Protocol: 41	
6rd server	
 6rd client	
⼿手順全体図
tunnelbroker.net
(he.net)
Security  Groupの設定
Server IPv4 Address
Vyattaからトンネルを作る
configure
edit  interfaces  tunnel  tun0
set  encapsulation  sit
set  local-‐‑‒ip  EC2のプライベートアドレス
set  remote-‐‑‒ip  Server  IPv4  Address
set  address  Client  IPv6  Address
set  description  "HE.NET  IPv6  Tunnel"
exit
set  protocols  static  interface-‐‑‒route6  ::/0  next-‐‑‒hop-‐‑‒
interface  tun0
commit
Simple Internet Transition (SIT)
IPv6をIPv4に乗せるためのもの
tyo1.ipv6.he.net東京	
 バージニア	
ash1.ipv6.he.net
⽶米国東海岸ー東京リージョン間
  1    ar1-‐‑‒2.tunnel.tserv13.ash1.ipv6.he.net  (2001:470:7:b23::1)    4.608  ms    7.050  
ms    9.707  ms
  2    gige-‐‑‒g4-‐‑‒12.core1.ash1.he.net  (2001:470:0:90::1)    16.986  ms    16.954  ms    
16.916  ms
  3    10gigabitethernet1-‐‑‒2.core1.atl1.he.net  (2001:470:0:1b5::2)    22.150  ms    
22.117  ms    22.078  ms
  4    10gigabitethernet3-‐‑‒2.core1.dal1.he.net  (2001:470:0:1b6::1)    42.314  ms    
42.283  ms    42.246  ms
  5    10gigabitethernet2-‐‑‒4.core1.phx2.he.net  (2001:470:0:258::1)    69.700  ms    
69.670  ms    69.637  ms
  6    10gigabitethernet15-‐‑‒6.core1.lax2.he.net  (2001:470:0:24a::2)    73.184  ms    
67.488  ms    66.650  ms
  7    10gigabitethernet3-‐‑‒2.core1.tyo1.he.net  (2001:470:0:294::2)    162.600  ms    
162.120  ms    162.333  ms
  8    tserv1.tyo1.he.net  (2001:470:0:118::2)    163.306  ms    163.431  ms    162.635  
ms
  9    ar1-‐‑‒1-‐‑‒pt.tunnel.tserv22.tyo1.ipv6.he.net  (2001:470:23:12e::2)    166.556  ms    
165.961  ms    166.215  ms
GRE
GRE:Generic  Routing  Encapsulation
!  GREは名前の通りの汎⽤用カプセル⼿手法
!  IP以外
•  IPX
•  AppleTalk
•  DECNet
!  もちろんIPも
•  Multicast
•  Broadcast
•  IPv6
GREでMulticastの⼿手順
!   VPCを作る
!   インスタンス起動
•  Protocol番号47(GRE)はお互い通信可能に設定
!   カーネルパラメータを設定
•  ICMP、IGMPに答える⽤用に設定
•  IP転送設定
•  経路路⾮非対称を有効化
!   GREトンネルを設定
•  169.254.x.yを使うことに
!   マルチキャストアドレスに経路路設定
! pimdを起動
インスタンス内設定
スクリプトは後述
⼿手順全体図
/dev/tun0
169.254.0.1	
/dev/tun0
169.254.0.2	
/dev/eth0
10.3.8.118	
/dev/eth0
10.3.8.119	
10.3.8.x	
PIMD	
 PIMD	
Multicast Enable (224.0.0.0/4)
インスタンス内設定スクリプト(例例)
auto  tun0
iface  tun0  inet  static
              address  169.254.0.1
              netmask  255.255.255.0
              broadcast  169.254.0.255
              up  ifconfig  tun0  multicast
              pre-‐‑‒up  ip  tunnel  add  tun0  mode  gre  remote  10.3.8.119  local  
10.3.8.118  ttl  255
              pre-‐‑‒up  echo  0  >  /proc/sys/net/ipv4/icmp_̲echo_̲ignore_̲broadcasts
              pre-‐‑‒up  echo  1  >  /proc/sys/net/ipv4/ip_̲forward
              pre-‐‑‒up  echo  0  >  /proc/sys/net/ipv4/conf/all/rp_̲filter
              up  ip  route  add  224.0.0.0/4  dev  tun0
              up  /etc/init.d/pimd  restart
              pointopoint  169.254.0.2
              post-‐‑‒down  iptunnel  del  tun0
Multicastの疎通を試す
root@ip-‐‑‒10-‐‑‒3-‐‑‒8-‐‑‒119:/etc/network/interfaces.d#  ping  224.0.0.1
PING  224.0.0.1  (224.0.0.1)  56(84)  bytes  of  data.
64  bytes  from  169.254.0.2:  icmp_̲seq=1  ttl=64  time=0.035  ms
64  bytes  from  169.254.0.1:  icmp_̲seq=1  ttl=64  time=0.557  ms  (DUP!)
64  bytes  from  169.254.0.2:  icmp_̲seq=2  ttl=64  time=0.033  ms
64  bytes  from  169.254.0.1:  icmp_̲seq=2  ttl=64  time=0.512  ms  (DUP!)
TAP
TAP:simulates  a  link  layer  device
!  network  tap  から  TAPと命名
!  イーサネットデバイスをシミュレート
•  デバイスで使えるプロトコルに制限なし
!  様々な利利⽤用実績
•  OpenVPN
•  VTun
•  tinc
•  …
TAPでMulticastの⼿手順  w/  OpenVPN
!   VPCを作る
!   サーバインスタンス起動
•  ブリッジを作成
•  OpenVPNサーバをTAPモードで動作
•  ip  route  add  224.0.0.0/4  dev  br0
!   クライアントインスタンスを起動
•  OpenVPNクライアントでサーバに接続。同時にTAP作成。
•  ip  route  add  224.0.0.0/4  dev  tap0
! pimd  start
⼿手順全体図
/dev/tap0
10.8.0.50	
/dev/eth0
10.3.8.118	
/dev/eth0
10.3.8.119	
10.3.8.x	
PIMD	
 PIMD	
Multicast Enable (224.0.0.0/4)	
Open
VPN	
Open
VPN	
/dev/tap0
	
/dev/br0
10.8.0.4
Multicastの疎通を試す
root@ip-‐‑‒10-‐‑‒3-‐‑‒8-‐‑‒118:/etc/openvpn#  ping  224.0.0.1
PING  224.0.0.1  (224.0.0.1)  56(84)  bytes  of  data.
64  bytes  from  10.8.0.50:  icmp_̲seq=1  ttl=64  time=0.041  ms
64  bytes  from  10.8.0.4:  icmp_̲seq=1  ttl=64  time=0.870  ms  (DUP!)
64  bytes  from  10.8.0.50:  icmp_̲seq=2  ttl=64  time=0.062  ms
64  bytes  from  10.8.0.4:  icmp_̲seq=2  ttl=64  time=0.834  ms  (DUP!)
参考
!   Tunnels,  Reference  Guide,  Vyatta  System

ほしいプロトコルはトンネルすればいいじゃない at JAWS DAYS 2014 Tech Deep Dive