2/23/2554

OpenVPN เมื่อแอปพลิเคชั่นจะตามคุณไปทุกที่



"ใน โลกที่ปกคลุมไปด้วยอินเตอร์เนตบรอดแบนด์ VPN หรือ Virtual Private Network กำลังจะทำให้แอปพลิเคชั่นในสำนักงานสามารถติดตามคุณไปได้ทุกที่ OpenVPN คือโซลูชั่นที่จะทำให้ฝันของคุณเป็นจริง"
ในยุคก่อนที่จะมีอินเตอร์เนตความเร็วสูง การใช้ VPN ( Virtual Private Network ) ผ่านเครือข่ายอินเตอร์เนตเพื่อเข้ามาใช้งานภายในองค์กรคงเป็นเรื่องที่ต้อง ทำใจพอสมควร ยิ่งถ้าต้องติดต่ออินเตอร์เนตโดยผ่านโมเด็มแบบ 56K ด้วยแล้ว การใช้งานที่ต้องการใช้แบนด์วิดสูงๆ แทบเป็นไปไม่ได้เลย แต่ในยุคปัจจุบันอินเตอร์เนตความเร็วสูงโดยเฉพาะ ADSL ที่มีการพัฒนาอย่างต่อเนื่อง และในอนาคตจะมี ADSL2 และ ADSL2+ ซึ่งความเร็วจะสูงกว่าปัจจุบันอีกมาก ( ADSL2+ มีความเร็วสูงสุดถึง 24 Mbps ) ประกอบกับค่าบริการที่ถูกลง ทำให้ลดช่องว่างระหว่างการนั่งทำงานภายในออฟฟิศ กับการเข้ามาใช้งานจากระยะไกลลงได้ โดยเฉพาะอย่างยิ่ง การใช้งานแอพพลิเคชันที่ไม่ได้ออกแบบมาเพื่อให้ทำงานผ่านอินเตอร์เนต VPN นับว่าเป็นหนทางหนึ่งที่จะช่วยแก้ปัญหานี้ได้ ในโลกของซอฟต์แวร์เสรีมีซอฟต์แวร์ VPN รอให้ท่านผู้อ่านนำไปประยุกต์ใช้ซึ่งแบ่งได้เป็น 3 กลุ่มดังนี้
  1. VPN แบบ pptp ซอฟต์แวร์ในกลุ่มนี้ได้แก่ Poptop เป็น VPN Server บนลีนุกซ์ที่ใช้
    โปรโตคอล pptp ( Point-to-Point Tunneling Protocol ) ในการติดต่อกัน ซึ่งนับได้ว่า Poptop เป็น VPN Server ซึ่งมีความเข้ากันได้ดีกับไคลเอนต์บนวินโดวส์ โดยสามารถใช้ VPN Client ของวินโดวส์ได้ทันที
  2. VPN แบบ IPSec ซอฟต์แวร์ในกลุ่มนี้ได้แก่ FreeS/WAN และ Openswan VPN บน
    โปรโตคอล IPSec ( IP Security Protocol ) ถือได้ว่าเป็น VPN ที่ได้รับความนิยมไม่ว่าจะเป็น ซอฟต์แวร์แบบเปิดเผยรหัสหรือไม่เปิดเผยรหัส เนื่องจากว่ามีความปลอดภัยสูง แต่ด้วยความซับซ้อนทำให้การติดตั้งค่อนข้างลำบากโดยเฉพาะการติดตั้ง IPSec ผ่านระบบ NAT ( Network Address Translation ) นอกจากนี้การติดตั้ง VPN แบบ IPSec บนลีนุกซ์จำเป็นต้องมีการ Patch Kernel ด้วย
  3. VPN แบบ tun/tap ได้แก่ OpenVPN ,Vtune ,tinc และ CIPE โดยในบทความครั้งนี้จะกล่าวถึง OpenVPN โดยเฉพาะ ซึ่งเป็น VPN Server ที่ทำงานบนโปรโตคอล SSL ( Secure Socket Layer ) การติดตั้งเหมือนการใช้งานแอพพลิเคชันทั่วไปที่ทำงานร่วมกับ SSL ซึ่งมีผลให้การติดตั้งไม่ยุ่งยากและที่สำคัญสามารถวิ่งได้หลายแพลตฟอร์มไม่ ว่าจะเป็น Linux, Windows 2000/XP (หรือสูงกว่า), OpenBSD, FreeBSD, NetBSD, Mac OS X, และ Solaris
