คอนฟิก IPv6 บน CentOS 6

แม้จะทราบปัญหาเรื่อง 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)"

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.