บทความนี้ปรับจากส่วนของคอร์ส Pluralsight ใหม่ของผม "Connecting On-prem Resources to your AWS Infrastructure"
คุณบางครั้งต้องเชื่อมต่อทรัพยากรที่รันบน Amazon Web Services? เข้าถึง Public EC2 Instances ด้วย SSH และเข้ารหัส S3 Data เพียงพอต่อความปลอดภัย แตะการเข้าถึง RDS Database Instance ด้านหลัง หรือทำงานกับ AWS Data ที่ไม่ใช่ Public? มีหลายเหตุผลที่ Admin เก็บทรัพยากรแบบนี้ไกลจากสาธารณะ แตถ้าคุณเข้าถึงไม่ได้ตอนต้องการ มันดีอย่างไร?
คุณต้องหาวิธีปลอดภัยและน่าเชื่อถือ繞过 ACLs และ Security Groups ที่ปกป้องของคุณ โซลูชันหนึ่งที่ผมครอบคลุมในคอร์ส "Connecting On-prem Resources to your AWS Infrastructure" บน Pluralsight คือ Direct Connect แตถ้าราคา Direct Connect แพงเกินงบจัดซื้อ VPN Tunnel บางประเภทอาจทำงานได้
Virtual Private Network (VPN) คืออะไร?
VPN มักใช้เพื่ออนุญาตกิจกรรมเครือข่ายที่ถูกจำกัด หรือการเล่นเน็ตไม่ระบุตัวตน แตบทความนี้ไม่ได้เกี่ยวกับนั้น
VPN คือการเชื่อมต่อ Point-to-Point ให้คุณย้ายข้อมูลปลอดภัยระหว่าง 2 ไซต์ ผ่าน Public Network โดยผลลัพธ์ Tunnel สามารถออกแบบรวม Private Sites 2 แห่งที่ห่างทางภูมิศาสตร์ กลายเป็น Private Network เดียว ในบริบทของเรา หมายถึง เชื่อม Office Network ท้องถิ่นกับ AWS VPC ที่โฮสต์ Private Resources
มี 2 วิธี:
- Managed VPN Connection สร้างบน AWS Virtual Private Gateway
- ใช้ VPN ของตัวเอง
บทความนี้เน้นวิธี DIY
The OpenVPN Access Server
как подразумевает название, OpenVPN เป็นโครงการ Open Source คุณโหลด Community Edition ฟรี และตั้งค่า VPN Server เองได้ แตบริษัท OpenVPN ยังให้ OpenVPN Access Server เฉพาะเจาะจง เป็น EC2 AMI พร้อม AWS-friendly Integration และ Automated Configuration Tools
จากที่เห็น Launch AMI ภายใน AWS VPC และเปิดให้ Remote Connections ควบคุมได้ กลายเป็นวิธี "ถูกต้อง" สำหรับงานนี้
ราคาเท่าไหร่? ถ้าแค่ทดสอบ และไม่วางแผนเข้าถึง VPN มากกว่า 2 Connections พร้อมกัน AMI ฟรี คุณยังจ่ายค่า EC2 Instance ปกติ แตถ้าบัญชียังได้ Free Tier EC2 ฟรีได้ด้วย
ตอนนำ VPN ไป Production จริง License ที่ซื้อ ขึ้นอยู่กับ Concurrent Connections ที่ต้องการ หน้านี้มีรายละเอียด
นี่คือสิ่งที่เราจะทำในคู่มือ:
- เลือก Provision และ Launch Ubuntu AMI พร้อม OpenVPN Access Server Pre-installed เข้า VPC ของผม
- เข้าถึง Server ด้วย SSH และตั้งค่า VPN
- ตั้งค่า Admin User
- ตั้งค่า Local Machine เป็น OpenVPN Client และเชื่อมต่อ Private Instance ใน AWS VPC ของผม
พร้อมไหม?
Launching an OpenVPN Access Server
จาก EC2 Dashboard — ตรวจสอบว่า Region ถูกต้อง — Launch Instance ทำหน้าที่ VPN Server แทนที่จะใช้ Quick Start AMIs ผมคลิกแท็บ AWS Marketplace ค้นหา "openvpn access server" OpenVPN ให้ Official Images หลายตัว ผูกกับ License ให้ Connected Clients เพิ่มขึ้น
ผมเลือก Ubuntu Image ที่ทำงานแบบ "Bring Your Own License" ตามที่เขียน ไม่ต้องการ License สำหรับสิ่งที่จะทำ

เลือก AMI เปิด Popup บอกค่าใช้จ่ายต่อชั่วโมง Instance Types และ EBS Storage ต่างๆ นี่คือค่าใช้จ่าย AWS Infrastructure ปกติ ไม่รวม License Fees

Instance Type ผม Downgrade เป็น t2.micro อยู่ใน Free Tier Production Server ที่วุ่นวายอาจต้องการ Power มากกว่า
เพราะจะ Start Instance ที่ 2 ใน Subnet เดียวกันในไม่กี่นาที ผมเลือก "us-east-1b" จากหน้า Configure Instance Details และจดไว้

