โปรแกรมติดตั้ง OpenVPN สำหรับ Debian, Ubuntu, Fedora, CentOS, Arch Linux, Oracle Linux, Rocky Linux และ AlmaLinux
สคริปต์นี้จะช่วยให้คุณตั้งค่าเซิร์ฟเวอร์ VPN ที่ปลอดภัยของคุณเองได้ในเวลาเพียงไม่กี่วินาที
คุณยังสามารถลองใช้ wireguard-install ซึ่งเป็นตัวติดตั้งที่เรียบง่ายสำหรับโปรโตคอล VPN ที่ง่ายกว่า ปลอดภัยกว่า เร็วกว่าและทันสมัยกว่า
ขั้นแรก รับสคริปต์และทำให้สามารถเรียกใช้งานได้:
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
จากนั้นเรียกใช้:
./openvpn-install.sh
คุณต้องรันสคริปต์ในฐานะรูทและเปิดใช้งานโมดูล TUN
ครั้งแรกที่คุณเปิดใช้งาน คุณจะต้องติดตามผู้ช่วยและตอบคำถามสองสามข้อเพื่อตั้งค่าเซิร์ฟเวอร์ VPN ของคุณ
เมื่อติดตั้ง OpenVPN แล้ว คุณสามารถเรียกใช้สคริปต์ได้อีกครั้ง และคุณจะได้รับตัวเลือกให้:
ในโฮมไดเร็กตอรี่ของคุณ คุณจะมีไฟล์ .ovpn
นี่คือไฟล์การกำหนดค่าไคลเอนต์ ดาวน์โหลดจากเซิร์ฟเวอร์ของคุณและเชื่อมต่อโดยใช้ไคลเอนต์ OpenVPN ที่คุณชื่นชอบ
หากคุณมีคำถามใดๆ ให้ไปที่คำถามที่พบบ่อยก่อน โปรดอ่านทุกอย่างก่อนเปิดประเด็น
โปรดอย่าส่งอีเมลหรือข้อความส่วนตัวมาขอความช่วยเหลือถึงฉัน ที่เดียวที่จะได้รับความช่วยเหลือคือปัญหา บุคคลอื่นอาจสามารถช่วยได้ และในอนาคต ผู้ใช้รายอื่นอาจประสบปัญหาเดียวกันกับคุณเช่นกัน เวลาของฉันไม่มีให้ฟรีสำหรับคุณคนเดียว คุณไม่ใช่คนพิเศษ
นอกจากนี้ยังสามารถรันสคริปต์แบบไม่มีส่วนหัวได้ เช่น โดยไม่ต้องรอให้ผู้ใช้ป้อนข้อมูล ในลักษณะอัตโนมัติ
ตัวอย่างการใช้งาน:
AUTO_INSTALL=y ./openvpn-install.sh
# or
export AUTO_INSTALL=y
./openvpn-install.sh
จากนั้นชุดตัวแปรเริ่มต้นจะถูกตั้งค่า โดยผ่านความต้องการอินพุตของผู้ใช้
หากคุณต้องการปรับแต่งการติดตั้ง คุณสามารถส่งออกหรือระบุในบรรทัดเดียวกัน ดังที่แสดงด้านบน
APPROVE_INSTALL=y
APPROVE_IP=y
IPV6_SUPPORT=n
PORT_CHOICE=1
PROTOCOL_CHOICE=1
DNS=1
COMPRESSION_ENABLED=n
CUSTOMIZE_ENC=n
CLIENT=clientname
PASS=1
หากเซิร์ฟเวอร์อยู่หลัง NAT คุณสามารถระบุจุดสิ้นสุดด้วยตัวแปร ENDPOINT
หากจุดสิ้นสุดเป็นที่อยู่ IP สาธารณะที่อยู่ด้านหลัง คุณสามารถใช้ ENDPOINT=$(curl -4 ifconfig.co)
(สคริปต์จะใช้ค่าเริ่มต้นเป็นค่านี้) ตำแหน่งข้อมูลอาจเป็น IPv4 หรือโดเมน
ตัวแปรอื่นๆ สามารถตั้งค่าได้ขึ้นอยู่กับตัวเลือกของคุณ (การเข้ารหัส การบีบอัด) คุณสามารถค้นหาได้ในฟังก์ชัน installQuestions()
ของสคริปต์
วิธีการติดตั้งแบบ headless ไม่รองรับไคลเอ็นต์ที่มีการป้องกันด้วยรหัสผ่าน เนื่องจาก Easy-RSA คาดหวังการป้อนข้อมูลของผู้ใช้
การติดตั้งแบบไม่มีส่วนหัวนั้นมีประโยชน์ไม่มากก็น้อย เนื่องจากทำให้ทำงานได้อย่างปลอดภัยหลายครั้งด้วยพารามิเตอร์เดียวกัน เช่น โดยตัวจัดเตรียมสถานะ เช่น Ansible/Terraform/Salt/Chef/Puppet โดยจะติดตั้งและสร้าง Easy-RSA PKI ใหม่เฉพาะในกรณีที่ยังไม่มี และจะติดตั้ง OpenVPN และการอ้างอิงอัปสตรีมอื่นๆ หากยังไม่ได้ติดตั้ง OpenVPN มันจะสร้างการกำหนดค่าในเครื่องทั้งหมดใหม่และสร้างไฟล์ไคลเอนต์ใหม่ในการรันแบบไม่มีหัวแต่ละครั้ง
นอกจากนี้ยังสามารถเพิ่มผู้ใช้ใหม่โดยอัตโนมัติได้อีกด้วย สิ่งสำคัญในที่นี้คือการจัดเตรียมค่า (สตริง) ของตัวแปร MENU_OPTION
พร้อมด้วยตัวแปรบังคับที่เหลือก่อนที่จะเรียกใช้สคริปต์
สคริปต์ Bash ต่อไปนี้จะเพิ่มผู้ใช้ใหม่ foo
ในการกำหนดค่า OpenVPN ที่มีอยู่
#! /bin/bash
export MENU_OPTION= " 1 "
export CLIENT= " foo "
export PASS= " 1 "
./openvpn-install.sh
nobody
/ nogroup
สคริปต์รองรับการแจกแจง Linux เหล่านี้:
สนับสนุน | |
---|---|
อัลมาลินุกซ์ 8 | |
อเมซอน ลินุกซ์ 2 | |
อาร์ค ลินุกซ์ | |
เซนโอเอส 7 | |
สตรีม CentOS >= 8 | ? |
เดเบียน >= 10 | ? |
หมวกฟาง >= 35 | ? |
ออราเคิลลินุกซ์ 8 | |
ร็อคกี้ลินุกซ์ 8 | |
อูบุนตู >= 18.04 | ? |
ที่ควรทราบ:
amd64
เท่านั้นsystemd
สคริปต์นี้อิงจากผลงานอันยอดเยี่ยมของ Nyr และผู้มีส่วนร่วม
ตั้งแต่ปี 2016 สคริปต์ทั้งสองมีความแตกต่างกันและไม่เหมือนกันอีกต่อไป โดยเฉพาะอย่างยิ่งภายใต้ฝากระโปรง เป้าหมายหลักของสคริปต์คือการปรับปรุงความปลอดภัย แต่ตั้งแต่นั้นเป็นต้นมา สคริปต์ก็ถูกเขียนใหม่ทั้งหมดและมีการเพิ่มฟีเจอร์ต่างๆ มากมาย สคริปต์นี้ใช้งานได้กับเวอร์ชันล่าสุดเท่านั้น ดังนั้นหากคุณจำเป็นต้องใช้เซิร์ฟเวอร์หรือไคลเอนต์ที่เก่ามาก ฉันขอแนะนำให้ใช้สคริปต์ของ Nyr
คำถาม & คำตอบเพิ่มเติมใน FAQ.md
ถาม: คุณแนะนำผู้ให้บริการรายใด
ตอบ: ฉันขอแนะนำสิ่งเหล่านี้:
ถาม: ไคลเอนต์ OpenVPN ตัวใดที่คุณแนะนำ?
ตอบ: หากเป็นไปได้ ไคลเอนต์ OpenVPN 2.4 อย่างเป็นทางการ
openvpn
จากการแจกจ่ายของคุณ มีพื้นที่เก็บข้อมูล APT อย่างเป็นทางการสำหรับการแจกแจงแบบ Debian/Ubuntuถาม: ฉันจะปลอดภัยจาก NSA โดยใช้สคริปต์ของคุณหรือไม่
ตอบ: โปรดตรวจสอบโมเดลภัยคุกคามของคุณ แม้ว่าสคริปต์นี้จะคำนึงถึงความปลอดภัยและใช้การเข้ารหัสที่ล้ำสมัย คุณไม่ควรใช้ VPN หากคุณต้องการซ่อนตัวจาก NSA
ถาม: มีเอกสาร OpenVPN หรือไม่
ตอบ: ได้ โปรดไปที่คู่มือ OpenVPN ซึ่งอ้างอิงถึงตัวเลือกทั้งหมด
คำถาม & คำตอบเพิ่มเติมใน FAQ.md
โซลูชันที่จัดเตรียมเซิร์ฟเวอร์ OpenVPN ที่พร้อมใช้งานตามสคริปต์นี้ในครั้งเดียวมีให้สำหรับ:
openvpn-terraform-install
openvpn-ephemeral
โปรดเปิดประเด็นก่อนส่ง PR หากคุณต้องการหารือเกี่ยวกับการเปลี่ยนแปลง โดยเฉพาะอย่างยิ่งหากเป็นเรื่องใหญ่
เราใช้เชลล์เช็คและ shfmt เพื่อบังคับใช้แนวทางการจัดสไตล์ bash และแนวปฏิบัติที่ดี การดำเนินการเหล่านี้จะดำเนินการสำหรับแต่ละคอมมิต / PR ด้วย GitHub Actions ดังนั้นคุณจึงตรวจสอบการกำหนดค่าได้ที่นี่
คำเตือน ยังไม่ได้รับการอัปเดตสำหรับ OpenVPN 2.5 และใหม่กว่า
การตั้งค่าเริ่มต้นของ OpenVPN ค่อนข้างอ่อนแอในเรื่องการเข้ารหัส สคริปต์นี้มีจุดมุ่งหมายเพื่อปรับปรุงสิ่งนั้น
OpenVPN 2.4 เป็นการอัปเดตที่ยอดเยี่ยมเกี่ยวกับการเข้ารหัส เพิ่มการรองรับ ECDSA, ECDH, AES GCM, NCP และ tls-crypt
หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกที่กล่าวถึงด้านล่าง โปรดไปที่คู่มือ OpenVPN มันสมบูรณ์มาก
สิ่งที่เกี่ยวข้องกับการเข้ารหัสของ OpenVPN ส่วนใหญ่ได้รับการจัดการโดย Easy-RSA พารามิเตอร์เริ่มต้นอยู่ในไฟล์ vars.example
ตามค่าเริ่มต้น OpenVPN จะไม่เปิดใช้งานการบีบอัด สคริปต์นี้ให้การสนับสนุนอัลกอริธึม LZ0 และ LZ4 (v1/v2) ซึ่งอันหลังมีประสิทธิภาพมากกว่า
อย่างไรก็ตาม ไม่แนะนำให้ใช้การบีบอัดเนื่องจากการโจมตี VORACLE ใช้ประโยชน์จากการบีบอัดดังกล่าว
OpenVPN ยอมรับ TLS 1.0 เป็นค่าเริ่มต้น ซึ่งมีอายุเกือบ 20 ปี
ด้วย tls-version-min 1.2
เราบังคับใช้ TLS 1.2 ซึ่งเป็นโปรโตคอลที่ดีที่สุดสำหรับ OpenVPN ในปัจจุบัน
รองรับ TLS 1.2 ตั้งแต่ OpenVPN 2.3.3
OpenVPN ใช้ใบรับรอง RSA พร้อมคีย์ 2048 บิตตามค่าเริ่มต้น
OpenVPN 2.4 เพิ่มการรองรับ ECDSA การเข้ารหัสแบบ Elliptic Curve เร็วขึ้น เบากว่า และปลอดภัยยิ่งขึ้น
สคริปต์นี้ให้:
prime256v1
/ secp384r1
/ secp521r1
3072
: 4096
บิต 2048
โดยค่าเริ่มต้นจะเป็น ECDSA ด้วย prime256v1
OpenVPN ใช้ SHA-256
เป็นแฮชลายเซ็นตามค่าเริ่มต้น และสคริปต์ก็ใช้เช่นกัน ตอนนี้ไม่มีทางเลือกอื่นแล้ว
ตามค่าเริ่มต้น OpenVPN จะใช้ BF-CBC
เป็นรหัสช่องสัญญาณข้อมูล ปักเป้าเป็นอัลกอริธึมเก่า (1993) และอ่อนแอ แม้แต่เอกสาร OpenVPN อย่างเป็นทางการก็ยังยอมรับ
ค่าเริ่มต้นคือ BF-CBC ซึ่งเป็นคำย่อของ Blowfish ในโหมด Cipher Block Chaining
ไม่แนะนำให้ใช้ BF-CBC อีกต่อไป เนื่องจากมีบล็อกขนาด 64 บิต บล็อกขนาดเล็กนี้อนุญาตให้มีการโจมตีโดยอิงจากการชน ดังแสดงโดย SWEET32 ดู https://community.openvpn.net/openvpn/wiki/SWEET32 สำหรับรายละเอียด นักวิจัยด้านความปลอดภัยที่ INRIA เผยแพร่การโจมตีบล็อกไซเฟอร์ 64 บิต เช่น 3DES และ Blowfish พวกเขาแสดงให้เห็นว่าพวกเขาสามารถกู้คืนข้อความธรรมดาได้เมื่อมีการส่งข้อมูลเดียวกันบ่อยเพียงพอ และแสดงให้เห็นว่าพวกเขาสามารถใช้ช่องโหว่สคริปต์ข้ามไซต์เพื่อส่งข้อมูลที่สนใจได้บ่อยเพียงพอได้อย่างไร สิ่งนี้ใช้ได้กับ HTTPS แต่ยังใช้ได้กับ HTTP-over-OpenVPN ด้วย ดู https://sweet32.info/ สำหรับคำอธิบายที่ดีและละเอียดยิ่งขึ้น
รหัสเริ่มต้นของ OpenVPN คือ BF-CBC ได้รับผลกระทบจากการโจมตีนี้
แท้จริงแล้ว AES คือมาตรฐานในปัจจุบัน เป็นการเข้ารหัสที่เร็วและปลอดภัยยิ่งขึ้นในปัจจุบัน SEED และ Camellia ไม่เสี่ยงในปัจจุบัน แต่จะช้ากว่า AES และค่อนข้างเชื่อถือได้น้อยกว่า
ในบรรดารหัสที่รองรับในปัจจุบัน OpenVPN แนะนำให้ใช้ AES-256-CBC หรือ AES-128-CBC OpenVPN 2.4 และใหม่กว่าจะรองรับ GCM ด้วย สำหรับ 2.4+ เราขอแนะนำให้ใช้ AES-256-GCM หรือ AES-128-GCM
AES-256 ช้ากว่า AES-128 ถึง 40% และไม่มีเหตุผลที่แท้จริงที่จะใช้คีย์ 256 บิตบนคีย์ 128 บิตกับ AES (ที่มา: 1,2) นอกจากนี้ AES-256 ยังเสี่ยงต่อการโจมตีแบบ Timing มากกว่า
AES-GCM เป็นรหัส AEAD ซึ่งหมายความว่าจะให้การรับประกันการรักษาความลับ ความสมบูรณ์ และความถูกต้องของข้อมูลไปพร้อมๆ กัน
สคริปต์รองรับการเข้ารหัสต่อไปนี้:
AES-128-GCM
AES-192-GCM
AES-256-GCM
AES-128-CBC
AES-192-CBC
AES-256-CBC
และค่าเริ่มต้นเป็น AES-128-GCM
OpenVPN 2.4 เพิ่มคุณสมบัติที่เรียกว่า "NCP": Negotiable Crypto parameters หมายความว่าคุณสามารถจัดเตรียมชุดการเข้ารหัสเหมือนกับ HTTPS ได้ มันถูกตั้งค่าเป็น AES-256-GCM:AES-128-GCM
ตามค่าเริ่มต้น และแทนที่พารามิเตอร์ --cipher
เมื่อใช้กับไคลเอนต์ OpenVPN 2.4 เพื่อความเรียบง่าย สคริปต์จึงตั้งค่าทั้ง --cipher
และ --ncp-cipher
เป็นรหัสที่เลือกไว้ด้านบน
OpenVPN 2.4 จะเจรจาต่อรองรหัสที่ดีที่สุดตามค่าเริ่มต้น (เช่น ECDHE+AES-256-GCM)
สคริปต์เสนอตัวเลือกต่อไปนี้ ขึ้นอยู่กับใบรับรอง:
TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384
TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256
TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
โดยมีค่าเริ่มต้นเป็น TLS-ECDHE-*-WITH-AES-128-GCM-SHA256
OpenVPN ใช้คีย์ DH 2048 บิตเป็นค่าเริ่มต้น
OpenVPN 2.4 เพิ่มการรองรับคีย์ ECDH การเข้ารหัสแบบ Elliptic Curve เร็วขึ้น เบากว่า และปลอดภัยยิ่งขึ้น
นอกจากนี้ การสร้างคีย์ DH แบบคลาสสิกยังอาจใช้เวลานานอีกด้วย คีย์ ECDH เป็นเพียงชั่วคราว: คีย์เหล่านี้สร้างขึ้นทันที
สคริปต์มีตัวเลือกต่อไปนี้:
prime256v1
/ secp384r1
/ secp521r1
4096
3072
2048
โดยค่าเริ่มต้นจะเป็น prime256v1
จากวิกิ OpenVPN เกี่ยวกับ --auth
:
ตรวจสอบความถูกต้องของแพ็คเก็ตช่องสัญญาณข้อมูลและ (หากเปิดใช้งาน) แพ็คเก็ตช่องสัญญาณควบคุม tls-auth ด้วย HMAC โดยใช้อัลกอริธึมการแยกข้อความ alg (ค่าเริ่มต้นคือ SHA1 ) HMAC เป็นอัลกอริธึมการรับรองความถูกต้องของข้อความ (MAC) ที่ใช้กันทั่วไปซึ่งใช้สตริงข้อมูล อัลกอริธึมแฮชที่ปลอดภัย และคีย์ เพื่อสร้างลายเซ็นดิจิทัล
หากเลือกโหมดการเข้ารหัส AEAD (เช่น GCM) อัลกอริธึม --auth ที่ระบุจะถูกละเว้นสำหรับช่องข้อมูล และวิธีการตรวจสอบความถูกต้องของการเข้ารหัส AEAD จะถูกนำไปใช้แทน โปรดทราบว่า alg ยังคงระบุการแยกย่อยที่ใช้สำหรับ tls-auth
สคริปต์มีตัวเลือกต่อไปนี้:
SHA256
SHA384
SHA512
โดยมีค่าเริ่มต้นเป็น SHA256
tls-auth
และ tls-crypt
จากวิกิ OpenVPN เกี่ยวกับ tls-auth
:
เพิ่มเลเยอร์การรับรองความถูกต้อง HMAC เพิ่มเติมที่ด้านบนของช่องควบคุม TLS เพื่อลดการโจมตี DoS และการโจมตีบนสแต็ก TLS
โดยสรุป --tls-auth เปิดใช้งาน "ไฟร์วอลล์ HMAC" ชนิดหนึ่งบนพอร์ต TCP/UDP ของ OpenVPN โดยที่แพ็กเก็ตช่องสัญญาณควบคุม TLS ที่มีลายเซ็น HMAC ที่ไม่ถูกต้องสามารถถูกทิ้งทันทีโดยไม่มีการตอบสนอง
เกี่ยวกับ tls-crypt
:
เข้ารหัสและรับรองความถูกต้องของแพ็กเก็ตช่องสัญญาณควบคุมทั้งหมดด้วยคีย์จากคีย์ไฟล์ (ดู --tls-auth สำหรับความเป็นมาเพิ่มเติม)
การเข้ารหัส (และการรับรองความถูกต้อง) แพ็กเก็ตช่องสัญญาณควบคุม:
- ให้ความเป็นส่วนตัวมากขึ้นด้วยการซ่อนใบรับรองที่ใช้สำหรับการเชื่อมต่อ TLS
- ทำให้ยากต่อการระบุการรับส่งข้อมูล OpenVPN เช่นนี้
- ให้การรักษาความปลอดภัยหลังควอนตัม "คนจน" แก่ผู้โจมตีที่ไม่เคยรู้คีย์ที่แชร์ล่วงหน้า (เช่น ไม่มีการส่งต่อความลับ)
ดังนั้นทั้งสองจึงมอบการรักษาความปลอดภัยเพิ่มเติมอีกชั้นและลดการโจมตี DoS OpenVPN จะไม่ถูกใช้เป็นค่าเริ่มต้น
tls-crypt
เป็นฟีเจอร์ OpenVPN 2.4 ที่ให้การเข้ารหัสนอกเหนือจากการตรวจสอบสิทธิ์ (ต่างจาก tls-auth
) เป็นมิตรกับความเป็นส่วนตัวมากขึ้น
สคริปต์รองรับทั้งสองอย่างและใช้ tls-crypt
เป็นค่าเริ่มต้น
คุณสามารถพูดขอบคุณได้ถ้าคุณต้องการ!
ขอขอบคุณผู้มีส่วนร่วมและผลงานต้นฉบับของ Nyr มาก
โครงการนี้อยู่ภายใต้ใบอนุญาต MIT