คอนฟิก OpenVPN แบบ Multiple Client – ตอนที่ 2

ต่อจากบทความ คอนฟิก OpenVPN แบบ Multiple Client – ตอนที่ 1 ในตอนที่ 2 นี้จะอธิบายการแก้ไขไฟล์คอนฟิก เพื่อทำหน้าที่เป็น VPN Client และ Server

คอนฟิก OpenVPN Server  (VPN Server)

จากการติดตั้ง openvpn จะมีตัวอย่างไฟล์คอนฟิกเพื่อช่วยในการเริ่มต้นคอนฟิก โดยจะมีหลายไฟล์เหมาะกับการคอนฟิกแบบต่างๆ อยู่ในไดเร็คทอรี /usr/share/doc/openvpn-2.1/sample-config-files/

สำหรับ OpenVPN Server แบบ Multiple Client จะใช้ไฟล์คอนฟิกตัวอย่างคือ server.conf โดยต้อง copy ไฟล์ไปไว้ใน /etc/openvpn/

ตัวอย่างการสร้างไฟล์คอนฟิกของ OpenVPN Server ในที่นี้จะตั้งชื่อไฟล์เป็น vpn-server.conf

[root@vpn-server ~]# cd /etc/openvpn/
[root@vpn-server openvpn]# cp /usr/share/doc/openvpn-2.1/sample-config-files/server.conf vpn-server.conf

copy ไฟล์ Certificate, Privte Key และไฟล์ dh1024.pem ที่สร้างสำหรับ OpenVPN Server จากเครื่อง CA มาวางไว้ใน /etc/openvpn/

[root@vpn-server openvpn]# ls -l
-rw-r--r-- 1 root root 9998 2008-10-31 17:54 vpn-server.conf
-rw-r--r-- 1 root root 1245 2008-10-31 17:51 ca.crt
-rw-r--r-- 1 root root  245 2008-10-31 17:51 dh1024.pem
-rw-r--r-- 1 root root 3922 2008-10-31 17:52 vpn-server.crt
-rw------- 1 root root  887 2008-10-31 17:52 vpn-server.key

แก้ไขไฟล์ vpn-server.conf  โดยส่วนที่ต้องแก้คือชื่อไฟล์สำหรับเก็บคีย์ต่างๆ และ IP Address สำหรับเน็ตเวิร์กที่ VPN ใช้  ในที่นี้จะเลือกใช้ 10.1.1.0

ตัวอย่างไฟล์ /etc/openvpn/vpn-server.conf

#
# VPN Server Configuration
# /etc/openvpn/vpn-server.conf
#
port 1194
proto udp
dev tun
ca ca.crt
cert vpn-server.crt
key vpn-server.key
dh dh1024.pem
server 10.1.1.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

ใช้คำสั่ง service เพื่อรันเซอร์วิส openvpn

[root@vpn-server openvpn]# service openvpn start
Starting openvpn:                                          [  OK  ]

สามารถตรวจสอบผลการรันเซอร์วิส openvpn หากมีปัญหาต่างๆ ได้จากไฟล์ /var/log/messages

ตัวอย่างไฟล์ /var/log/messages ถ้ารันเซอร์วิส openvpn เพื่อทำหน้าที่เป็น OpenVPN Server ได้อย่างถูกต้อง

[root@vpn-server openvpn]# tail –f /var/log/messages
Oct 31 18:29:51 vpn-server openvpn[3509]: OpenVPN 2.1_rc8 i386-redhat-linux-gnu [SSL] [LZO2] [EPOLL] built on Jun 14 2008
Oct 31 18:29:51 vpn-server openvpn[3509]: Diffie-Hellman initialized with 1024 bit key
Oct 31 18:29:51 vpn-server openvpn[3509]: TLS-Auth MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Oct 31 18:29:51 vpn-server kernel: tun0: Disabled Privacy Extensions
Oct 31 18:29:51 vpn-server openvpn[3509]: TUN/TAP device tun0 opened
Oct 31 18:29:51 vpn-server openvpn[3509]: TUN/TAP TX queue length set to 100
Oct 31 18:29:51 vpn-server openvpn[3509]: /sbin/ip link set dev tun0 up mtu 1500
Oct 31 18:29:51 vpn-server openvpn[3509]: /sbin/ip addr add dev tun0 local 10.1.1.1 peer 10.1.1.2
Oct 31 18:29:51 vpn-server openvpn[3509]: /sbin/ip route add 10.1.1.0/24 via 10.1.1.2
Oct 31 18:29:51 vpn-server openvpn[3509]: Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Oct 31 18:29:51 vpn-server openvpn[3519]: Socket Buffers: R=[110592->131072] S=[110592->131072]
Oct 31 18:29:51 vpn-server openvpn[3519]: UDPv4 link local (bound): [undef]:1194
Oct 31 18:29:51 vpn-server openvpn[3519]: UDPv4 link remote: [undef]
Oct 31 18:29:51 vpn-server openvpn[3519]: MULTI: multi_init called, r=256 v=256
Oct 31 18:29:51 vpn-server openvpn[3519]: IFCONFIG POOL: base=10.1.1.4 size=62
Oct 31 18:29:51 vpn-server openvpn[3519]: IFCONFIG POOL LIST
Oct 31 18:29:51 vpn-server openvpn[3519]: Initialization Sequence Completed
Oct 31 18:29:52 vpn-server ntpd[2606]: Listening on interface #23 tun0, 10.1.1.1#123 Enabled