หน้า Security Group เป็นที่ที่ OpenVPN AMI Settings ส่องสว่าง ได้ Security Group ที่เปิดทุกอย่างที่ต้องการ Port 22 สำหรับ SSH Traffic เข้า Server, 943 พอร์ตสำหรับ Admin GUI, 443 TLS-encrypted HTTP Traffic, และ OpenVPN จะ Listen Incoming Client Connections บน Port 1194

หมายเหตุ: ถ้าเป็นไปได้ ปกติควร Restrict Rules ให้รับ Request จาก IP Address Ranges ของบริษัทที่ถูกต้องเท่านั้น แต่สำหรับทดสอบสั้นๆ นี้พอ
จากนี้ ผม Review Settings ยืนยัน SSH Encryption Key และกด Launch
Instance Launch แล้ว แสดง Login Info สำคัญ — รวมถึง User Account ที่ใช้ SSH เข้า Server ชื่อ openvpnas — และ Quick Start Guide ได้อีเมลลิงก์ข้อมูลเดียวกันด้วย
กลับไป EC2 Instances Console รอเครื่อง Boot ใหม่ แสดง Public IP Address ถ้า Reboot Instance ไม่มีการรับประกันว่าได้ IP เดิม อาจทำให้วุ่นวาย ดังนั้นควร Assign Elastic IP
ทำได้โดย คลิก Elastic IPs แล้ว Allocate New Address จด Address ใหม่ ปิดหน้า ตอน Address นั้น Selected คลิก Actions "Associate Address" คลิกใน Instance Box OpenVPN Instance พร้อม Tag ช่วยเหลือ อยู่ในรายการ Select มัน คลิก "Associate" เสร็จ ตั้งแต่นี้เป็นต้นไป จะเป็น Permanent Public IP สำหรับเข้าถึง Server

เข้าถึง Server
ผมวาง Public IP Address ใน Terminal เป็นส่วนของ SSH Command เรียก Key Pair ที่ตั้งสำหรับ Instance นี้
ssh -i KeyPairName.pem openvpnas@<PublicIPAddress>ถ้าเข้าจาก Windows หรือ macOS อาจทำงานต่างออกไป แตเอกสารจะช่วยทั้งหมด
ก่อนออกจาก Instances Console ผมทำฟังก์ชันสำคัญอีกอย่าง ด้วย OpenVPN Instance Selected คลิก Actions แล้ว Networking แล้ว "Change Source/Dest Checking" ตั้งให้ Checking Disabled ไม่มีอะไรเป็นไปได้มาก ถ้าไม่ทำอย่างนี้
ไปที่ SSH Session ทันทีที่เริ่ม ต้องเผชิญ OpenVPN EULA License Agreement และ Setup Wizard ถ้าต้องเปลี่ยน Setting ภายหลัง รัน Wizard อีกครั้งด้วยคำสั่ง:
sudo ovpn-init — ec2.Default ส่วนใหญ่ของ Wizard ใช้ได้ แต่ว่าอธิบายสั้นๆ ว่าเกิดอะไร คำถามและความคิดเห็น:
Primary Access Server Node? yes [ตอบ no ถ้าตั้ง Backup/Failover Node] ระบุ Network Interface และ IP Address สำหรับ Admin Web UI [1 — ทุก Interfaces; เปลี่ยนเป็น Static ภายหลังได้] ระบุ Port Number สำหรับ Admin Web UI [Default] ระบุ TCP Port Number สำหรับ OpenVPN Daemon [Default] ควร Route Client Traffic ผ่าน VPN โดย Default? [No — นี่ไม่ใช่ VPN แบบที่เราสร้าง เราทำแค่ให้ Remote Clients เข้า VPC อย่างปลอดภัย Same applies to Client DNS Traffic] ควร Route Client DNS Traffic ผ่าน VPN โดย Default? [No] ใช้ Local Authentication ผ่าน Internal DB? [No — ใช้ได้ แตเราจะใช้ Linux/AWS Authentication เพื่อความเรียบง่าย] ควร Private Subnets เข้าถึงได้โดย Clients โดย Default? [Yes — นั่นคือจุดประสงค์ของ VPN] Login Admin UI เป็น "openvpn"? [Yes] ใส่ License Key OpenVPN Access Server [Unnecessary สำหรับทดสอบ]Wizard เสร็จ แสดง Connection Info และแนะนำติดตั้ง Network Time Daemon NTP ไม่จำเป็นบน Ubuntu Box นี้ เพราะติดตั้งและรัน Default แล้ว
เหมือนที่กล่าว ต้องให้ User openvpn มี Password เพื่อ Login Web GUI ทำด้วย sudo passwd command
sudo passwd openvpnนี่คือ Server-side stuff ทั้งหมด ตอนนี้ผมใช้ Browser เข้า Web GUI ใช้ Public IP Address ของ Server พร้อม https:// ตามด้วย /admin
https://<PublicIPAddress>/adminจะได้ Warning "Your connection is not private" เพราะใช้ Self-signed Certificate แทน CA

