แม้จะทราบปัญหาเรื่อง IPv4 Address ที่ไม่เพียงพอถึงขั้นขาดแคลนมาเป็นเวลานานมาก แต่ก็ไม่ได้ศึกษา IPv6 เรื่องนี้อย่างจริงจัง
จนโดนลูกค้าสั่งให้คอนฟิก IPv6 บนเซิร์ฟเวอร์ให้หน่อย จึงต้องหาข้อมูล ศึกษาวิธีการคอนฟิก เลยนำมาแชร์ให้อ่านกัน
ในที่นี้จะแสดงวิธีคอนฟิกบน CentOS 6
ในบทความนี้จะใช้หมายเลข IPv6 Address 2001:db8::/32 ซึ่งเป็น prefix ที่ถูกจองไว้สำหรับแสดงเป็นตัวอย่างในเอกสาร (RFC 3849 : IPv6 Address Prefix Reserved for Documentation) หลังจากเข้าใจแล้ว หากคุณมี IPv6 Address จริงๆ ก็แทนที่คอนฟิกลงไปได้
IPv6 Address (unicast) ตัวเลขจะแบ่งออกเป็นสองส่วน
- 64-bit แรกจะเป็น network prefix ซึ่งจะรวม routing prefix และ subnet id ในที่นี้จะใช้ 2001:db8:a:b (a:b เป็นอะไรก็ได้)
- 64-bit หลังจะเป็น interface identifier จะใช้เป็นเลขระบุแต่ละเครื่อง โดยอาจใช้เป็น MAC Address ของพอร์ตแลน รับจาก DHCPv6 หรือจะกำหนดเอง ในที่นี้จะกำหนดเอง
เนื่องจากตัวเลข IPv6 Address มีขนาดยาวมาก มักจะนิยมพิมพ์แบบย่อ เช่นถ้ามีหลักไหนที่เป็น 0 ติดๆ กัน จะย่อเป็น ::
ตัวอย่างในบทความนี้จะใช้เป็นหมายเลข 2001:db8:a:b::1/64
- หมายเลขเต็มๆ คือ 2001:0db8:000a:000b:0000:0000:0000:0001
- /64 เป็นเหมือน subnet mask
- หากมีเครื่องอื่น ก็ลองคอนฟิกเป็น :2, :3, :4
ลองใช้คำสั่ง ifconfig เพื่อแสดงค่าคอนฟิก IP Address
[root@cent6-ipv6 ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 08:00:27:7A:55:88 inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe7a:5588/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:213 errors:0 dropped:0 overruns:0 frame:0 TX packets:140 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:25512 (24.9 KiB) TX bytes:22516 (21.9 KiB)
จะเห็นบรรทัดที่เขียนว่า inet6 addr: แล้วตามด้วยหมายเลข IPv6 Address ขึ้นต้นด้วย fe80 ตอนท้ายบรรทัดเขียนว่า Scope:Link
ถ้าสังเกตดูดีๆ จะเห็นว่าตอนท้ายของหมายเลข 7a:5588 จะเหมือนกับตอนท้ายของ HWaddr หรือ MAC Address ของพอร์ต 7A:55:88 เป็นเพราะว่าค่าหมายเลขนี้จะถูกคอนฟิกโดยอัตโนมัติ ด้วยการดึงค่าจาก MAC Address มาสร้างเป็น Scope:Link หรือ Link-local address
ลอง ping ดู
[root@cent6-ipv6 ~]# ping fe80::a00:27ff:fe7a:5588
ping: unknown host fe80::a00:27ff:fe7a:5588
ต้องใช้คำสั่ง ping6 เพื่อทดสอบกับ IPv6 Address
[root@cent6-ipv6 ~]# ping6 fe80::a00:27ff:fe7a:5588
connect: Invalid argument
ก็ยังไม่ได้ เนื่องจากหมายเลขนี้เป็นแบบ Link-local address ที่ kernel จะไม่รู้ว่าจะส่ง packet ออกทางไหน ต้องใส่ออปชั่น -I เพื่อระบุว่าออกทางพอร์ตไหน เช่น eth0
[root@cent6-ipv6 ~]# ping6 -I eth0 fe80::a00:27ff:fe7a:5588 PING fe80::a00:27ff:fe7a:5588(fe80::a00:27ff:fe7a:5588) from fe80::a00:27ff:fe7a:5588 eth0: 56 data bytes 64 bytes from fe80::a00:27ff:fe7a:5588: icmp_seq=1 ttl=64 time=0.027 ms 64 bytes from fe80::a00:27ff:fe7a:5588: icmp_seq=2 ttl=64 time=0.041 ms 64 bytes from fe80::a00:27ff:fe7a:5588: icmp_seq=3 ttl=64 time=0.041 ms ^C --- fe80::a00:27ff:fe7a:5588 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2094ms rtt min/avg/max/mdev = 0.027/0.036/0.041/0.008 ms
แต่หมายเลขนี้จะนำไปใช้จริงไม่ได้ เพราะเป็น Scope:Link หรือ Link-local address ที่ไม่สามารถ route ไปยัง network อื่นๆ ได้ (non-routable)
เราต้องคอนฟิกเพิ่มเติม
แก้ไขไฟล์ ifcfg-eth0
[root@cent6-ipv6 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=none HWADDR=08:00:27:7A:55:88 IPADDR=192.168.1.10 PREFIX=24 NAME="System eth0" USERCTL=no IPV6INIT=yes IPV6ADDR=2001:db8:a:b::1/64
ดีฟอลต์จากการติดตั้ง CentOS 6 ออปชั่น IPV6INIT จะถูกตั้งเป็น no แก้ไขให้เป็น yes แล้วก็เพิ่มบรรทัด IPV6ADDR ใส่หมายเลข IPv6 Address ลงไป
ใช้คำสั่ง ifup eth0 หรือ service network restart เพื่อให้คอนฟิกที่แก้ไขมีผล
[root@cent6-55w ~]# ifup eth0
ใช้คำสั่ง ifconfig ดูค่าคอนฟิกหลังการแก้ไข
[root@cent6-ipv6 ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 08:00:27:7A:55:88
inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: 2001:db8:a:b::1/64 Scope:Global
inet6 addr: fe80::a00:27ff:fe7a:5588/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1419 errors:0 dropped:0 overruns:0 frame:0
TX packets:762 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:134250 (131.1 KiB) TX bytes:118976 (116.1 KiB)
ค่า address ที่เพิ่มมาใหม่จะเป็น Scope:Global
ลอง ping6 กับหมายเลข IPv6 ที่ใส่เพิ่มเข้าไปใหม่
[root@cent6-ipv6 ~]# ping6 2001:db8:a:b::1 PING 2001:db8:a:b::1(2001:db8:a:b::1) 56 data bytes 64 bytes from 2001:db8:a:b::1: icmp_seq=1 ttl=64 time=0.022 ms 64 bytes from 2001:db8:a:b::1: icmp_seq=2 ttl=64 time=0.070 ms 64 bytes from 2001:db8:a:b::1: icmp_seq=3 ttl=64 time=0.040 ms ^C --- 2001:db8:a:b::1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2231ms rtt min/avg/max/mdev = 0.022/0.044/0.070/0.019 ms
ทดลองใช้เว็บผ่าน IPv6
หมายเหตุ เนื่องจากเครื่องหมาย : มีความหมายในช่อง web address หากต้องการใช้ IPv6 Address ต้องมีเครื่องหมายสี่เหลี่ยนครอบ [] เช่นตัวอย่าง
[user@cent6-ipv6 ~]$ wget 'http://[2001:db8:a:b::1]/'
ตัวอย่าง log ไฟล์ที่เกิดขึ้นในเว็บเซิร์ฟเวอร์
[root@cent6-ipv6 ~]# tail /var/log/httpd/access_log
2001:db8:a:b::1 - - [13/Dec/2014:22:08:23 +0700] "GET / HTTP/1.0" 200 - "-" "Wget/1.12 (linux-gnu)"