ท่านสามารถดูตารางเปรียบเทียบ VPN Server ทั้ง 3 กลุ่มได้ที่
http://www.math.ucla.edu/~jimc/documents/vpn.html สำหรับบทความนี้จะพูดถึงการใช้งาน OpenVPN โดยให้ VPN Server ทำงานบนลีนุกซ์และใช้ VPN Client ซึ่งทำงานอยู่บนวินโดวส์
นิยามศัพท์ของ VPN

TUN    ( Virtual Point-to-Point network device ) ไดร์เวอร์ TUN ผูกติดกับ Kernel ของลีนุกซ์ซึ่งพร้อมใช้งานได้ ทันทีใน Fedora Core แต่ถ้าเป็นตระกูล RedHat Clone จะไม่ได้คอมไพล์ TUN มาให้ จึงต้องคอมไพล์ Kernel ใหม่ TUN device มีหน้าที่สร้างอุโมงค์ไอพี ( IP tunneling ) แอพพลิเคชันจะทำการอ่านและเขียน IP Frame ผ่าน TUN

ข้อดี สำหรับการทำงานผ่าน TUN
  • ทำงานได้รวดเร็ว

    ข้อเสีย สำหรับการทำงานผ่าน TUN

  • สนับสนุน IP Frame เท่านั้น

  • VPN Client ที่ติดต่อเข้ามาจะอยู่คนละ Subnet Mask กับ VPN Server TAP ( Virtual Ethernet network device ) ทำหน้าที่คล้ายกับ TUN เพียงแต่แอปพลิเคชันจะทำหน้าที่อ่านและเขียน Ethernet Frame ผ่าน TAP device

    ข้อดี สำหรับการทำงานผ่าน TAP

  • สนับสนุน Ethernet Frame จึงสามารถใช้โปรโตคอลอื่นๆ นอกเหนือจากไอพีได้ เช่น IPX

  • VPN Client ที่ติดต่อเข้ามาจะมี Subnet Mask เดียวกับ VPN Server

    ข้อเสีย สำหรับการทำงานผ่าน TAP

  • ทำงานช้ากว่า TUN

  • Passive Attack คือ ผู้แอบดูข้อมูลระหว่างเครื่องคอมพิวเตอร์ 2 เครื่องที่กำลังติดต่อกัน วิธีการป้องกันคือ การเข้ารหัสข้อมูล
    Active Attack คือ ผู้ที่มีความสามารถเข้ามาแทรก หรือเพิ่มเติมแก้ไขข้อมูลระหว่างทางที่เครื่องคอมพิวเตอร์กำลังติดต่อกัน วิธีการป้องกันคือ พิสูจน์ตัวตน ( authentication ) OpenVPN ใช้ HMAC ในการพิสูจน์ตัวตนในการแลกเปลี่ยนแพ็กเก็ต
    แนวคิดของ OpenVPN OpenVPN พัฒนาโดย James Yonan ซึ่งมีแนวคิดการออกแบบให้สามารถใช้งานได้หลากหลายแพล็ตฟอร์ม การติดตั้งต้องสามารถทำได้ง่าย ปลอดภัย รวมถึงความรวดเร็วทำงาน ดังนั้น OpenVPN จึงนำแนวคิดเหล่านี้ถ่ายทอดออกมาเป็นในรูปแบบการส่งข้อมูลที่เข้ารหัสแล้ว ผ่านโปรโตคอล UDP ( User Datagram Protocol ) ซึ่ง James Yonan ได้บอกว่าการนำข้อมูลที่เข้ารหัส ห่อหุ้มด้วย IP Frame และวิ่งไปบนโปรโตคอล UDP เป็นทางเลือกที่ดีที่สุด ( ในกรณีที่ต้องการให้ IP Frame วิ่งบน TCP ก็สามารถทำได้แต่ค่าปรกติที่กำหนดไว้คือ UDP ) ดังรูปที่ 1


    รูปที่ 1 การส่งข้อมูลผ่าน OpenVPN โดยส่งผ่านโพรโตคอลผ่าน UDP


    หมายเหตุ :
    ท่านสามารถอ่านเหตุผลการทำ VPN ซึ่งส่งข้อมูลผ่าน tun/tap วิ่งไปบน
    โปรโตคอล UDP ได้ที่

    http://sites.inka.de/bigred/devel/tcp-tcp.html
    http://openvpn.sourceforge.net/papers/BLUG-talk/

    OpenVPN รุ่นก่อนหน้าเวอร์ชัน 2.0 จะต้องทำการติดตั้งอินเตอร์เฟส TUN/TAP ที่ VPN Server ตามจำนวนที่ VPN Client ที่ติดต่อเข้ามา เช่น มี VPN Client จำนวน10 เครื่องที่ต้องการติดต่อกับเครื่อง VPN Server จะต้องติดตั้ง TUN/TAP ไว้ 10 อินเตอร์เฟส (TUN0/TAP0-9) บนเครื่อง VPN Server แต่ OpenVPN 2.0 ขึ้นไป สามารถใช้งานหลาย VPN Client ผ่านอินเตอร์เฟส TUN/TAP เพียงอินเตอร์เฟสเดียวได้ ดังนั้นในบทความนี้จะพูดถึง OpenVPN 2.0 ขึ้นไป คุณสมบัติของ OpenVPN
  • ทำอุโมงค์แบบ IP Frame และแบบ Ethernet Frame ได้

  • มีความปลอดภัยในระดับป้องกันทั้ง Passive Attack และ Active Attack

  • ทำ chroot environment และสามารถวิ่งในสิทธิ์ของยูสเซอร์ธรรมดาได้ หลังจาก Initialize สำเร็จแล้ว

  • ทำ Load Balance กรณีที่มี VPN เซิร์ฟเวอร์หลายตัว

  • สนับสนุนการเข้ารหัสในรูปแบบ Pre-shared Keys และ Certficated Keys

  • สนับสนุนการทำงานในรูปแบบ HMAC Authentication

  • สนับสนุนการบีบอัดข้อมูลเพื่อลดปริมาณการจราจรบนเครือข่าย

  • ทำ DHCP เพื่อแจกจ่ายไปยัง VPC ไคลเอนต์ ไม่ว่าจะเป็นการกำหนด route, DNS, WINS ซึ่งเหมาะกับการใช้งานแบบ road-warrior

  • ทำอุโมงค์ผ่าน NAT ได้

  • ไม่ต้องแก้ไข kernel โดยปกติ kernel ของลีนุกซ์จะสนับสนุนการใช้งาน tun/tap อยู่แล้ว

  • ใช้ได้หลากหลายแพล็ตฟอร์มดังที่ได้กล่าวไปแล้วข้างต้น

  • OpenVPN เป็น GPL



  • ผังเน็ตเวิร์กตัวอย่างสำหรับการติดตั้ง VPN





    รูปที่ 2 ผังเน็ตเวิร์กตัวอย่างสำหรับการทดสอบ OpenVPN


    ข้อมูลเพิ่มเติมจากเน็ตเวิร์กตัวอย่าง


    VPN ServerVPN Client
    Local Address 192.168.0.254From VPN Server
    Tunnel Endpoint192.168.100.1192.168.100.2
    OpenVPN Gateway (Router)DHCP From ISPDHCP From ISP

    เตรียมแพกเกจก่อนการติดตั้ง
    แหล่งที่มาของซอฟต์แวร์ OpenVPN คือ http://openvpn.sourceforge.net ไปที่เมนู Download จะพบไฟล์ 3 ไฟล์ดังนี้
  • Windows Installer: openvpn-2.0_rc1-install.exe

  • Source (Tarball): openvpn-2.0_rc1.tar.gz

  • Source (Zip): openvpn-2.0_rc1.zip

  • ให้ดาวน์โหลด openvpn-2.0_rc1.tar.gz เพื่อที่จะทำ VPN Server ( บนเครื่องลีนุกซ์ ) และ openvpn-2.0_rc1-install.exe สำหรับ VPN client ( บนเครื่องวินโดวส์ ) กรณีที่ต้องการใช้การบีบอัดข้อมูลเพื่อความรวดเร็วในการทำงานต้องเตรี ยมแพกเกจ lzo ด้วย สามารถดาวน์โหลดได้ที่ http://dag.wieers.com/packages/lzo/ โดยให้เลือกไฟล์ rpm ให้เหมาะสมกับระบบปฏิบัติการของท่าน ในกรณีต้องการใช้งานในแบบ GUI ผ่าน VPN Client ท่านสามารถดาวน์ VPN GUI ได้ที่ http://www.nilings.se/openvpn/download.htmlโดยเลือกไฟล์ openvpn-gui-1.0.exe การติดตั้ง VPN Server บนลีนุกซ์

  • ติดตั้งแพกเกจ
    1. ติดตั้ง lzo ด้วยคำสั่ง rpm -i lzo-1.08-3.1.xxx.rpm
    2. ติดตั้ง openvpn ด้วยคำสั่ง rpm -tb openvpn-2.0_rc1.tar.gz จะได้แพกเกจ openvpn-2.0_rc1-1.rpm
    3. ติดตั้ง openvpn อีกครั้งด้วยคำสั่ง rpm -i openvpn-2.0_rc1-1.rpm

  • สร้างคีย์เพื่อทำ SSL
    1. เปลี่ยนไดเรกทอรีไปที่ /usr/share/openvpn/easy-rsa
    2. สร้างค่าตัวแปรโดยการเรียก . vars
    3. ลบข้อมูลเดิมด้วยคำสั่ง ./clean-all
    4. สร้าง Certificate Authority (CA) ด้วยคำสั่ง ./build-ca ( ตอบคำถามการสร้าง CA )
    5. สร้างกุญแจสำหรับเครื่อง VPN Server ด้วยคำสั่ง ./build-key server (ตอบคำถามตามความเหมาะสมสำหรับการสร้างกุญแจ)
    6. สร้างกุญแจสำหรับเครื่อง VPN Client ด้วยคำสั่ง ./build-key client (ตอบคำถามตามความเหมาะสมสำหรับการสร้างกุญแจ)
    7. สร้างคีย์ Diffie-hellman ด้วยคำสั่ง ./build-dh
    8. นำคีย์ที่ได้จากการสร้างคือ ca.crt, server.key, server.crt, dh1024.pem ไปไว้ที่ /etc/openvpn
    9. กรณีต้องการใช้งาน auth-pam.pl ให้ทำสำเนาจาก /usr/share/openvpn/sample-scripts/auth-pam.pl ไปที่ /etc/openvpn


  • สร้างไฟล์ /etc/openvpn/server.conf
    port 1194
    dev tun
    #dev tap

    tls-server

    dh dh1024.pem
    ca ca.crt
    cert server.crt
    key server.key

    auth-user-pass-verify ./auth-pam.pl via-file
    #client-disconnect ./logoff.sh

    #up ./openvpn.up

    mode server
    duplicate-cn
    ifconfig 192.168.100.1 192.168.100.2 #(tun)
    #ifconfig 192.168.100.1 255.255.255.0 #(tap)

    ifconfig-pool 192.168.100.100 192.168.100.200 # (tun)IP range for openvpn client
    #ifconfig-pool 192.168.100.100 192.168.100.200 255.255.255.0 # (tap)IP range fomtu-test
    tun-mtu 1500
    tun-mtu-extra 32
    mssfix 1450
    ping 10
    ping-restart 120

    push "ping 10"
    push "ping-restart 60"

    push "dhcp-option DOMAIN ccm.com"    # push the DNS domain suffix
    push "dhcp-option DNS 192.168.0.254"     # push DNS entries to openvpn client
    push "dhcp-option WINS 192.168.0.254"    # push DNS entries to openvpn client
    push "route 192.168.0.0 255.255.255.0" # (tun)add route to to protected network
    push "route 192.168.100.1" # (tun)add route to to protected network
    #push "route 192.168.0.0 255.255.255.0 192.168.100.1" # (tap)add route to to pro tected network
    ;user nobody
    ;group nobody
    comp-lzo
    status-version 2
    status openvpn-status.log
    verb 3

    หมายเหตุ ไฟล์ server.conf สามารถดูตัวอย่างพร้อมคำอธิบายได้ที่ไดเรกทอรี
    /usr/share/openvpn/sample-config-files จากตัวอย่างไฟล์ server.conf ข้างต้นจะเห็นเครื่องหมายคอมเมนต์ของการใช้งานผ่าน TAP ในกรณีผู้อ่านต้องการใช้ VPN ผ่าน TAP ให้ทำเครื่องหมายคอมเมนต์ที่ TUN และนำเครื่องหมายคอมเมนต์หน้าบรรทัด TAP ออก





  • สั่งให้ openvpn ทำงานด้วยคำสั่ง service openvpn start ถ้าระบบพร้อมที่จะทำงานผู้อ่านควรตรวจสอบด้วยคำสั่งเหล่านี้ก่อนที่เริ่มติด ตั้ง VPN Client
  • ใช้คำสั่ง ifconfig จะพบ tun device tun0     Link encap:Point-to-Point Protocol
    inet addr:192.168.100.1 P-t-P:192.168.100.2 Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
    RX packets:689 errors:0 dropped:0 overruns:0 frame:0
    TX packets:735 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:100
    RX bytes:87131 (85.0 Kb) TX bytes:105585 (103.1 Kb)



  • ใช้คำสั่ง ifconfig จะพบ tap device (กรณีใช้ tap) tap0     Link encap:Ethernet HWaddr 00:FF:30:23:39:94
    inet addr:192.168.100.1 Bcast:192.168.100.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:1293 errors:0 dropped:0 overruns:0 frame:0
    TX packets:1355 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:100
    RX bytes:161389 (157.6 Kb) TX bytes:468689 (457.7 Kb)



  • ใช้คำสั่ง netstat -na | grep 1194 udp      0      0 0.0.0.0:1194       0.0.0.0:*



  • กรณีที่ระบบของท่านมีไฟล์วอลล์กรุณาให้ไฟร์วอลล์ของท่านเปิดรับ UDP Port 1194 และเปิดรับแพกเก็ตที่มาจากอุปกรณ์ TUN หรือ TAP ด้วย และในกรณีที่ต้องการใช้งานผ่าน Samba อย่าลืมกำหนดให้ Samba รับไอพีแอดเดรสของ VPN Client ด้วย สำหรับตัวอย่างการเปิดไฟร์วอลล์เพื่ออนุญาตการใช้งาน OpenVPN สามารถดูได้ดังนี้

  • http://openvpn.sourceforge.net/howto.html ( กรณีใช้ Iptables )

  • http://www.shorewall.net/OPENVPN.html ( กรณีใช้ Shorewall )



  • การติดตั้ง VPN Client บนวินโดวส์

  • ติดตั้งโปรแกรม
    1. openvpn-2.0_rc1-install.exe
    2. openvpn-gui-1.0-beta26.exe ( เป็นไฟล์เดี่ยวๆ ไม่ต้องติดตั้ง สามารถเรียกใช้งานได้เลย )


  • หลังจากติดตั้งโปรแกรมเรียบร้อยเราจะได้ Local Connection ที่เป็น TAP-Win32 Adapter สามารถตรวจสอบได้ที่ Network Connections ดังรูปที่ 3



    รูปที่ 3 TAP Adapter ถูกสร้างขึ้นหลังจากติดตั้ง OpenVPN


    ในกรณีที่ติดตั้งแล้วยังไม่ได้ TAP-Win32 Adapter ให้ไปที่เมนู /Start/Openvpn/Add a new TAP-Win32 virtual ethernet adapter


  • สร้างคีย์เพื่อทำ SSL เราได้มีการสร้างคีย์ไว้ในช่วงของการติดตั้ง VPN Server ให้ทำการสำเนาไฟล์ที่เกี่ยวข้อง 3 ไฟล์มายังผู้ใช้ VPN Client คือ ca.crt, client.crt, client.key หลังจากนั้นให้นำคีย์ทั้ง 3 ไปไว้ที่ไดเรกทอรี \Program Files\OpenVPN\config

  • สร้างไฟล์ client.ovpn ไฟล์นี้จะคล้ายกับไฟล์คอนฟิกเกอเรชันที่อยู่บนเครื่องเซิร์ฟเวอร์ แต่ถ้าวิ่งอยู่บนวินโดวส์เราจะใช้นามสกุลเป็น ovpn ซึ่งเราจะต้องกำหนดดังนี้

    #dev tap
    dev tun
    port 1194

    remote <ชื่อของ VPN Server หรือจะใช้เป็นไอพีแอดเดรสก็ได้>

    tls-client
    auth-user-pass

    ca ca.crt
    cert client.crt
    key client.key

    mtu-test
    tun-mtu 1500
    tun-mtu-extra 32
    mssfix 1450
    pull

    comp-lzo
    verb 4



  • สั่งให้ OpenVPN ทำงานด้วยการคลิกขวาที่ไฟล์ client.ovpn เลือก Start OpenVPN on this config file หรือจะใช้ openvpn-gui ให้ดับเบิ้ลคลิกที่ openvpn-gui หลังจากนั้นจะปรากฏ openvpn-gui เป็น Tray Icon อยู่ด้านล่างให้คลิกขวาเลือก Connect เพื่อทำการเชื่อมต่อกับ VPN Server ที่เราได้กำหนดในไฟล์ client.ovpn เมื่อเชื่อมต่อเรียบร้อย open-gui ที่ Tray Icon จะมีสีเขียว หลังจากนั้นให้ทดสอบการทำงานผ่าน VPN ได้ตามต้องการ จากนั้นเรามาตรวจสอบค่าของของการเชื่อมต่อของ Local Area Connection 4 จะปรากฏข้อมูลดังรูปที่ 4 และรูปที่ 5



    รูปที่ 4 ข้อมูล TAP Adapter หลังจากเชื่อมต่อแบบ TUN




    รูปที่ 5 ข้อมูล TAP Adapter หลังจากเชื่อมต่อแบบ TAP


    นำ VPN ไปประยุกต์ใช้
    OpenVPN เป็น VPN ที่มีความสามารถค่อนข้างครบครันในระดับหนึ่ง ไม่ว่าจะเป็นเรื่องความง่ายในการใช้งาน ระบบความปลอดภัย การใช้งานได้หลากหลายแพลตฟอร์ม ประกอบกับเอกสารที่มีมากมายซึ่งหาได้จากเว็บไซต์ของ OpenVPN ทำให้ผู้ที่จะเริ่มต้นการลงระบบ VPN คงเป็นเรื่องไม่ยากนัก ตัวผู้เขียนหลังจากทดสอบการใช้งานผ่าน Windows Explorer พบว่ามีความเร็วในระดับที่น่าพอใจทั้งในรูปแบบการติดต่อผ่าน TUN และ TAP หลังจากนั้นลองทดสอบเรียกไฟล์ Northwind.mdb ซึ่งมีขนาด 2 MB ด้วยโปรแกรม MS Access ใช้เวลาประมาณ 5 วินาที ( บน ADSL ความเร็ว 1 Mbps ) สำหรับท่านที่มีอินเตอร์เนตความเร็วสูงกว่านี้ ( ประมาณ 2 MB ขึ้นไป ) ลองทดสอบกับแอพพลิเคชันที่เขียนในรูปแบบ Client/Server อาจทำให้แอพลิเคชันจากเดิมที่สามารถใช้งานภายเพียงแค่ในออฟฟิศ เปลี่ยนมาใช้งานผ่าน VPN ซึ่งมีความปลอดภัย โดยที่ท่านไม่จำเป็นต้องไปเขียนแอพพลิเคชันใหม่เพื่อวิ่งบนอินเตอร์เนต

    แหล่งข้องมูลอ้างอิง
    http://openvpn.sourceforge.net/howto.html
    http://openvpn.sourceforge.net/papers/openvpn-101.pdf
    http://www.math.ucla.edu/~jimc/documents/vpn.html
    http://www.linuxjournal/article/7949
    http://www.sans.org/rr/papers/20/1459.pdf
    http://fedoranews.org/contributors/florin_andrei/openvpn/

  • 0 ความคิดเห็น:

    แสดงความคิดเห็น