ไม่เป็นปัญหา เพราะเรา Expose VPN ให้ Select Users ในบริษัท และพวกเขาควร Trust Certificate ของเรา คลิกผ่าน Warning Sign In และยอมรับ EULA
สำรวจ Features ของ OpenVPN Admin Console เองได้

ตั้งค่า VPN Client
ตอนนี้ ผมจะเปิด Client UI Page ใช้ Web Access Address ที่แสดงก่อนหน้า แตคราวนี้ไม่มี /admin นี่คือแค่ Login Screen ที่ Authenticate ด้วย User openvpn เดียวกัน (สร้าง User ใหม่ได้ใน Admin Console)
หลัง Login Screen มีแค่ชุด Links พร้อมคำแนะนำติดตั้ง OpenVPN Client App บน Platform ต่างๆ Link สุดท้ายชื่อ "Yourself"

คลิกจะ Prompt Download และ Save ไฟล์ชื่อ client.ovpn ไฟล์นี้มี Configuration Settings ตรงกับ Server และ Keys จริงสำหรับ Authenticate ต้องเก็บไฟล์นี้ดี อย่าส่งผ่าน Plain Email ผ่าน Connection ไม่เข้ารหัส
ผมเปิดไฟล์ Local Copy เนื้อหา แล้วใน Shell ภายใน Linux VM รันใน Local Network ผม สร้างไฟล์ใหม่ client.ovpn วางเนื้อหา ถ้าคลิก "OpenVPN for Linux" Link ใน Client UI ก่อนหน้า จะเห็นว่าขั้นตอนเพิ่มเติมคือ ติดตั้ง OpenVPN ด้วย Apt Package Manager — หรือ Yum ถ้า CentOS/Red Hat แค่คำสั่งเดียว เสร็จแล้วพร้อม
nano client.ovpnsudo apt updatesudo apt install openvpnต่อไป เปิด VPN Connection ด้วย Root — ใช้ sudo — พิมพ์ openvpn พร้อม Config Flag ชี้ไป client.ovpn Config File ที่เพิ่งสร้าง
sudo openvpn — config client.ovpnตอน Prompt Authenticate ใช้ Account openvpn พร้อม Password ที่สร้างบน Server
ตอนนี้ ผมเปิด Shell Session ที่ 2 บน Local Client ลอง SSH เข้า OpenVPN Server ด้วย Local IP Address — สิ่งที่เป็นไปไม่ได้โดยไม่มี VPN Connection ที่ทำงาน
ก่อนหน้า รัน ip a รายการ Network Interfaces ทั้งหมดบนเครื่องนี้
ip aนอกจาก Local Network ควรเห็นอีกตัวชื่อ tun0 Interface นี้สร้างโดย OpenVPN และมักอยู่ใน Range 172.16.x.x
ผม SSH เข้า Remote Server ด้วย Private Key — ซึ่งต้องมีอยู่ Local — และ Private IP Address ของ Server ถ้าทำงาน คุณมี VPN!
ssh -i KeyPairName.pem openvpnas@<PrivateIPAddress>สุดท้าย ผมสาธิต VPN ตาม Config ปัจจุบัน อนุญาตให้เข้าถึง Private Resources อื่นๆ ใน Amazon VPC ของเรา นี่มีประโยชน์ถ้าคุณมี Database Instance รันใน VPC ที่ Expose ไป Public Network ไม่ได้
ผมจะ Launch Standard Ubuntu EC2 Instance แต่ ไม่ ให้ Public IP ระบุ Subnet us-east-1b เดียวกับ OpenVPN Server Security Group ใช้ อนุญาต SSH ผ่าน Port 22 แต่ว่างๆ
Instance รันแล้ว จด Private IP Address กลับไป Local Client ตอนแน่ใจ Instance Launch เสร็จ SSH เข้า ด้วย Private Key เดียวกัน Username "ubuntu" — Default สำหรับ Ubuntu EC2 Instance ปกติ — และ Private Address ที่คัดลอก
อีกครั้ง ถ้าทำงาน คุณมี VPN Connection เข้าทรัพยากร Private AWS ที่ Configured แล้ว ลุ้นช่วงเวลานี้
อย่าลืม Shut Down Servers ทั้งหมด และ Release Elastic IP Address ตอนจบใช้งาน ไม่อยากจ่ายค่าใช้จ่ายเปล่า
บทความนี้ปรับจากคอร์ส Pluralsight ใหม่ "Connecting On-prem Resources to your AWS Infrastructure" มีอีกมากที่ Bootstrap IT Site ของผม รวมลิงก์หนังสือ Linux in Action และคอร์ส Hybrid Linux in Motion ประกอบด้วย Video 2+ ชั่วโมง และข้อความ 40% ของ Linux in Action