Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Linux

ติดตั้งและกำหนดค่า OpenVPN Server บน Linux CentOS/RHEL

ในบทความนี้เราจะพิจารณาการติดตั้งและกำหนดค่าเซิร์ฟเวอร์ 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

หลังจากรันคำสั่ง คุณจะต้องป้อนรหัสผ่านเพื่อสร้างคีย์และใบรับรอง คุณจะต้องใช้รหัสผ่านนี้ภายหลังเพื่อลงนามในใบรับรอง

ติดตั้งและกำหนดค่า OpenVPN Server บน Linux CentOS/RHEL

สร้างคีย์เซิร์ฟเวอร์ (ชื่อเซิร์ฟเวอร์คือ 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:

ติดตั้งและกำหนดค่า OpenVPN Server บน Linux CentOS/RHEL

ตามภาพหน้าจอ คุณจะต้องป้อน 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

ติดตั้งและกำหนดค่า OpenVPN Server บน Linux CentOS/RHEL

ใบรับรองสำหรับผู้ใช้ถูกสร้างแล้ว

เพิ่มเติม คุณต้องสร้างคีย์ Diffie-Hellman สำหรับการแลกเปลี่ยนคีย์:

# ./easyrsa gen-dh

ใช้เวลาบ้างในการสร้าง:

ติดตั้งและกำหนดค่า OpenVPN Server บน Linux CentOS/RHEL

จากนั้นสร้างใบรับรอง 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 ในถาดระบบ:

ติดตั้งและกำหนดค่า OpenVPN Server บน Linux CentOS/RHEL

ผมเชื่อมต่อและได้ที่อยู่ 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

อย่าลืมเพิกถอนใบรับรองไคลเอ็นต์หากไม่ได้ใช้งาน เพื่อรักษาความปลอดภัยของเครือข่ายของคุณ