ในบทความนี้เราจะพิจารณาการติดตั้งและกำหนดค่าเซิร์ฟเวอร์ OpenVPN ที่รันบน Linux CentOS/RHEL (7/8) และแสดงวิธีเชื่อมต่อคอมพิวเตอร์ระยะไกล 2 เครื่อง (หรือสำนักงาน) ที่อยู่เบื้องหลัง NAT เข้าด้วยกันเป็นเครือข่ายเดียวโดยใช้เซิร์ฟเวอร์ OpenVPN ที่กำหนดค่าแล้ว ไคลเอ็นต์ VPN จะได้รับการยืนยันตัวตนโดยใช้ใบรับรอง
VPN เป็นชุดเทคโนโลยีที่ช่วยสร้างเครือข่ายที่ปลอดภัยผ่านเครือข่ายสาธารณะหรืออินเทอร์เน็ต ด้วย VPN คุณสามารถเชื่อมต่ออุปกรณ์หรือเครือข่ายต่างๆ เข้าด้วยกันเป็นเครือข่ายท้องถิ่นที่ปลอดภัยผ่านอินเทอร์เน็ต
OpenVPN เป็นหนึ่งในการใช้งาน VPN แบบโอเพนซอร์สที่ใช้ SSL/TLS และพัฒนาบน OpenSSL ด้วย OpenVPN คุณสามารถเชื่อมต่อทั้งสำนักงานระยะไกลและคอมพิวเตอร์เดี่ยวที่อยู่เบื้องหลังอุปกรณ์ NAT เข้าด้วยกันเป็นเครือข่ายเดียว
ติดตั้ง OpenVPN และ Easy-RSA
ในขั้นตอนแรก คุณต้องเชื่อมที่เก็บ EPEL และอัปเดตโฮสต์:
# yum install epel-release -y
# yum update -y
หลังจากระบบอัปเดตแล้ว ติดตั้ง OpenVPN และ Easy-RSA โดยใช้ตัวจัดการแพ็กเกจ yum (เราจะต้องใช้เพื่อสร้างโครงสร้างสาธารณะ PKI บนเซิร์ฟเวอร์ VPN)
# yum install openvpn easy-rsa -y
วิธีกำหนดค่า Easy-RSA และสร้างใบรับรอง X.509
คัดลอกสคริปต์ easy-rsa ทั้งหมดไปที่ /etc/openvpn/:
# cp -r /usr/share/easy-rsa /etc/openvpn/
ไปที่ /etc/openvpn/easy-rsa/3/ และสร้างไฟล์ vars ที่นั่น:
# cd /etc/openvpn/easy-rsa/3/
# nano vars
เพิ่มเนื้อหาไฟล์ (คุณสามารถปรับเปลี่ยนการตั้งค่าตามต้องการ):
set_var EASYRSA "$PWD" set_var EASYRSA_PKI "$EASYRSA/pki" set_var EASYRSA_DN "cn_only" set_var EASYRSA_REQ_COUNTRY "DE" set_var EASYRSA_REQ_PROVINCE "MUN" set_var EASYRSA_REQ_CITY "BY" set_var EASYRSA_REQ_ORG "WOSHUB" set_var EASYRSA_REQ_EMAIL "vpnadmin@woshub.com" set_var EASYRSA_REQ_OU "IT dept" set_var EASYRSA_KEY_SIZE 4096 set_var EASYRSA_ALGO rsa set_var EASYRSA_CA_EXPIRE 7500 set_var EASYRSA_CERT_EXPIRE 3650 set_var EASYRSA_NS_SUPPORT "no" set_var EASYRSA_NS_COMMENT "CERTIFICATE AUTHORITY" set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types" set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-1.0.cnf" set_var EASYRSA_DIGEST "sha512"
คุณสามารถระบุข้อมูลใดๆ ในไฟล์ได้ จะไม่ส่งผลต่อการกำหนดค่าและการทำงานต่อไปของเซิร์ฟเวอร์
ไฟล์ต้องสามารถรันได้ ดังนั้นรัน:
# chmod +x vars
สร้างใบรับรองและคีย์ OpenVPN
ก่อนสร้างคีย์ ให้เริ่มต้นไดเรกทอรี PKI และสร้างคีย์ CA
# cd /etc/openvpn/easy-rsa/3/
# ./easyrsa init-pki
Note: using Easy-RSA configuration from: ./vars init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /etc/openvpn/easy-rsa/3/pki
สร้างคีย์ CA:
# ./easyrsa build-ca
หลังจากรันคำสั่ง คุณจะต้องป้อนรหัสผ่านเพื่อสร้างคีย์และใบรับรอง คุณจะต้องใช้รหัสผ่านนี้ภายหลังเพื่อลงนามในใบรับรอง

