ASAMAP 開発秘話

3,032 views

Published on

ENOG 17 Meeting の発表資料です。

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,032
On SlideShare
0
From Embeds
0
Number of Embeds
86
Actions
Shares
0
Downloads
29
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • ASAMAP 開発秘話

    1. 1. ASAMAP 開発秘話 浅間 正和 @ 有限会社 銀座堂
    2. 2. はじめに…• 本資料は Paris MAP(http://tools.ietf.org/html/draft-ietf- softwire-map-01)を実装した際の設計や大変だった こと等を説明するものです• Paris MAP は MAP-E と MAP-T の両方に対応する “One solution” として提案されていましたが Jul 29 - Aug 3, 2012 に Vancouver で開催された IETF84 にて “Two solutions” として分けることが合意されました ☞ MAP-E → MAP(Standard track) ☞ MAP-T → MAP-T(Experimental track)• 本資料上は Paris MAP のことを単に MAP としていま すので予めご了承ください
    3. 3. MAP とは?• 現在 IETF Softwire WG で標準化が進められている IPv6 network 上で IPv4 service を展開するための protocol のひとつ ☞ http://tools.ietf.org/html/draft-ietf-softwire-map  • IPv4 packet を IPv6 header で capsule 化する MAP-E (Encapsulation)と IPv4 packet の IPv4 header を IPv6 header に書き換える MAP-T(Translation)の 2 種類 が存在• Provider network 側に変換 table を持つ address and port 変換装置を持たない(Stateless)• ひとつの IPv4 address を複数の顧客で共有可能
    4. 4. 超簡単!こんなかんじで Mapping! CE
    5. 5. 超簡単!こんなかんじで Mapping! CE 2001:db8:112:3400::/56
    6. 6. 超簡単!こんなかんじで Mapping! Mapping Rule Table Rule IPv6 Rule IPv4 EA-bitsBR address = 2001:db8::1 (MAP-E) prefix prefix lengthBR prefix = 2001:db8::/64 (MAP-T) Rule #1 2001:db8:100::/40 192.0.2.0/24 16 Rule #2 2001:db8:200::/40 198.51.100.0/24 16 CE 2001:db8:112:3400::/56
    7. 7. 超簡単!こんなかんじで Mapping! Mapping Rule Table Rule IPv6 Rule IPv4 EA-bitsBR address = 2001:db8::1 (MAP-E) prefix prefix lengthBR prefix = 2001:db8::/64 (MAP-T) Rule #1 2001:db8:100::/40 192.0.2.0/24 16 Rule #2 2001:db8:200::/40 198.51.100.0/24 16 CE 2001:db8:112:3400::/56 Rule #1 と一致!
    8. 8. 超簡単!こんなかんじで Mapping! Mapping Rule Table Rule IPv6 Rule IPv4 EA-bitsBR address = 2001:db8::1 (MAP-E) prefix prefix lengthBR prefix = 2001:db8::/64 (MAP-T) Rule #1 2001:db8:100::/40 192.0.2.0/24 16 Rule #2 2001:db8:200::/40 198.51.100.0/24 16 CE 2001:db8:112:3400::/56 Rule #1 と一致! EA-bits length 分切り取る 0x1234
    9. 9. 超簡単!こんなかんじで Mapping! Mapping Rule Table Rule IPv6 Rule IPv4 EA-bitsBR address = 2001:db8::1 (MAP-E) prefix prefix lengthBR prefix = 2001:db8::/64 (MAP-T) Rule #1 2001:db8:100::/40 192.0.2.0/24 16 Rule #2 2001:db8:200::/40 198.51.100.0/24 16 CE 2001:db8:112:3400::/56 Rule #1 と一致! EA-bits length 分切り取る 0x1234 切り取った分を Rule IPv4 prefix に 左から埋める 192.0.2.18
    10. 10. 超簡単!こんなかんじで Mapping! Mapping Rule Table Rule IPv6 Rule IPv4 EA-bitsBR address = 2001:db8::1 (MAP-E) prefix prefix lengthBR prefix = 2001:db8::/64 (MAP-T) Rule #1 2001:db8:100::/40 192.0.2.0/24 16 Rule #2 2001:db8:200::/40 198.51.100.0/24 16 CE 2001:db8:112:3400::/56 Rule #1 と一致! EA-bits length 分切り取る 0x1234 切り取った分を 残りは Rule IPv4 prefix に Port-set ID 左から埋める 192.0.2.18 0x34
    11. 11. 超簡単!こんなかんじで Mapping! Mapping Rule Table Rule IPv6 Rule IPv4 EA-bitsBR address = 2001:db8::1 (MAP-E) prefix prefix lengthBR prefix = 2001:db8::/64 (MAP-T) Rule #1 2001:db8:100::/40 192.0.2.0/24 16 Rule #2 2001:db8:200::/40 198.51.100.0/24 16 CE 2001:db8:112:3400::/56 Rule #1 と一致! EA-bits length 分切り取る 0x1234 Port-set 切り取った分を min max 残りは Rule IPv4 prefix に Port-range #1 0x1340 0x134f Port-set ID 左から埋める Port-range #2 0x2340 0x234f 192.0.2.18 0x34 : : : Port-range #15 0xf340 0xf34f ※ Port-set ID Offset が 4bit の場合
    12. 12. 超簡単!こんなかんじで Mapping! Mapping Rule Table Rule IPv6 Rule IPv4 EA-bitsBR address = 2001:db8::1 (MAP-E) prefix prefix lengthBR prefix = 2001:db8::/64 (MAP-T) Rule #1 2001:db8:100::/40 192.0.2.0/24 16 Rule #2 2001:db8:200::/40 198.51.100.0/24 16 CE 2001:db8:112:3400::/56 Rule #1 と一致! EA-bits length 分切り取る 0x1234 Port-set 切り取った分を min max 残りは Rule IPv4 prefix に Port-range #1 0x1340 0x134f Port-set ID 左から埋める Port-range #2 0x2340 0x234f 192.0.2.18 0x34 : : : Port-range #15 0xf340 0xf34f = 0xc0000212 ※ Port-set ID Offset が 4bit の場合 32bits 16bits2001:db8:112:3400:c0:2:1200:3400 = My Addr!
    13. 13. 超簡単!こんなかんじで Mapping! IPv6 dst addr 2001:db8::1 203.0.113.80 = 0xcb007150 IPv6 src addr 2001:db8:112:3400:c0:2:1200:3400IPv6 dst addr 2001:db8::cb:71:5000:0 IPv4 dst addr 203.0.113.80IPv6 src addr 2001:db8:112:3400:c0:2:1200:3400 IPv4 src addr 192.0.2.18TCP dst port 80 TCP dst port 80TCP src port 4928 TCP src port 4928 MAP-T の場合 MAP-E の場合 CE src port は Port-set から 空いているものを使う IPv4 dst addr 203.0.113.80 IPv4 src addr 192.168.1.11 TCP dst port 80 TCP src port 49152
    14. 14. 超簡単!こんなかんじで Mapping! IPv4 dst addr 203.0.113.80 IPv4 src addr 192.0.2.18 TCP dst port 80 TCP src port 4928 src addr と src port の BR validation を実施 MAP-T の場合 MAP-E の場合IPv6 dst addr 2001:db8::cb:71:5000:0 IPv6 dst addr 2001:db8::1IPv6 src addr 2001:db8:112:3400:c0:2:1200:3400 IPv6 src addr 2001:db8:112:3400:c0:2:1200:3400TCP dst port 80 IPv4 dst addr 203.0.113.80TCP src port 4928 IPv4 src addr 192.0.2.18 TCP dst port 80 TCP src port 4928
    15. 15. 超簡単!こんなかんじで Mapping! IPv4 dst addr 192.0.2.18 IPv4 src addr 203.0.113.80 TCP dst port 4928 TCP src port 80② IPv4 dst addr と dst port ① Mapping Rule Table から からIPv6 dst addr 計算 BR IPv4 dst addr を key に探索 MAP-T の場合 MAP-E の場合IPv6 dst addr 2001:db8:112:3400:c0:2:1200:3400 IPv6 dst addr 2001:db8:112:3400:c0:2:1200:3400IPv6 src addr 2001:db8::cb:71:5000:0 IPv6 src addr 2001:db8::1TCP dst port 4928 IPv4 dst addr 192.0.2.18TCP src port 80 IPv4 src addr 203.0.113.80 TCP dst port 4928 TCP src port 80
    16. 16. 超簡単!こんなかんじで Mapping! IPv6 dst addr 2001:db8:112:3400:c0:2:1200:3400 IPv6 src addr 2001:db8::1IPv6 dst addr 2001:db8:112:3400:c0:2:1200:3400 IPv4 dst addr 192.0.2.18IPv6 src addr 2001:db8::cb:71:5000:0 IPv4 src addr 203.0.113.80TCP dst port 4928 TCP dst port 4928TCP src port 80 TCP src port 80 MAP-T の場合 MAP-E の場合 CE NAPT Table から IPv4 dst addr と dst port を求める IPv4 dst addr 192.168.1.11 IPv4 src addr 203.0.113.80 TCP dst port 49152 TCP src port 80
    17. 17. 作戦• Linux kernel に map という名前の virtual network interface を実装• iproute2 を改造し map interface を作ったり削除した りできるようにする• Map Rule Table にある IPv4 network address 宛を map interface に routing することで IPv4 → IPv6 への変換 処理を kick する• 自分自身の IPv6 address 宛を map interface に routing することで IPv6 → IPv4 への変換処理を kick する ☞ 自分自身の IPv6 address は長いし必ずひとつし かないので map interface が自動で routing する
    18. 18. 作戦 • BR の場合の設定はこんなかんじ# ip map add map0 role br ¥ br-address 2001:db8::1/64 ¥ default-forwarding-mode (translation|encapsulation)# ip map add-rule dev map0 ¥ ipv6-prefix 2001:db8:100::/40 ¥ ipv4-prefix 192.0.2.0/24 ¥ ea-length 16# ip route add 192.0.2.0/24 dev map0 • CE の場合の設定はこんなかんじ# ip map add map0 role ce tunnel-source eth1 ¥ br-address 2001:db8::/64 ¥ default-forwarding-mode (translation|encapsulation)# ip map add-rule dev map0 ¥ ipv6-prefix 2001:db8:100::/40 ¥ ipv4-prefix 192.0.2.0/24 ¥ ea-length 16# ip route add 0.0.0.0/0 dev map0
    19. 19. 作戦static const struct net_device_ops map_netdev_ops = { ... .ndo_start_xmit = map_transmit, ...};static netdev_tx_tmap_transmit(struct sk_buff *skb, struct net_device *dev){ struct map *m = netdev_priv(dev); ... switch (ntohs(skb->protocol)) { case ETH_P_IP: map_v4v6(skb, m); break; case ETH_P_IPV6: map_v6v4(skb, m); break; ... } return NETDEV_TX_OK;}
    20. 20. 作戦intmap_trans_forward_v6v4(struct sk_buff *skb, struct map *m, __be32 *saddr4, __be32 *daddr4){ ... skb_pull(skb, hsize); skb_push(skb, sizeof(struct iphdr)); skb_reset_network_header(skb); skb->protocol = htons(ETH_P_IP); ...}intmap_trans_forward_v4v6(struct sk_buff *skb, struct map *m, struct map_rule *mr){ ... skb_pull(skb, orig_iph.ihl * 4); skb_push(skb, sizeof(struct ipv6hdr)); skb_reset_network_header(skb); skb->protocol = htons(ETH_P_IPV6); ...}
    21. 21. 作戦intmap_encap_forward_v6v4(struct sk_buff *skb, struct map *m, __be32 *saddr4, __be32 *daddr4){ ... skb_pull(skb, hsize); skb_reset_network_header(skb); skb->protocol = htons(ETH_P_IP); ...}intmap_encap_forward_v4v6(struct sk_buff *skb, struct map *m, struct map_rule *mr){ ... skb_push(skb, sizeof(struct ipv6hdr)); skb_reset_network_header(skb); skb->protocol = htons(ETH_P_IPV6); ...}
    22. 22. 作戦intmap_trans_forward_v6v4(struct sk_buff *skb, struct map *m, __be32 *saddr4, __be32 *daddr4){ ... netif_rx(skb); ...}intmap_trans_forward_v4v6(struct sk_buff *skb, struct map *m, struct map_rule *mr){ ... dst = ip6_route_output(net, NULL, &fl6); dst_metric_set(dst, RTAX_MTU, 1280); ... skb_dst_set(skb, dst); ... ip6_local_out(skb); ...}
    23. 23. MAP-T と MAP-E の混在構成 default-forwarding-mode translation BR Provider IPv6 Network CE CE destination address 側の MAP-T mapping rule の forwarding mode が適用 MAP-E されるforwarding-mode encapsulation forwarding-mode translation
    24. 24. なんで routing で kick させるのか?• MAP-T では IPv6 header の next header field をみて MAP か否かを判定できない ☞ MAP-E の場合は IPv6 header の next header field が IPIP(0x04)であれば MAP と判定できる• MAP-T は MAP-E と異なり必ず BR/CE がひとつの IPv6 address を持つわけではない ☞ BR は IID に IPv4 destination address を埋め込む ☞ CE も IPv4 prefix を割り当てられる構成の場合 IID は複数の値を取り得る☞ ということで XFRM は使えない…☞ Netfilter という手もあるけど読みたくない…
    25. 25. Fragment いろいろ IPv4 Header IPv4 Header 20 byte 20 byte (offset 1472) (offset 0) 8 byte UDP Header ? DATA 1500 byte CE528 byte (1473 2000) DATA 1472 byte (1 1472)
    26. 26. IPv4 Header IPv4 Header Fragment いろいろ 20 byte 20 byte (offset 1472) (offset 0) 8 byte UDP Header DATA 1500 byte 528 byte (1473 2000) DATA 1472 byte (1 1472) 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header IPv4 Header IPv4 Header IPv4 Header IPv4 Header IPv4 Header 20 byte 20 byte 20 byte 20 byte 20 byte (offset 1432) (offset 0) (offset 1472) (offset 1432) (offset 0) DATA 1460 byte 1460 byte DATA 8 byte UDP Header DATA 40 byte 8 byte UDP Header568 byte 528 byte (1433 1472) (1433 2000) (1473 2000) DATA DATA 1432 byte 1432 byte (1 1432) (1 1432) 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header IPv6 Frag Hdr IPv6 Frag Hdr IPv4 Header IPv6 Frag Hdr IPv6 Frag Hdr 8 byte 8 byte 20 byte 8 byte 8 byte (offset 1232) (offset 0) (offset 1472) (offset 1232) (offset 0) IPv4 Header IPv4 Header 1280 byte 1280 byte DATA 20 byte DATA DATA 20 byte796 byte (offset 0) 528 byte 268 byte (offset 0) (1205 2000) (1473 2000) (1205 1472) 8 byte UDP Header 8 byte UDP Header DATA DATA 1204 byte 1204 byte (1 1204) (1 1204)
    27. 27. IPv4 Header IPv4 Header Fragment いろいろ 20 byte 20 byte (offset 1472) (offset 0) 8 byte UDP Header DATA 1500 byte 528 byte (1473 2000) DATA 1472 byte (1 1472) 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header IPv4 Header IPv4 Header IPv4 Header IPv4 Header IPv4 Header 20 byte 20 byte 20 byte 20 byte 20 byte (offset 1432) (offset 0) (offset 1472) (offset 1432) (offset 0) DATA 1460 byte 1460 byte DATA 8 byte UDP Header DATA 40 byte 8 byte UDP Header568 byte 528 byte (1433 1472) (1433 2000) (1473 2000) DATA DATA 1432 byte 1432 byte IPv4 stack で fragment (1 1432) (1 1432) 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header IPv6 Frag Hdr IPv6 Frag Hdr IPv4 Header IPv6 Frag Hdr IPv6 Frag Hdr 8 byte 8 byte 20 byte 8 byte 8 byte (offset 1232) (offset 0) (offset 1472) (offset 1232) (offset 0) IPv4 Header IPv4 Header 1280 byte 1280 byte DATA 20 byte DATA DATA 20 byte796 byte (offset 0) 528 byte 268 byte (offset 0) (1205 2000) (1473 2000) (1205 1472) 8 byte UDP Header 8 byte UDP Header DATA DATA 1204 byte 1204 byte IPv6 stack で fragment (1 1204) (1 1204)
    28. 28. IPv4 Header IPv4 Header Fragment いろいろ 20 byte 20 byte (offset 1472) (offset 0) 8 byte UDP Header DATA 1500 byte 528 byte (1473 2000) BR/CE で DATA BR/CE で 1472 byte (1 1472) reassemble 実施 reassemble 未実施 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header IPv4 Header IPv4 Header IPv4 Header IPv4 Header IPv4 Header 20 byte 20 byte 20 byte 20 byte 20 byte (offset 1432) (offset 0) (offset 1472) (offset 1432) (offset 0) DATA 1460 byte 1460 byte DATA 8 byte UDP Header DATA 40 byte 8 byte UDP Header568 byte 528 byte (1433 1472) (1433 2000) (1473 2000) DATA DATA 1432 byte 1432 byte (1 1432) (1 1432) 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header IPv6 Frag Hdr IPv6 Frag Hdr IPv4 Header IPv6 Frag Hdr IPv6 Frag Hdr 8 byte 8 byte 20 byte 8 byte 8 byte (offset 1232) (offset 0) (offset 1472) (offset 1232) (offset 0) IPv4 Header IPv4 Header 1280 byte 1280 byte DATA 20 byte DATA DATA 20 byte796 byte (offset 0) 528 byte 268 byte (offset 0) (1205 2000) (1473 2000) (1205 1472) 8 byte UDP Header 8 byte UDP Header DATA DATA 1204 byte 1204 byte (1 1204) (1 1204)
    29. 29. IPv4 Header IPv4 Header Fragment いろいろ 20 byte 20 byte (offset 1472) (offset 0) 8 byte UDP Header DATA 1500 byte 528 byte (1473 2000) DATA 1472 byte (1 1472) 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header IPv4 Header IPv4 Header IPv4 Header IPv4 Header IPv4 Header 20 byte 20 byte 20 byte 20 byte 20 byte (offset 1432) (offset 0) (offset 1472) (offset 1432) (offset 0) DATA 1460 byte 1460 byte DATA 8 byte UDP Header DATA 40 byte 8 byte UDP Header568 byte 528 byte (1433 1472) (1433 2000) (1473 2000) DATA DATA 1432 byte 1432 byte (1 1432) (1 1432) 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header 40 byte IPv6 Header IPv6 Frag Hdr IPv6 Frag Hdr IPv4 Header IPv6 Frag Hdr IPv6 Frag Hdr 8 byte 8 byte 20 byte 8 byte 8 byte (offset 1232) (offset 0) (offset 1472) (offset 1232) (offset 0) IPv4 Header IPv4 Header 1280 byte 1280 byte DATA 20 byte DATA DATA 20 byte796 byte (offset 0) 528 byte 268 byte (offset 0) (1205 2000) (1473 2000) (1205 1472) 8 byte UDP Header 8 byte UDP Header 1204 byte DATA (1 1204) ←これにしてます。 1204 byte DATA (1 1204)
    30. 30. Fragment いろいろ• なんで BR/CE で reassemble してるのか? ☞ IPv4 fragment packet の TCP/UDP/ICMP header を 含まない packet はそれだけでは PSID がわから ないので encapsulation できない(decapsulation 時も validation できない) ☞ TCP/UDP/ICMP header 付き packet の header を cache させる方法も考えられるけどめんどい ☞ IPv4 の reassemble は Linux kernel で提供されて いるのでそちらを利用 ☞ IPv6 の reassemble は Linux kernel の機能を簡単 に利用できなそうだったので full scratch で実装
    31. 31. Fragment いろいろ • なんで IPv6 stack で fragment してるのか? ☞ それがいちばん簡単だったから ☞ IPv6 の最小 MTU である 1280 に設定しているの で通らない可能性はないはずintmap_trans_forward_v4v6(struct sk_buff *skb, struct map *m, struct map_rule *mr){ ... dst = ip6_route_output(net, NULL, &fl6); dst_metric_set(dst, RTAX_MTU, 1280); ... skb_dst_set(skb, dst); ↑これだけ。 ... ip6_local_out(skb); ...}
    32. 32. Port restricted NAPT の実装 • ひとつの IPv4 address を複数の顧客で共有する場合 map interface に IPv4 address を設定するとマズい ☞ 例えば自分自身の address が 192.0.2.18 の状況 で通信したい相手の address も同じ 192.0.2.18 の場合 map interface に 192.0.2.18 が設定されて いると自分自身宛と勘違いしちゃいそう • でも map interface に IPv4 address がないと iptables の NAT 使えなそう • つうかそもそも Port restricted NAPT どうしよう ☞ なんかおもしろそうだし map interface に NAPT full scratch で実装しちゃえ
    33. 33. Port restricted NAPT の実装1 session につき 1 map_napt_node 構造体変数を allocate TCP の場合は FIN/RST を捕捉した時点で free UDP/ICMP の場合は timeout した時点で free struct map_napt_node struct hlist_node nn_hash_lup0 WAN 側の情報からの探索用 struct hlist_node nn_hash_lup1 LAN 側の情報からの探索用 struct hlist_node nn_hash_crat struct list_head nn_list WAN 側の情報 新しい node を作るときの重複チェック用 __be32 raddr 有効期限切れ node のチェック用 LAN 側の情報 __be32 laddrstruct map __be32 maddr : : __be16 rport CE 自身の情報struct hlist_head napt_hash_lup0[...] __be16 lportstruct hlist_head napt_hash_lup1[...] __be16 mportstruct hlist_head napt_hash_crat[...] __u8 proto struct list_head napt_list __u8 flags : : unsigned long last_used
    34. 34. Port restricted NAPT の実装 IPv4 dst addr 203.0.113.1 IPv4 dst addr 198.51.100.1 IPv4 src addr 192.0.2.18 IPv4 src addr 192.0.2.18 TCP dst port 80 TCP dst port 80 TCP src port 4928 TCP src port 4928 CE src port は dst addr で unique IPv4 dst addr 203.0.113.1 IPv4 dst addr 198.51.100.1 IPv4 src addr 192.168.1.11 IPv4 src addr 192.168.1.11 TCP dst port 80 TCP dst port 80 TCP src port 49152 TCP src port 49153 Host
    35. 35. MAP-T の Checksum 再計算 • MAP-T の checksum 再計算めちゃくちゃめんどい • ICMP Echo が TTL 切れとかで ICMP Error で帰ってく る場合;まず内側の IP header を Mapping Rule Table から address を求めて書き換えて checksum 再計算… src addr 192.0.2... src addr 2001:db8:... IPv4 hdr IPv6 hdr dst addr 198.51.100... dst addr 2001:db8:... type/code error type/code errorICMPv4 hdr ICMPv6 hdr ⇄ checksum 0x1665 checksum 0x33aa src addr 198.51.100... src addr 2001:db8:... IPv4 hdr IPv6 hdr dst addr 203.0.113... dst addr 2001:db8:... type/code echo type/code echoICMPv4 hdr ICMPv6 hdr checksum 0x821c checksum 0x5713
    36. 36. 今後のはなし• MAP-T 捨てたい… ☞ ていうか XFRM を使う方法に戻したい… ☞ IPv6 address を持つようになるので PMTUd が出 来るようになるはず ☞ IPv6 stack を local に上っていく場合は Linux kernel の IPv6 reassemble 機能も利用できるよう になるはず• IPv6 packet の最大 size を設定できるようにしたい ☞ 1280 byte hard coding はさすがに…?• IPv4 stack での fragment にも対応したほうが良い? ☞ ちょっと調べた感じではけっこうめんどそう…
    37. 37. 参考• MAP 対応 Vyatta(ASAMAP)仮置き場 ☞ http://enog.jp/~masakazu/vyatta/map/  • Mapping of Address and Port with Encapsulation (MAP)   ☞ http://tools.ietf.org/html/draft-ietf-softwire-map  • Mapping of Address and Port using Translation (MAP-T)   ☞ http://tools.ietf.org/html/draft-ietf-softwire-map-t  • Generic Packet Tunneling in IPv6 Specification  ☞ http://tools.ietf.org/html/rfc2473  • IP/ICMP Translation Algorithm   ☞ http://tools.ietf.org/html/rfc6145  

    ×