บทความนี้จะแนะนำการคอนฟิก OpenVPN ซึ่งเป็นโปรแกรม VPN อันหนึ่งที่นิยมใช้กันอย่างแพร่หลายบนลินุกซ์ โดยจะคอนฟิกในรูปแบบง่ายที่สุด คือเป็นแบบ static key เพื่อศึกษาทำความเข้าใจกับ OpenVPN ก่อนที่จะปรับปรุงเป็นแบบคอนฟิกที่ใช้ Public/Private key ซึ่งจะมีคุณสมบัติมากกว่าพร้อมทั้งความปลอดภัยที่ดีกว่าด้วย
ระบบที่ทดสอบ
- ทั้งเครื่อง Server และ Client ติดตั้ง Fedora 8 หรือ Fedora 9
- ลงโปรแกรม openvpn
คอนฟิก network
ก่อนที่จะเริ่มคอนฟิก OpenVPN แนะนำให้สร้างคอนฟิก network ระหว่าง Server และ Client โดยมีการเชื่อมต่อตามแบบด้านล่างนี้
LAN1 -------[ server ]---------------[ client ]------- LAN2 eth0 eth1 eth1 eth0
Server:
- eth0: 10.1.0.1/24
- eth1: 192.168.2.1/24
- ทุกเครื่องที่อยู่ในวง LAN 1 จะคอนฟิก default gateway มาที่ 10.1.0.1
Client:
- eth0: 10.2.0.1/24
- eth1: 192.168.2.2/24
- ทุกเครื่องที่อยู่ในวง LAN 2 จะคอนฟิก default gateway มาที่ 10.2.0.1
หมายเหตุ
- เพื่อความง่ายในการทดสอบ ในบทความนี้จะใช้พอร์ต eth1 ของ server และ client เชื่อมต่อ network เดียวกันเลย แต่ในการใช้งานจริง ทั้งสองเครื่องจะอยู่คนละ network กัน โดยอาจจะผ่าน internet ก็ได้ ขอให้มองเห็นกันได้ผ่านพอร์ต udp 1194 คือไม่มี firewall กั้นพอร์ตนี้ ก็เพียงพอแล้ว
- สำหรับการทดสอบ ให้ปิด iptables firewall
ติดตั้งโปรแกรม OpenVPN
โปรแกรม OpenVPN จะอยู่ในแผ่นติดตั้งอยู่แล้ว ถ้าเป็น Fedora 8 ไฟล์จะชื่อ openvpn-2.1-0.19.rc4.fc7.x86_64.rpm แต่ถ้าเป็น Fedora 9 ไฟล์จะชื่อ openvpn-2.1-0.25.rc7.fc9.i386.rpm
ตัวอย่างการติดตั้ง OpenVPN บน Fedora 9
[root@server media]# rpm –ivh openvpn-2.1-0.25.rc7.fc9.i386.rpm
สร้าง static key
ไฟล์คอนฟิกหลักของ OpenVPN จะอยู่ใน /etc/openvpn/ แต่จากการติดตั้งโปรแกรม OpenVPN จะไม่มีไฟล์อะไรเลยอยู่ใน directory นี้ แต่จะมีตัวอย่างไฟล์อยู่ใน /usr/share/doc/openvpn-2.1/ พร้อมทั้งคำเอกสารอธิบายด้วย
ขั้นแรกต้องสร้าง static key ขึ้นมาก่อนโดยทั้ง server และ client จะใช้ไฟล์ key เดียวกันเลย โดยเราสามารถจะรันคำสั่งสร้างจากเครื่องไหนก็ได้แล้ว copy ไปไว้อีกเครื่อง อยู่ใน /etc/openvpn/ เหมือนกัน
เริ่มต้น cd เข้าไปใน /etc/openvpn/ แล้วใช้คำสั่งตามตัวอย่างด้านล่างนี้ เพื่อสร้างไฟล์ static.key ขึ้นมา
ตัวอย่างการสร้างไฟล์ static.key บนเครื่อง server
[root@server ~]# cd /etc/openvpn/ [root@server openvpn]# ls –l total 0 [root@server openvpn]# openvpn --genkey --secret static.key total 4 -rw------- 1 root root 636 2008-06-13 18:59 static.key
พอได้ไฟล์ static.key บน server แล้ว ก็ copy ไปไว้ใน client โดยอาจใช้คำสั่ง scp (secure copy) เป็นต้น
สร้างไฟล์คอนฟิกหลัก
ขั้นต่อไปสร้างไฟล์คอนฟิกหลักขึ้นมา โดยจะเป็นชื่อไฟล์อะไรก็ได้ แต่ต้องลงท้ายด้วย .conf โดยโปรแกรม OpenVPN จะอ่านไฟล์ที่ลงท้ายด้วย .conf ทุกไฟล์ที่อยู่ใน /etc/openvpn/
คุณสามารถดูไฟล์คอนฟิกตัวอย่างได้จาก /usr/share/doc/openvpn-2.1/sample-config-files/ ซึ่งจะมีคำอธิบายอยู่ในไฟล์แล้ว
ในที่นี้ จะนำตัวอย่างไฟล์ static-office.conf มาแก้ไขเป็นคอนฟิกสำหรับ server และไฟล์ static-home.conf มาแก้ไขเป็นคอนฟิกสำหรับ client
ตัวอย่างคอนฟิกไฟล์ของ server ที่แก้ไขแล้ว และเอาบรรทัดที่มีเครื่องหมาย # และ ; (comment) ออกทั้งหมด บันทึกเป็นชื่อไฟล์ /etc/openvpn/static-office.conf
dev tun ifconfig 10.8.0.1 10.8.0.2 secret static.key ping 15 ping-restart 45 ping-timer-rem persist-tun persist-key verb 3
ตัวอย่างคอนฟิกไฟล์ของ client ที่แก้ไขแล้ว และเอาบรรทัดที่มีเครื่องหมาย # และ ; (comment) ออกทั้งหมด บันทึกเป็นชื่อไฟล์ /etc/openvpn/static-home.conf
dev tun remote 192.168.2.1 ifconfig 10.8.0.2 10.8.0.1 secret static.key ping 15 ping-restart 45 ping-timer-rem persist-tun persist-key verb 3
หมายเหตุ บรรทัดที่มีคำว่า remote นั้น 192.168.2.1 เป็น ip ของพอร์ต eth1 ของ server ซึ่ง client ต้องมองเห็นและสามารถใช้พอร์ต udp 1194
เริ่มต้นโปรแกรมบน server
เมื่อแก้ไขไฟล์คอนฟิกเรียบร้อยต้องเริ่มต้นโปรแกรม OpenVPN แนะนำให้รันบน server ก่อน
ตัวอย่างการเริ่มต้น OpenVPN บน server
[root@server openvpn]# /etc/init.d/openvpn start Starting openvpn: [ OK ]
หลังจากรันโปรแกรมแล้ว ให้ใช้คำสั่ง ifconfig ในการตรวจสอบ สังเกตว่าจะมี interface ใหม่ถูกสร้างขึ้นมาชื่อ tun0
และมี inet addr เป็น 10.8.0.1 ส่วน P-t-P จะเป็น 10.8.0.2 ซึ่งจะตรงกับในบรรทัด ifconfig ในไฟล์ /etc/openvpn/ static-office.conf
[root@server openvpn]# ifconfig ... tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
ทดลองใช้คำสั่ง ping ทดสอบ ณ ตอนนี้จะ ping ได้แค่ 10.8.0.1 ซึ่งเป็น VPN ip address ของตัว server เอง แต่จะไม่สามารถ ping 10.8.0.2 ซึ่งเป็น VP ip address ของ client เพราะเรายังไม่ได้รันโปรแกรม OpenVPN บนเครื่อง client นั่นเอง
เริ่มต้น OpenVPN บน client
ใช้คำสั่งเดียวกัน รันบนเครื่อง client ด้วย เพื่อเริ่มต้นโปรแกรม
[root@client openvpn]# /etc/init.d/openvpn start Starting openvpn: [ OK ]
หลังจากรันโปรแกรมแล้ว ให้ใช้คำสั่ง ifconfig ในการตรวจสอบ สังเกตว่าจะมี interface ใหม่ถูกสร้างขึ้นมาชื่อ tun0
และมี inet addr เป็น 10.8.0.2 ส่วน P-t-P จะเป็น 10.8.0.1 ซึ่งจะตรงกับในบรรทัด ifconfig ในไฟล์ /etc/openvpn/ static-home.conf สังเกตว่า จะสลับกับ ip ของ server
[root@client openvpn]# ifconfig ... tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.2 P-t-P:10.8.0.1 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
ทดลองใช้คำสั่ง ping ทดสอบ ณ ตอนนี้จะ ping ได้ทั้งสอง ip เลย แสดงว่าจากเครื่อง client สามารถจะเชื่อมต่อกับ server ผ่านทาง VPN ได้แล้ว
คอนฟิก server และ client ให้ทำหน้าที่เป็น router
เพื่อให้ LAN1 และ LAN2 จากรูป network ด้านบนสุดสามารถติดต่อกันได้ เราต้องคอนฟิก server และ client ให้ทำหน้าที่เป็น router
หมายเหตุ ในการใช้งานจริง ส่วนใหญ่แล้วจะคอนฟิกเป็นแบบ NAT กัน ระหว่าง network ข้ามเครือข่าย โดยเฉพาะผ่าน internet
วิธีการง่ายสุดทำให้ linux ที่มี interface สองพอร์ตขึ้นไปทำหน้าที่เป็น router ได้ คือ แก้ไขไฟล์ /etc/sysctl.conf โดยแก้บรรทัดที่มีคำว่า net.ipv4.ip_forward แก้ค่าตัวแปรจาก 0 ให้เป็น 1 เพื่อเป็นการ enable ip forwarding นั่นเอง
ตัวอย่างการแก้ไขไฟล์ /etc/sysctl.conf
... # Controls IP packet forwarding net.ipv4.ip_forward = 1 ...
หลังจากทั้ง server และ client ทำหน้าที่เป็น router แล้ว เราต้องคอนฟิก routing ให้มองเห็นกันอย่างถูกต้องโดยจะผ่าน VPN ทั้งหมด
ตัวอย่างการคอนฟิก routing บน server
[root@server ~]# route add –net 10.2.0.0 netmask 255.255.255.0 gw 10.8.0.2
ตัวอย่างการคอนฟิก routing บนclient
[root@client ~]# route add –net 10.1.0. netmask 255.255.255.0 gw 10.8.0.1
หลังจากคอนฟิกเสร็จเรียบร้อย ให้ทดลอง ping ระหว่างเครื่องที่อยู่ใน LAN1 และ LAN2 ได้
การแก้ไขปัญหา OpenVPN
เมื่อเกิดปัญหา สามารถตรวจสอบได้จากไฟล์ /var/log/messages โดยไฟล์นี้จะเก็บ log ทั้งหมดของ OpenVPN
ปัญหาที่พบบ่อยตอนเริ่มต้นคอนฟิกคือ static key ระหว่างสองเครื่องไม่เหมือนกัน โดยจะมีข้อความด้านล่างนี้เกิดขึ้นในไฟล์ /var/log/messages บน server
Jun 13 17:13:00 server openvpn[2199]: Authenticate/Decrypt packet error: packet HMAC authentication failed
วิธีการแก้ไข ให้ตรวจสอบไฟล์ /etc/openvpn/static.key ให้เหมือนกัน
ข้อมูลอ้างอิง
สามารถใช้กับลูกข่ายได้กี่เครื่องครับ ตัว vpn ชุดนี้ ช่วยตอบกลับทาง E-mail ด้วยครับ ตอนนี้ผมใช้กับ ubantu 7.11 อยู่ครับ ตอนนี้ตั้ง 10.5.0.1 ถึง 10.5.0.250 อยู่ จะสามารถใช้ได้ถึง 500 คนไหมครับ 10.5.0.1 —- 10.5.0.500 อ่ะ จะได้หรือเปล่าครับ ขอบคุณมากๆๆๆ นะครับที่ช่วยตอบครับ
สามารถนำไปประยุกต์ใช้โดยรัน OpenVPN บนเครื่องที่ทำหน้าที่เป็น Router หรือ Gateway ของทั้งสองฝั่งแล้วให้เครื่องลูกข่ายชี้ Default Gateway มาที่สองเครื่องนึ่ แต่อาจต้องมีการคอนฟิก routing table เพิ่มเติมครับ
ส่วนปริมาณการใช้งานนั้นตัวโปรแกรมไม่ได้จำกัด แต่น่าจะขึ้นอยู่กับขนาดของเครื่องที่เราใช้รันของแต่ละฝั่ง แล้วก็ bandwidth ของลิ้งค์ที่เชื่อมต่อกัน
เดี๋ยวก็รู้ครับ สมาชิก VPN ตอนนี้มี 225 คนแล้ว รออีกหน่อยครับ เดี๋ยวก็ถึง 254 คนแล้ว และหลังจากนั้นจะค่อยๆเพิ่มเข้าไป ครับ vpn ของผมใช้ในการรับส่ง DATA ครับ ขนาด เป็น Kb ครับ เล็กน้อยครับ