คอนฟิก OpenVPN แบบ Static Key บน Fedora Linux

บทความนี้จะแนะนำการคอนฟิก 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 ให้เหมือนกัน

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

3 thoughts on “คอนฟิก OpenVPN แบบ Static Key บน Fedora Linux”

  1. สามารถใช้กับลูกข่ายได้กี่เครื่องครับ ตัว vpn ชุดนี้ ช่วยตอบกลับทาง E-mail ด้วยครับ ตอนนี้ผมใช้กับ ubantu 7.11 อยู่ครับ ตอนนี้ตั้ง 10.5.0.1 ถึง 10.5.0.250 อยู่ จะสามารถใช้ได้ถึง 500 คนไหมครับ 10.5.0.1 —- 10.5.0.500 อ่ะ จะได้หรือเปล่าครับ ขอบคุณมากๆๆๆ นะครับที่ช่วยตอบครับ

  2. สามารถนำไปประยุกต์ใช้โดยรัน OpenVPN บนเครื่องที่ทำหน้าที่เป็น Router หรือ Gateway ของทั้งสองฝั่งแล้วให้เครื่องลูกข่ายชี้ Default Gateway มาที่สองเครื่องนึ่ แต่อาจต้องมีการคอนฟิก routing table เพิ่มเติมครับ

    ส่วนปริมาณการใช้งานนั้นตัวโปรแกรมไม่ได้จำกัด แต่น่าจะขึ้นอยู่กับขนาดของเครื่องที่เราใช้รันของแต่ละฝั่ง แล้วก็ bandwidth ของลิ้งค์ที่เชื่อมต่อกัน

  3. เดี๋ยวก็รู้ครับ สมาชิก VPN ตอนนี้มี 225 คนแล้ว รออีกหน่อยครับ เดี๋ยวก็ถึง 254 คนแล้ว และหลังจากนั้นจะค่อยๆเพิ่มเข้าไป ครับ vpn ของผมใช้ในการรับส่ง DATA ครับ ขนาด เป็น Kb ครับ เล็กน้อยครับ

Leave a Reply

Your email address will not be published.