เมื่อรันเซอร์วิส openvpn เรียบร้อย จะมีอินเตอร์เฟสใหม่ถูกสร้างขึ้นมา สามารถใช้คำสั่ง ifconfig และ netstat -rn เพื่อตรวจสอบได้

[root@vpn-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.1.1.1  P-t-P:10.1.1.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)

[root@vpn-server openvpn]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.1.1.2        *               255.255.255.255 UH    0      0        0 tun0
10.1.1.0        10.1.1.2        255.255.255.0   UG    0      0        0 tun0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     0      0        0 eth0

นอกจากนี้จะมีไฟล์ชื่อ openvpn-status แสดงสถานะของ VPN ถูกเก็บอยู่ใน /etc/openvpn/

ตัวอย่างไฟล์ openvpn-status.log ตอนที่ยังไม่มีไคลเอนต์เครื่องใดเชื่อมต่อ VPN เข้ามา

[root@vpn-server openvpn]# cat /etc/openvpn/openvpn-status.log
OpenVPN CLIENT LIST
Updated,Fri Oct 31 18:31:01 2008
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
GLOBAL STATS
Max bcast/mcast queue length,0
END

คอนฟิก OpenVPN Client (VPN Client)

สำหรับ OpenVPN Client เครื่องต่างๆ จะใช้ไฟล์คอนฟิกตัวอย่างคือ client.conf โดยต้อง copy ไฟล์ไปไว้ใน /etc/openvpn/

ตัวอย่างการสร้างไฟล์คอนฟิกของ OpenVPN Client #1 ในที่นี้จะตั้งชื่อไฟล์เป็น vpn-client1.conf

[root@vpn-server ~]# cd /etc/openvpn/
[root@vpn-server openvpn]# cp /usr/share/doc/openvpn-2.1/sample-config-files/server.conf vpn-client1.conf

copy ไฟล์ Certificate, Privte Key และไฟล์ dh1024.pem ที่สร้างสำหรับ OpenVPN Client #1 จากเครื่อง CA มาวางไว้ใน /etc/openvpn/ ด้วย

[root@vpn-client1 openvpn]# ls -l
-rw-r--r-- 1 root root  262 2008-10-31 18:34 vpn-client1.conf
-rw-r--r-- 1 root root 1245 2008-10-31 17:53 ca.crt
-rw-r--r-- 1 root root 3805 2008-10-31 17:53 vpn-client1.crt
-rw------- 1 root root  887 2008-10-31 17:53 vpn-client1.key

แก้ไขไฟล์ vpn-client1.conf  โดยส่วนที่ต้องแก้คือชื่อไฟล์สำหรับเก็บคีย์ต่างๆ และ IP Address จริง ของ OpenVPN Server ในที่นี้คือ 192.168.1.1

ตัวอย่างไฟล์ /etc/openvpn/vpn-client1.conf

#
# OpenVPN Client #1 Configuration
# /etc/openvpn/vpn-client1.conf
#
client
dev tun
proto udp
remote 192.168.1.1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert vpn-client1.crt
key vpn-client1.key
comp-lzo
verb 3

ใช้คำสั่ง service เพื่อรันเซอร์วิส openvpn ทำหน้าที่เป็น OpenVPN Client เครื่องที่ 1

[root@vpn-client1 openvpn]# service openvpn start
Starting openvpn:                                          [  OK  ]

สามารถตรวจสอบไฟล์ /var/log/messages เพื่อดูผลการรัน openvpn ได้

ตัวอย่างไฟล์ /var/log/messages ในกรณีที่รัน openvpn เพื่อทำหน้าที่เป็น OpenVPN Client ได้อย่างถูกต้อง