สร้างคีย์เซิร์ฟเวอร์ (ชื่อเซิร์ฟเวอร์คือ vpn.woshub.com):
ตัวเลือก nopass ปิดใช้งานรหัสผ่าน
# ./easyrsa gen-req vpn.woshub.com nopass
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017 Generating a 4096 bit RSA private key .........................++ writing new private key to '/etc/openvpn/easy-rsa/3/pki/private/vpn.woshub.com.key.R4IYCbD1zP' ----- 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. ----- Common Name (eg: your user, host, or server name) [vpn.woshub.com]: Keypair and certificate request completed. Your files are: req: /etc/openvpn/easy-rsa/3/pki/reqs/vpn.woshub.com.req key: /etc/openvpn/easy-rsa/3/pki/private/vpn.woshub.com.key
เมื่อออกใบรับรอง ให้กด Enter ในคอลัมน์ Common Name
ลงนามคีย์ vpn.woshub.com โดยใช้ใบรับรอง CA ของเรา:
# ./easyrsa sign-req server vpn.woshub.com
ในการลงนามใบรับรอง เราจะต้องใช้รหัสผ่านที่ตั้งไว้เมื่อออกใบรับรอง CA:

ตามภาพหน้าจอ คุณจะต้องป้อน yes และ CA รหัสผ่านในกระบวนการ
เพื่อให้แน่ใจว่าใบรับรองถูกสร้างโดยไม่มีข้อผิดพลาด ให้รันคำสั่ง:
# openssl verify -CAfile pki/ca.crt pki/issued/vpn.woshub.com.crt
pki/issued/vpn.woshub.com.crt: OK
ใบรับรองเซิร์ฟเวอร์ OpenVPN ทั้งหมดถูกสร้างแล้ว
- ใบรับรองรูท
pki/ca.crt - คีย์ส่วนตัวเซิร์ฟเวอร์
pki/private/vpn.woshub.com.key - ใบรับรองเซิร์ฟเวอร์
pki/issued/vpn.woshub.com.crt
เพื่อสร้างคีย์ไคลเอ็นต์ ให้รันคำสั่งต่อไปนี้:
# ./easyrsa gen-req client_name nopass
ลองสร้างคีย์ไคลเอ็นต์ admin1:
# ./easyrsa gen-req admin1 nopass
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017 Generating a 4096 bit RSA private key ..........++ writing new private key to '/etc/openvpn/easy-rsa/3/pki/private/admin1.key.R5OY6reT2e' ----- 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. ----- Common Name (eg: your user, host, or server name) [admin1]: Keypair and certificate request completed. Your files are: req: /etc/openvpn/easy-rsa/3/pki/reqs/admin1.req key: /etc/openvpn/easy-rsa/3/pki/private/admin1.key
คุณต้องลงนามโดยใช้ใบรับรอง CA เหมือนคีย์เซิร์ฟเวอร์:
# ./easyrsa sign-req client admin1

ใบรับรองสำหรับผู้ใช้ถูกสร้างแล้ว
เพิ่มเติม คุณต้องสร้างคีย์ Diffie-Hellman สำหรับการแลกเปลี่ยนคีย์:
# ./easyrsa gen-dh
ใช้เวลาบ้างในการสร้าง:

จากนั้นสร้างใบรับรอง TSL:
# openvpn --genkey --secret ta.key
หากในภายหลังเราจะเพิกถอนใบรับรองไคลเอ็นต์ เราต้องสร้างคีย์ CRL:
# ./easyrsa gen-crl
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017 Using configuration from /etc/openvpn/easy-rsa/3/pki/safessl-easyrsa.cnf Enter pass phrase for /etc/openvpn/easy-rsa/3/pki/private/ca.key: An updated CRL has been created. CRL file: /etc/openvpn/easy-rsa/3/pki/crl.pem
เพื่อเพิกถอนใบรับรอง ให้รันคำสั่ง:
./easyrsa revoke admin1 — ที่ admin1 คือชื่อใบรับรอง
ใบรับรองที่จำเป็นถูกสร้างแล้ว ตอนนี้คัดลอกไปยังไดเรกทอรีทำงาน
นี่คือใบรับรองเซิร์ฟเวอร์:
# cp pki/ca.crt /etc/openvpn/server/
# cp pki/issued/vpn.woshub.com.crt /etc/openvpn/server/
# cp pki/private/vpn.woshub.com.key /etc/openvpn/server/
# cp pki/private/dh.pem /etc/openvpn/server/
# cp pki/private/ta.key /etc/openvpn/server/
# cp pki/crl.pem /etc/openvpn/server/
นี่คือใบรับรองไคลเอ็นต์:
# cp pki/issued/admin1.crt /etc/openvpn/client/
# cp pki/private/admin1.key /etc/openvpn/client/
ไฟล์กำหนดค่าเซิร์ฟเวอร์ OpenVPN, กฎไฟร์วอลล์
มาตั้งค่าไฟล์กำหนดค่า OpenVPN ก่อนอื่น สร้างไฟล์กำหนดค่า OpenVPN server.conf:
# cd /etc/openvpn/ && nano server.conf
เปลี่ยนเนื้อหาไฟล์ดังนี้:
# Specify the port, protocol and device port 1194 proto udp dev tun # Specify the paths to the server certificates ca /etc/openvpn/server/ca.crt cert /etc/openvpn/server/vpn.woshub.com.crt key /etc/openvpn/server/vpn.woshub.com.key # Paths to key CRL and DH dh /etc/openvpn/server/dh.pem crl-verify /etc/openvpn/server/crl.pem # Specify the IP settings of the network VPN clients will get addresses from server 10.1.2.0 255.255.255.0 push "redirect-gateway def1" # Specify the assigned DNS servers push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" # Allow connection to different clients with the same key duplicate-cn # TLS protection tls-auth /etc/openvpn/server/ta.key 0 cipher AES-256-CBC tls-version-min 1.2 tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256 auth SHA512 auth-nocache # Other configuration details keepalive 20 60 persist-key persist-tun comp-lzo yes daemon user nobody group nobody # Path to the log file log-append /var/log/openvpn.log verb 3
จากนั้นบันทึกไฟล์ ผมระบุพอร์ต UDP เริ่มต้น 1194 สำหรับเซิร์ฟเวอร์ VPN แต่คุณสามารถระบุพอร์ตว่างใดๆ บนเซิร์ฟเวอร์ของคุณสำหรับ OpenVPN ได้
ตอนนี้เหลือแค่ตั้งค่ากฎไฟร์วอลล์เพื่ออนุญาตการเชื่อมต่อและการเส้นทางระหว่างเซ็กเมนต์
หากคุณใช้ firewalld ให้เปิดใช้งานโมดูลเคอร์เนล forwarding ก่อน:
# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
# sysctl -p
net.ipv4.ip_forward = 1
เพิ่มบริการ openvpn ให้ firewalld และอินเตอร์เฟซ tun0 เข้าสู่โซนที่เชื่อถือได้:
# firewall-cmd --permanent --add-service=openvpn
# firewall-cmd --permanent --zone=trusted --add-interface=tun0
เปิดใช้งาน 'MASQUERADE' สำหรับโซน trusted ของ firewalld:
# firewall-cmd --permanent --zone=trusted --add-masquerade
เปิดใช้งาน NAT:
# firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.1.2.0/24 -o Server_IP -j MASQUERADE
# firewall-cmd –reload
หากคุณใช้ iptables โดยไม่มี firewalld ให้รันคำสั่งเหล่านี้:
# iptables -t nat -A POSTROUTING -s 10.1.2.0/24 -o eth0 -j MASQUERADE
# iptables -A INPUT -p udp –dport 1194 -j ACCEPT
# service iptables save
รันบริการ OpenVPN และเพิ่มเข้าไปในการเริ่มต้น:
# systemctl start openvpn@server
# systemctl enable openvpn@server
ตรวจสอบว่าพอร์ต udp\1194 กำลังฟังโดยบริการ openvpn:
# lsof -i:1194
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME openvpn 12327 nobody 5u IPv4 45122 0t0 UDP *:openvpn
ตรวจสอบการตั้งค่า IP ของอินเตอร์เฟซเครือข่าย:
# ip a
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet 10.1.2.1 peer 10.1.2.2/32 scope global tun0 valid_lft forever preferred_lft forever
ตามที่เห็น เครือข่ายที่ระบุระหว่างการกำหนดค่าถูกเพิ่มเข้าไปในอุปกรณ์ tun0
นี่คือการตั้งค่าขั้นต่ำเพื่อให้ OpenVPN ทำงานได้
วิธีเชื่อมต่อสำนักงานหลายแห่ง (คอมพิวเตอร์) โดยใช้ OpenVPN
มาดูวิธีเชื่อมต่อกับเซิร์ฟเวอร์ OpenVPN จากคอมพิวเตอร์ระยะไกล 2 เครื่องที่มีการเข้าถึงอินเทอร์เน็ตผ่าน NAT และรวมเข้าด้วยกันเป็นเครือข่ายเดียว ในการเชื่อมต่อจากคอมพิวเตอร์ที่รัน Windows ไปยังเซิร์ฟเวอร์ OpenVPN ผมใช้ไคลเอ็นต์อย่างเป็นทางการ คุณสามารถดาวน์โหลดได้จากเว็บไซต์อย่างเป็นทางการ แต่เราจะไม่อธิบายรายละเอียดและจะไปตรงไปที่การกำหนดค่า
หลังจากที่คุณติดตั้งไคลเอ็นต์แล้ว ให้ไปสร้างไฟล์กำหนดค่าที่นี่:
C:\Program Files\OpenVPN\config\
ผมสร้างไฟล์ชื่อ client และเพิ่มเนื้อหาต่อไปนี้:
client dev tun proto udp remote 112.113.114.15 1194 resolv-retry infinite nobind block-outside-dns persist-key persist-tun mute-replay-warnings remote-cert-tls server tls-client auth SHA512 tls-auth "C:\\Program Files\\OpenVPN\\config\\ta.key" 1 remote-cert-eku "TLS Web Server Authentication" ca "C:\\Program Files\\OpenVPN\\config\\ca.crt" cert "C:\\Program Files\\OpenVPN\\config\\admin1.crt" key "C:\\Program Files\\OpenVPN\\config\\admin1.key" cipher AES-256-CBC comp-lzo verb 3
ในการกำหนดค่า เราจะต้องการใบรับรองไคลเอ็นต์ ความปลอดภัย และเซิร์ฟเวอร์ที่เราสร้างไว้ก่อนหน้านี้ คุณต้องดาวน์โหลดจากเซิร์ฟเวอร์ของคุณและวางในโฟลเดอร์ท้องถิ่น แล้วระบุพาธไปยังพวกเขาในไฟล์กำหนดค่าไคลเอ็นต์ OpenVPN
จากนั้นคุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้โดยคลิกไอคอน OpenVPN ในถาดระบบ:

ผมเชื่อมต่อและได้ที่อยู่ IP สำหรับอุปกรณ์ของฉัน:
IPv4 address. . . . . . . . . . . . : 10.1.2.14 Subnet mask . . . . . . . . . . : 255.255.255.0
บนคอมพิวเตอร์ที่สองเบื้องหลัง NAT ผมทำการเดียวกันและสร้างใบรับรองสำหรับผู้ใช้คนที่สองล่วงหน้า หลังจากเชื่อมต่อ คอมพิวเตอร์ที่สองก็ได้ที่อยู่ IP จากเครือข่าย VPN:
IPv4 address. . . . . . . . . . . . : 10.1.2.16 Subnet mask . . . . . . . . . . : 255.255.255.0
หลังจากเชื่อมต่อ ทั้งสองคอมพิวเตอร์อยู่ในเครือข่ายเดียวกันและเห็นกัน
Ping คอมพิวเตอร์ที่สอง:
Pinging 10.1.2.16 with 32 bytes of data: Reply from 10.1.2.16: bytes=32 time=73ms TTL=127
Ping บนคอมพิวเตอร์แรก:
Pinging 10.1.2.14 with 32 bytes of data: Reply from 10.1.2.14: bytes=32 time=79ms TTL=127
ไคลเอ็นต์ VPN ที่เชื่อมต่อทั้งสองสามารถส่งแพ็กเก็ตและโอนไฟล์โดยตรงไปยังกันและกันได้ ดังนั้นเราจึงสามารถรวมอุปกรณ์สองเครื่องที่ตั้งอยู่ในสถานที่ต่างๆ ของประเทศเข้าด้วยกันเป็นเครือข่ายท้องถิ่นเดียว
คุณสามารถสร้างคีย์หรือใบรับรองสำหรับผู้ใช้จำนวนไม่จำกัดบนเซิร์ฟเวอร์ OpenVPN ของคุณ หากคุณต้องการใบรับรองใหม่ ให้รันคำสั่งเหล่านี้สำหรับ /etc/openvpn/easy-rsa/3:
# ./easyrsa gen-req clientname nopass
# ./easyrsa sign-req client clientname
อย่าลืมเพิกถอนใบรับรองไคลเอ็นต์หากไม่ได้ใช้งาน เพื่อรักษาความปลอดภัยของเครือข่ายของคุณ