การเชื่อมต่อ IPv6 ผ่าน 6to4 tunnel บน Debian


ไม่ได้เขียนซะนาน เริ่มจากการรวบรวมเรื่องเก่าๆ ที่เคยเขียนมา รวมไว้ก่อน เรื่องใหม่รอคิวไปก่อนครับ
ความจริงผมต่อ IPv6 ไว้นานมากแล้ว แต่ไม่ได้เขียนวิธีการไว้ จนจะลืมซะแล้ว เลยเอามาเขียนไว้ซะหน่อย

การเชื่อมต่อ IPv6 มีได้หลากหลายวิธีมากครับ วิธีนึงที่นิยม คือ 6to4 relay เป็นการสร้าง tunnel หรือท่อ โดยการ map IPv4 เดิมที่มี
เข้าเป็น IPv6 prefix สำหรับใช้งานได้ ซึ่ง แค่ Prefix เดียว ก็เหลือแหล่ ใช้ได้ทั้งองค์กรเลยทีเดียวครับ
ซึ่ง ADSL สมัยนี้ ก็แจก IPv4 เป็น public IP ให้เราอยู่แล้ว เราก็สามารถนำมาใช้งานได้ครับ
การสร้างท่อนี้ ที่จริง ก็เป็นการส่งโดยการ encapsulate หรือให้ IPv4 ส่งข้อมูล IPv6 นั่นเอง

  1. การเชื่อมต่อในที่นี้ เราจะทำการ relay ไปยังที่เนคเทค ครับ เพราะเป็น backbone นึงที่ใหญ่ IP ที่จะ relay ของเนคเทคคือ 203.185.129.129 ซึ่ง default ของการทำ tunnel จะวิ่งไป 192.88.99.1 ซึ่งจะ route ไปที่ backbone ที่รับการ relay อัตโนมัติ
    1. [sekz@Sekz-Laptop ~]$ traceroute 192.88.99.1
    2.  1  router (192.168.1.77)  1.917 ms  2.009 ms  2.156 ms
    3.  2  10.26.0.1 (10.26.0.1)  15.320 ms  16.081 ms  16.516 ms
    4.  3  10.92.228.89 (10.92.228.89)  26.021 ms  32.026 ms  27.372 ms
    5.  4  203-144-128-22.static.asianet.co.th (203.144.128.22)  28.609 ms 119-46-185-214.static.asianet.co.th (119.46.185.214)  28.710 ms 203-144-128-10.static.asianet.co.th (203.144.128.10)  29.388 ms
    6.  5  119-46-170-13.static.asianet.co.th (119.46.170.13)  27.234 ms  27.389 ms  27.507 ms
    7.  6  61-91-210-225.static.asianet.co.th (61.91.210.225)  29.212 ms  27.722 ms  27.704 ms
    8.  7  61-91-213-35.static.asianet.co.th (61.91.213.35)  25.850 ms  16.848 ms  21.126 ms
    9.  8  61-91-213-81.static.asianet.co.th (61.91.213.81)  19.388 ms  19.689 ms  21.669 ms
    10.  9  TIG-Net242-49.trueintergateway.com (113.21.242.49)  25.711 ms TIG-Net242-37.trueintergateway.com (113.21.242.37)  29.847 ms TIG-Net242-49.trueintergateway.com (113.21.242.49)  26.145 ms
    11. 10  SG-ICR-GS1-26-206.trueintergateway.com (122.144.26.206)  64.416 ms  64.440 ms  65.419 ms
    12. 11  TIG-Net241-190.trueintergateway.com (113.21.241.190)  62.328 ms  62.471 ms  63.207 ms
    13. 12  10gigabitethernet1-1.core1.sin1.he.net (202.79.197.81)  65.022 ms  65.108 ms  65.094 ms
    14. 13  192.88.99.1 (192.88.99.1)  54.604 ms  54.364 ms  55.548 ms

    รายละเอียด 6to4 Tunnel โดยเนคเทค อยู่ที่ http://www.ipv6.nectec.or.th/6to4relayservice.php

  2. จากการติดตั้ง http://www.falsyana.com/2011/linux/ipv6-at-home-3/ ก่อนอื่น เราต้องทราบก่อนว่า IPv6 Prefix ของเราเป็นอะไร ใน debian มี tool ช่วยคำนวณครับ ชื่อ ipv6calc
    1. [sekz@Sekz-Laptop ~] #  aptitude install ipv6calc
    2. [sekz@Sekz-Laptop ~] # # ipv6calc --ipv4_to_6to4addr <PUBLIC_IPv4_ADDR>
  3. จะได้ค่า prefix ออกมา เช่น 8.8.8.8 จะได้ 2002:808:808:: เป็นต้น อันนี้ขอเรียกว่า 6to4_PREFIX นะครับ
    จากนั้นสร้าง tunnel
    1. # /sbin/ip tunnel add tun6to4 mode sit ttl 64 remote any local <YOUR_PUBLIC_IP>
    2. # /sbin/ip link set dev tun6to4 up
    3. # /sbin/ip -6 addr add <6to4_PREFIX>/16 dev tun6to4
    4. # /sbin/ip -6 route add 2002::/3 via ::203.185.129.129 dev tun6to4 metric 1
    5. # /sbin/ifconfig
    6. tun6to4   Link encap:IPv6-in-IPv4  
    7.           inet6 addr: <YOUR IPv6 PREFIX>::1/64 Scope:Global
    8.           UP RUNNING NOARP  MTU:1480  Metric:1
    9.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    10.           TX packets:0 errors:168 dropped:0 overruns:0 carrier:168
    11.           collisions:0 txqueuelen:0
    12.           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

    จากนั้น ตั้งค่า interface eth1 ซึ่งสามารถคำนวณได้จาก ipv6calc โดยถ้าหากอ้างอิงสคริป จะง่ายกว่าครับ
    http://www.anyweb.co.nz/tutorial/Linux6to4Host

    1. #!/bin/bash
    2.  
    3. SLA_INTF=${3:-4660} # 1234 in HEX
    4. INTF_PFX=${5:-64}
    5.         # remove exist
    6.         CUR_ETH0_ADDR=`/bin/ip addr show eth0 | grep inet6 | grep global | awk '{print $2}'`
    7.  
    8.         # IPv6 ready?
    9.         [ -f /proc/net/if_inet6 ] || exit 0
    10.  
    11.         # Grab the device of the default route (may be
    12.         # multiple -> CUR_DV is an array)
    13.         CUR_DV=(`ip -4 route list | awk '/^default / { print $0 }' | \
    14.                                     sed 's/.* dev \([^ ]\+\).*$/\1/'`)
    15.  
    16.         # Is there any device? Or no default route at all??
    17.         if [ -z ${CUR_DV} ]; then
    18.             echo "No default route. Cannot determine IPv4 address to use"
    19.             exit 0
    20.         fi
    21.  
    22.         # We simply take the device from the first default route
    23.         CUR_IP=(`ip -4 addr show ${CUR_DV} | awk '/inet / { print $2 }' | \
    24.                sed -e 's/^\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*$/\1/'`)
    25.          
    26.         IPV6_ADDR=$(printf "2002:%02x%02x:%02x%02x:%04x::" \
    27.                   $(echo "${CUR_IP} ${SLA_INTF}" | tr '.' ' '))
    28.  
    29.         #calculation for eth0
    30.         ETH0_HWADDR=`ifconfig | grep eth0 | awk '{print $5}'`
    31.  
    32.         NEW_ETH0_ADDR=`/usr/bin/ipv6calc --action prefixmac2ipv6 --in prefix+mac --out ipv6 $IPV6_ADDR/64 $ETH0_HWADDR`
    33.  
    34.         # remove exist
    35.         CUR_ETH0_ADDR=`/bin/ip addr show eth0 | grep inet6 | grep global | awk '{print $2}'`
    36.         if [ "$CUR_ETH0_ADDR" != "" ]; then
    37.                 /bin/ip -6 addr del $CUR_ETH0_ADDR dev eth0
    38.         fi
    39.         if [ "$NEW_ETH0_ADDR" != "$CUR_ETH0_ADDR" ]; then
    40.                 /bin/ip -6 addr add $NEW_ETH0_ADDR dev eth0
    41.         fi
  4. เพิ่มการ forward ระหว่าง interface แก้ไขไฟล์ /etc/rc.local เพิ่มบรรทัด
    1. # echo "1" > /proc/sys/net/ipv4/ip_forward
    2. # echo "1"> /proc/sys/net/ipv6/conf/all/forwarding
  5. ติดตั้ง Router Advertisement Daemon สำหรับทำตัวเป็น router ประกาศ prefix ของเครือข่าย
  6. # apt-get install radvd
    แก้ไขไฟล์ /etc/radvd.conf

    1. interface eth0
    2. {
    3.         AdvSendAdvert on;
    4.         MinRtrAdvInterval 3;
    5.         MaxRtrAdvInterval 10;
    6.         AdvDefaultPreference low;
    7.         AdvHomeAgentFlag off;
    8.         prefix 0:0:0:1234::/64
    9.         {
    10.                 AdvOnLink on;
    11.                 AdvAutonomous on;
    12.                 AdvRouterAddr on;
    13.                 Base6to4Interface eth1;
    14.                 AdvPreferredLifetime 120;
    15.                 AdvValidLifetime 300;
    16.         };
    17. };

    จากนั้น เครื่องคุณ ถ้าสนับสนุน ipv6 อยู่แล้ว ก็จะได้รับ router advertisement ตั้งค่า IPv6 ของแต่ละเครื่องอัตโนมัติ และเป็น unique IP (Global Address) ที่สามารถเชื่อมต่อกันได้แบบ end to end เลยทีเดียว