[root@vpn-client1 openvpn]# tail -f /var/log/messages
Oct 31 18:36:18 vpn-client1 openvpn[2705]: OpenVPN 2.1_rc8 i386-redhat-linux-gnu [SSL] [LZO2] [EPOLL] built on Jun 14 2008
Oct 31 18:36:18 vpn-client1 openvpn[2705]: WARNING: No server certificate verification method has been enabled.  See http://openvpn.net/howto.html#mitm for more info.
Oct 31 18:36:18 vpn-client1 openvpn[2705]: LZO compression initialized
Oct 31 18:36:18 vpn-client1 openvpn[2705]: Control Channel MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Oct 31 18:36:18 vpn-client1 openvpn[2705]: Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Oct 31 18:36:18 vpn-client1 openvpn[2705]: Local Options hash (VER=V4): '41690919'
Oct 31 18:36:18 vpn-client1 openvpn[2705]: Expected Remote Options hash (VER=V4): '530fdded'
Oct 31 18:36:18 vpn-client1 openvpn[2707]: Socket Buffers: R=[110592->131072] S=[110592->131072]
Oct 31 18:36:18 vpn-client1 openvpn[2707]: UDPv4 link local: [undef]
Oct 31 18:36:18 vpn-client1 openvpn[2707]: UDPv4 link remote: 192.168.1.1:1194
Oct 31 18:36:18 vpn-client1 openvpn[2707]: TLS: Initial packet from 192.168.1.1:1194, sid=06a517e0 1a81cb8b
Oct 31 18:36:18 vpn-client1 openvpn[2707]: VERIFY OK: depth=1, /C=TH/ST=Nonthaburi/L=Pak_Kret/O=My Company Name/CN=My Company Name_CA/emailAddress=info@my-vpn-network.com
Oct 31 18:36:18 vpn-client1 openvpn[2707]: VERIFY OK: depth=0, /C=TH/ST=Nonthaburi/L=Pak_Kret/O=My Company Name/CN=vpn-server/emailAddress=info@my-vpn-network.com
Oct 31 18:36:18 vpn-client1 openvpn[2707]: Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Oct 31 18:36:18 vpn-client1 openvpn[2707]: Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Oct 31 18:36:18 vpn-client1 openvpn[2707]: Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Oct 31 18:36:18 vpn-client1 openvpn[2707]: Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Oct 31 18:36:18 vpn-client1 openvpn[2707]: Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Oct 31 18:36:18 vpn-client1 openvpn[2707]: [vpn-server] Peer Connection Initiated with 192.168.1.1:1194
Oct 31 18:36:20 vpn-client1 openvpn[2707]: SENT CONTROL [vpn-server]: 'PUSH_REQUEST' (status=1)
Oct 31 18:36:20 vpn-client1 openvpn[2707]: PUSH: Received control message: 'PUSH_REPLY,route 10.1.1.1,topology net30,ping 10,ping-restart 120,ifconfig 10.1.1.6 10.1.1.5'
Oct 31 18:36:20 vpn-client1 openvpn[2707]: OPTIONS IMPORT: timers and/or timeouts modified
Oct 31 18:36:20 vpn-client1 openvpn[2707]: OPTIONS IMPORT: --ifconfig/up options modified
Oct 31 18:36:20 vpn-client1 openvpn[2707]: OPTIONS IMPORT: route options modified
Oct 31 18:36:20 vpn-client1 kernel: tun0: Disabled Privacy Extensions
Oct 31 18:36:20 vpn-client1 openvpn[2707]: TUN/TAP device tun0 opened
Oct 31 18:36:20 vpn-client1 openvpn[2707]: TUN/TAP TX queue length set to 100
Oct 31 18:36:20 vpn-client1 openvpn[2707]: /sbin/ip link set dev tun0 up mtu 1500
Oct 31 18:36:20 vpn-client1 openvpn[2707]: /sbin/ip addr add dev tun0 local 10.1.1.6 peer 10.1.1.5
Oct 31 18:36:20 vpn-client1 openvpn[2707]: /sbin/ip route add 10.1.1.1/32 via 10.1.1.5
Oct 31 18:36:20 vpn-client1 openvpn[2707]: Initialization Sequence Completed

ถ้ารันไคลเอนต์ได้อย่างถูกต้อง จะมีอินเตอร์เฟส ใหม่ถูกสร้างขึ้นมา สามารถตรวจสอบได้จากคำสั่ง ifconfig และ netstat –rn

[root@vpn-client1 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.1.1.6  P-t-P:10.1.1.5  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)
[root@vpn-client1 openvpn]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.1.1.5        *               255.255.255.255 UH    0      0        0 tun0
10.1.1.1        10.1.1.5        255.255.255.255 UGH   0      0        0 tun0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     0      0        0 eth0

ใช้คำสั่ง ping เพื่อทดสอบการส่งข้อมูลผ่าน VPN ไปยัง VPN Server

