จากบทความเรื่อง คอนฟิก OpenVPN แบบ Static Key บน Fedora Linux ที่กล่าวถึงการสร้าง VPN เพื่อเชื่อมโยงระหว่างเครื่องสองเครื่องแบบหนึ่งต่อหนี่งนั้น ในทางปฎิบัติจะไม่สะดวกในการนำไปใช้กับเครือข่ายที่มีขนาดใหญ่ ที่มีการเชื่อมโยง VPN ระหว่างหลายๆ เครื่องเข้าด้วยกัน
ในบทความนี้จะอธิบายการคอนฟิก OpenVPN แบบ Multiple Clients เพื่อเชื่อมโยง VPN หลายๆ เครื่องเข้าด้วยกัน ในลักษณะที่ เครื่องหนึ่งทำหน้าที่เป็น VPN Server รองรับการสร้าง VPN มาจาก VPN Client หลายๆ เครื่อง ซึ่งสามารถนำไปดัดแปลงใช้กับเครือข่ายที่มีลักษณะเป็นสำนักงานใหญ่ และสาขากระจายไปตามจุดต่างๆ ได้
การคอนฟิกแบบ Multiple Client นี้ จะใช้หลักการของ Public/Private key และ Certificate Authority (CA) เพื่อตรวจสอบคีย์ของเครื่องที่ต้องการเชื่อมต่อว่าถูกต้องหรือไม่ ก่อนที่จะอนุญาตให้สร้าง VPN ระหว่าง Server และ Client แต่ละเครื่องได้
ระบบที่ทดสอบ
- เครื่อง vpn-server ทำหน้าที่เป็น VPN Server มี IP Address คือ 192.168.1.1
- เครื่อง vpn-client1, vpn-client2, vpn-client3 เป็น VPN Client เครื่องที่ 1, 2, 3 ..และมี IP Address คือ 192.168.1.101, 192.168.1.102, 192.168.1.103
หมายเหตุ
- ในแต่ละหัวข้อจะมีวงเล็บอยู่ด้วย เพื่อบอกว่าขั้นตอนนั้น ต้องทำบนเครื่องใดบ้าง
- เพื่อความสะดวก วงเล็บ (CA) ให้รันคำสั่งบนเครื่อง vpn-server
ติดตั้งโปรแกรม OpenVPN (ทุกเครื่อง)
ติดตั้งโปรแกรม OpenVPN บนเครื่องทุกเครื่องทั้งเซิร์ฟเวอร์และไคลเอนต์ ถ้าใช้ Fedora 9 ไฟล์ที่ติดตั้งอยู่ในแผ่นดีวีดีติดตั้งอยู่แล้ว
ตัวอย่างการติดตั้ง OpenVPN บน Fedora 9
[root@vpn-server Packages]# rpm -ivh openvpn-2.1-0.25.rc7.fc9.i386.rpm error: Failed dependencies: liblzo2.so.2 is needed by openvpn-2.1-0.25.rc7.fc9.i386
หากตอนติดตั้งเจอข้อความฟ้องเรื่อง Failed dependencies แบบด้านบน ต้องติดตั้งโปรแกรม lzo ก่อน แล้วค่อยติดตั้ง openvpn อีกที
[root@vpn-server Packages]# rpm -ivh lzo-2.02-4.fc9.i386.rpm Preparing... ########################################### [100%] 1:lzo ########################################### [100%] [root@vpn-server Packages]# rpm -ivh openvpn-2.1-0.25.rc7.fc9.i386.rpm Preparing... ########################################### [100%] 1:openvpn ########################################### [100%]
เซ็ตอัป OpenVPN Certificate Authority (CA)
เริ่มต้นเราต้องเซ็ตอัป Certificate Authority (CA) ขึ้นมา เพื่อใช้ในการสร้าง Public/Private Key และ Certificate สำหรับเซิร์ฟเวอร์และไคลเอนต์ ในที่นี้เพื่อความสะดวก เราจะรันคำสั่งเพื่อเซ็ตอัปบนเครื่องเดียวกับ VPN Server
จากการติดตั้งโปรแกรม OpenVPN จะมีสคริปต์ที่ใช้ในการสร้าง CA อยู่ในไดเร็คทอรี /usr/share/openvpn/easy-rsa/2.0/ ในนี้จะมีหลายๆ ไฟล์ และต้องทำหลายขั้นตอนดังนี้
แก้ไขในส่วนด้านล่างของไฟล์ “vars” เพื่อระบุข้อมูลของหน่วยงานเรา เช่นชื่อบริษัท สถานที่ตั้ง โดยข้อมูลเหล่านี้จะถูกเก็บไว้ในไฟล์ Certificate
ตัวอย่างส่วนของไฟล์ “vars” ที่มีการแก้ไข
[root@vpn-server ~]# cd /usr/share/openvpn/easy-rsa/2.0/ [root@vpn-server 2.0]# cat vars ... # These are the default values for fields # which will be placed in the certificate. # Don't leave any of these fields blank. export KEY_COUNTRY="TH" export KEY_PROVINCE="Nonthaburi" export KEY_CITY="Pak Kret" export KEY_ORG="My Company Name" export KEY_EMAIL="info@my-vpn-network.com"
หลังแก้ไขไฟล์ “vars” ให้รันคำสั่งต่อไปนี้ เพื่อเตรียมไดเร็คทอรีและไฟล์ที่จำเป็นในการสร้าง CA
[root@vpn-server 2.0]# source ./vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/share/openvpn/easy-rsa/2.0/keys
[root@vpn-server 2.0]# ./clean-all
[root@vpn-server 2.0]# ls -l keys/ total 4 -rw-r--r-- 1 root root 0 2008-10-31 17:45 index.txt -rw-r--r-- 1 root root 3 2008-10-31 17:45 serial
ใช้คำสั่ง “build-ca” เพื่อสร้าง CA
[root@vpn-server 2.0]# ./build-ca Generating a 1024 bit RSA private key ...............++++++ ..............++++++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [TH]: State or Province Name (full name) [Nonthaburi]: Locality Name (eg, city) [Pak Kret]: Organization Name (eg, company) [My Company Name]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) [My Company Name CA]: Email Address [info@my-vpn-network.com]:
ไฟล์ของ CA ที่ถูกสร้างขึ้นจะถูกเก็บไว้ในไดเร็คทอรี “keys/” โดยจะมีไฟล์ “ca.crt” ซึ่งเป็นไฟล์ Certiifacate ของ CA และไฟล์ “ca.key” ซึ่งเป็นไฟล์ Private Key ของ CA
ข้อควรระวัง ไฟล์ที่ลงท้ายด้วย “.key” ในการคอนฟิก OpenVPN ส่วนมากจะเป็นไฟล์ที่เก็บ Private Key ซึ่งต้องเป็นความลับ ไม่ให้คนอื่นสามารถดูไฟล์นี้ได้ ยกเว้น root เพราะฉะนั้นสิทธิ (permission) ของไฟล์นี้ต้องเป็น 600
ตัวอย่างไฟล์ที่ถูกสร้างขึ้นจากคำสั่ง “build-ca”
[root@vpn-server 2.0]# ls -l keys/ total 12 -rw-r--r-- 1 root root 1245 2008-10-31 17:46 ca.crt -rw------- 1 root root 891 2008-10-31 17:46 ca.key -rw-r--r-- 1 root root 0 2008-10-31 17:45 index.txt -rw-r--r-- 1 root root 3 2008-10-31 17:45 serial
ตัวอย่างบางส่วนของไฟล์ “ca.crt”
[root@vpn-server 2.0]# cat keys/ca.crt -----BEGIN CERTIFICATE----- MIIFaTdC... ... -----END CERTIFICATE-----
ตัวอย่างบางส่วนของไฟล์ “ca.key”
[root@vpn-server 2.0]# cat keys/ca.key -----BEGIN RSA PRIVATE KEY----- MIIBAAKB... ... -----END RSA PRIVATE KEY-----
สร้าง Certificate และ Private Key สำหรับ Server (CA)
ใช้คำสั่ง “build-key-server” ตามด้วยชื่อเครื่องเซิร์ฟเวอร์ เพื่อทำการสร้าง Certificate และ Private Kye สำหรับใช้กับ VPN Server โดยไฟล์ที่สร้างได้จะถูกเก็บไว้ในไดเร็คทอรี “keys/” และตั้งชื่อตามชื่อเครื่องเซิร์ฟเวอร์ที่เราระบุไว้
ตัวอย่างการใช้คำสั่ง “build-key-server” เพื่อสร้าง Certificate และ Private Key ของเครื่อง vpn-server
[root@vpn-server 2.0]# ./build-key-server vpn-server Generating a 1024 bit RSA private key .....++++++ ............++++++ writing new private key to 'vpn-server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [TH]: State or Province Name (full name) [Nonthaburi]: Locality Name (eg, city) [Pak Kret]: Organization Name (eg, company) [My Company Name]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) [vpn-server]: Email Address [info@my-vpn-network.com]:
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/share/openvpn/easy-rsa/2.0/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'TH' stateOrProvinceName :PRINTABLE:'Nonthaburi' localityName :PRINTABLE:'Pak Kret' organizationName :PRINTABLE:'My Company Name' commonName :PRINTABLE:'vpn-server' emailAddress :IA5STRING:'info@my-vpn-network.com' Certificate is to be certified until Oct 29 10:48:18 2018 GMT (3650 days) Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
ตัวอย่างบางส่วนของไฟล์ “vpn-server.crt” (Certificate ของเครื่อง vpn-server)
[root@vpn-server openvpn]# cat keys/vpn-server.crt Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: C=TH, ST=Nonthaburi, L=Pak Kret, O=My Company Name, CN=My Company Name CA/emailAddress=info@my-vpn-network.com Validity Not Before: Oct 31 10:48:18 2008 GMT Not After : Oct 29 10:48:18 2018 GMT Subject: C=TH, ST=Nonthaburi, L=Pak Kret, O=My Company Name, CN=vpn-server/emailAddress=info@my-vpn-network.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:bb:fd:... Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Cert Type: SSL Server Netscape Comment: Easy-RSA Generated Server Certificate X509v3 Subject Key Identifier: 0A:BB:... X509v3 Authority Key Identifier: keyid:6D:C8:... DirName:/C=TH/ST=Nonthaburi/L=Pak Kret/O=My Company Name/CN=My Company Name CA/emailAddress=info@my-vpn-network.com serial:87:1D:...
X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Key Usage: Digital Signature, Key Encipherment Signature Algorithm: sha1WithRSAEncryption 4e:44:... ... -----BEGIN CERTIFICATE----- MIIDaTCC... ... -----END CERTIFICATE-----
ตัวอย่างบางส่วนของไฟล์ “vpn-server.key” (Private Key ของเครื่อง vpn-server) ไฟล์นี้ต้องมี permission เป็น 600
[root@vpn-server openvpn]# cat keys/vpn-server.key -----BEGIN RSA PRIVATE KEY----- MIIWwIBA ... -----END RSA PRIVATE KEY-----
สร้างไฟล์ Diffie Hellman parameters (CA)
[root@vpn-server 2.0]# ./build-dh Generating DH parameters, 1024 bit long safe prime, generator 2 This is going to take a long time ..................+..+..
[root@vpn-server 2.0]# cat keys/dh1024.pem -----BEGIN DH PARAMETERS----- MIGHAoGB... ... -----END DH PARAMETERS-----
สร้าง Certificate และ Private Key สำหรับ Client (CA)
ใช้คำสั่ง “build-key” ตามด้วยชื่อเครื่องไคลเอนต์แต่ะละเครื่อง เพื่อสร้าง Certificate และ Private Kye สำหรับใช้กับ VPN Client โดยไฟล์ที่สร้างได้จะถูกเก็บไว้ในไดเร็คทอรี “keys/” และตั้งชื่อตามชื่อเครื่องไคลเอนต์ที่เราระบุไว้
ตัวอย่างการใช้คำสั่ง “build-key” เพื่อสร้าง Certiifacte และ Private Key ให้เครื่อง vpn-client1
[root@vpn-server 2.0]# ./build-key vpn-client1 Generating a 1024 bit RSA private key ........++++++ ..........++++++ writing new private key to 'vpn-client1.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [TH]: State or Province Name (full name) [Nonthaburi]: Locality Name (eg, city) [Pak Kret]: Organization Name (eg, company) [My Company Name]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) [vpn-client1]: Email Address [info@my-vpn-network.com]:
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/share/openvpn/easy-rsa/2.0/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'TH' stateOrProvinceName :PRINTABLE:'Nonthaburi' localityName :PRINTABLE:'Pak Kret' organizationName :PRINTABLE:'My Company Name' commonName :PRINTABLE:'vpn-client1' emailAddress :IA5STRING:'info@my-vpn-network.com' Certificate is to be certified until Oct 29 10:49:13 2018 GMT (3650 days) Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
ตัวอย่างบางส่วนของไฟล์ “vpn-client1.crt” (Certificate ของเครื่อง vpn-client1)
[root@vpn-client1 openvpn]# cat keys/vpn-client1.crt Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) Signature Algorithm: sha1WithRSAEncryption Issuer: C=TH, ST=Nonthaburi, L=Pak Kret, O=My Company Name, CN=My Company Name CA/emailAddress=info@my-vpn-network.com Validity Not Before: Oct 31 10:49:13 2008 GMT Not After : Oct 29 10:49:13 2018 GMT Subject: C=TH, ST=Nonthaburi, L=Pak Kret, O=My Company Name, CN=vpn-client1/emailAddress=info@my-vpn-network.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:c0:... ... Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: Easy-RSA Generated Certificate X509v3 Subject Key Identifier: 35:1C:... X509v3 Authority Key Identifier: keyid:6D:C8:... DirName:/C=TH/ST=Nonthaburi/L=Pak Kret/O=My Company Name/CN=My Company Name CA/emailAddress=info@my-vpn-network.com serial:87:1D:...
X509v3 Extended Key Usage: TLS Web Client Authentication X509v3 Key Usage: Digital Signature Signature Algorithm: sha1WithRSAEncryption 2e:31:... ... -----BEGIN CERTIFICATE----- MIIsTCCx... ... -----END CERTIFICATE-----
ตัวอย่างบางส่วนของไฟล์ “vpn-client1.key” (Private Key ของเครื่อง vpn-client1) ไฟล์นี้ต้องมี permission เป็น 600
[root@vpn-client1 openvpn]# cat keys/vpn-client1.key -----BEGIN RSA PRIVATE KEY----- MIICXBAA ... -----END RSA PRIVATE KEY-----
สรุปตัวอย่างไฟล์ keys ที่ถูกสร้างบน CA
ตัวอย่างไฟล์ keys ทั้งหมดที่สร้างได้บน CA สำหรับเครื่องเซิร์ฟเวอร์ vpn-server และเครื่องไคลเอนต์ vpn-client1, vpn-client2, vpn-client3
[root@vpn-server 2.0]# ls -l keys/ total 100 -rw-r--r-- 1 root root 3922 2008-10-31 17:48 01.pem -rw-r--r-- 1 root root 3805 2008-10-31 17:49 02.pem -rw-r--r-- 1 root root 3805 2008-10-31 17:49 03.pem -rw-r--r-- 1 root root 3805 2008-10-31 17:50 04.pem -rw-r--r-- 1 root root 1245 2008-10-31 17:46 ca.crt -rw------- 1 root root 891 2008-10-31 17:46 ca.key -rw-r--r-- 1 root root 245 2008-10-31 17:50 dh1024.pem -rw-r--r-- 1 root root 463 2008-10-31 17:50 index.txt -rw-r--r-- 1 root root 20 2008-10-31 17:50 index.txt.attr -rw-r--r-- 1 root root 20 2008-10-31 17:49 index.txt.attr.old -rw-r--r-- 1 root root 347 2008-10-31 17:49 index.txt.old -rw-r--r-- 1 root root 3 2008-10-31 17:50 serial -rw-r--r-- 1 root root 3 2008-10-31 17:49 serial.old -rw-r--r-- 1 root root 3805 2008-10-31 17:49 vpn-client1.crt -rw-r--r-- 1 root root 684 2008-10-31 17:49 vpn-client1.csr -rw------- 1 root root 887 2008-10-31 17:49 vpn-client1.key -rw-r--r-- 1 root root 3805 2008-10-31 17:49 vpn-client2.crt -rw-r--r-- 1 root root 684 2008-10-31 17:49 vpn-client2.csr -rw------- 1 root root 887 2008-10-31 17:49 vpn-client2.key -rw-r--r-- 1 root root 3805 2008-10-31 17:50 vpn-client3.crt -rw-r--r-- 1 root root 684 2008-10-31 17:50 vpn-client3.csr -rw------- 1 root root 887 2008-10-31 17:50 vpn-client3.key -rw-r--r-- 1 root root 3922 2008-10-31 17:48 vpn-server.crt -rw-r--r-- 1 root root 684 2008-10-31 17:48 vpn-server.csr -rw------- 1 root root 887 2008-10-31 17:48 vpn-server.key