[root@vpn-client1 openvpn]# ping -n 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=1.10 ms
64 bytes from 10.1.1.1: icmp_seq=2 ttl=64 time=0.822 ms
64 bytes from 10.1.1.1: icmp_seq=3 ttl=64 time=1.07 ms
^C
--- 10.1.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2407ms
rtt min/avg/max/mdev = 0.822/1.000/1.103/0.131 ms

สำหรับ VPN Cilent เครื่องอื่นๆ สามารถคอนฟิกในทำนองเดียวกัน เพียงแต่ต้องใช้ Certificate และ Private Key สำหรับไคลเอนต์เครื่องต่างๆ

ตรวจสอบสถานะการเชื่อมต่อ VPN บนเครื่อง Server

ตัวอย่างไฟล์ /var/log/messages ที่เกิดขึ้นบนเครื่อง OpenVPN Server เมื่อมีการเชื่อมต่อ VPN มาจาก OpenClient

[root@vpn-server openvpn]# tail -f /var/log/messages
Oct 31 18:36:18 vpn-server openvpn[3519]: MULTI: multi_create_instance called
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 Re-using SSL/TLS context
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 LZO compression initialized
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 Control Channel MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 Local Options hash (VER=V4): '530fdded'
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 Expected Remote Options hash (VER=V4): '41690919'
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 TLS: Initial packet from 192.168.1.101:51931, sid=75f786a8 cd2868f2
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 VERIFY OK: depth=1, /C=TH/ST=Nonthaburi/L=Pak_Kret/O=My Company Name/CN=My Company Name_CA/emailAddress=info@my-vpn-network.com
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 VERIFY OK: depth=0, /C=TH/ST=Nonthaburi/L=Pak_Kret/O=My Company Name/CN=vpn-client1/emailAddress=info@my-vpn-network.com
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Oct 31 18:36:18 vpn-server openvpn[3519]: 192.168.1.101:51931 [vpn-client1] Peer Connection Initiated with 192.168.1.101:51931
Oct 31 18:36:18 vpn-server openvpn[3519]: vpn-client1/192.168.1.101:51931 MULTI: Learn: 10.1.1.6 -> vpn-client1/192.168.1.101:51931
Oct 31 18:36:18 vpn-server openvpn[3519]: vpn-client1/192.168.1.101:51931 MULTI: primary virtual IP for vpn-client1/192.168.1.101:51931: 10.1.1.6
Oct 31 18:36:20 vpn-server openvpn[3519]: vpn-client1/192.168.1.101:51931 PUSH: Received control message: 'PUSH_REQUEST'
Oct 31 18:36:20 vpn-server openvpn[3519]: vpn-client1/192.168.1.101:51931 SENT CONTROL [vpn-client1]: 'PUSH_REPLY,route 10.1.1.1,topology net30,ping 10,ping-restart 120,ifconfig 10.1.1.6 10.1.1.5' (status=1)

ตัวอย่างไฟล์ openvpn-status.log เมื่อมีการเชื่อมต่อจาก VPN Client เรียบร้อยแล้ว

[root@vpn-server ~]# cat /etc/openvpn/openvpn-status.log
OpenVPN CLIENT LIST
Updated,Fri Oct 31 18:39:18 2008
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
vpn-client1,192.168.1.101:51931,5563,6519,Fri Oct 31 18:36:18 2008
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.1.1.6,vpn-client1,192.168.1.101:51931,Fri Oct 31 18:38:59 2008
GLOBAL STATS
Max bcast/mcast queue length,0
END

ทดสอบ ping จากเครื่องเซิร์ฟเวอร์กลับไปยังไคลเอนต์ผ่านทาง VPN ได้

[root@vpn-server ~]# ping -n 10.1.1.6
PING 10.1.1.6 (10.1.1.6) 56(84) bytes of data.
64 bytes from 10.1.1.6: icmp_seq=1 ttl=64 time=0.816 ms
64 bytes from 10.1.1.6: icmp_seq=2 ttl=64 time=0.624 ms
^C
--- 10.1.1.6 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1303ms
rtt min/avg/max/mdev = 0.624/0.720/0.816/0.096 ms

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

1 thought on “คอนฟิก OpenVPN แบบ Multiple Client – ตอนที่ 2”

  1. Great!! it’s work.

    สอบถามเพิ่มเติมครับถ้าอยากใช้ระบบ user & password เนี่ยต้อง config เพิ่มอย่างไรบ้างครับ

    และขอคำแนะนำในการกำหนดให้ client สามารถออก internet ผ่าน VPN server ด้วยครับ

    ขอบคุณครับ

Leave a Reply