Bài viết này được chuyển thể từ một phần khóa học Pluralsight mới của tôi, "Kết Nối Tài Nguyên On-prem Với Cơ Sở Hạ Tầng AWS".
Bạn có đôi khi cần kết nối đến tài nguyên bạn đang chạy trên Amazon Web Services? Truy cập instance EC2 công khai bằng SSH và mã hóa dữ liệu S3 là, cho hầu hết mục đích, đủ an toàn. Nhưng làm sao với instance cơ sở dữ liệu RDS back-end hoặc làm việc với dữ liệu dựa trên AWS không công khai? Có nhiều lý do khiến admin giữ tài nguyên đó xa tay công chúng. Nhưng nếu bạn không thể truy cập khi cần, chúng có ích gì?
Vì vậy bạn cần tìm cách an toàn và tin cậy để vượt qua ACL và nhóm bảo mật bảo vệ tài sản của bạn. Một giải pháp tôi đề cập trong khóa học "Kết Nối Tài Nguyên On-prem Với Cơ Sở Hạ Tầng AWS" trên Pluralsight là Direct Connect. Nhưng nếu giá Direct Connect vượt ngân sách công ty, thì một loại đường hầm VPN nào đó có thể giải quyết.
Mạng Riêng Ảo (Virtual Private Network) là gì?
Mạng Riêng Ảo (VPN) thường được dùng để cho phép hoạt động mạng bị hạn chế hoặc duyệt web ẩn danh. Nhưng bài này không nói về điều đó.
VPN là kết nối điểm-điểm (point-to-point) cho phép bạn di chuyển dữ liệu an toàn giữa hai trang web qua mạng công cộng. Hiệu quả, một đường hầm có thể được thiết kế để kết hợp hai trang web riêng biệt về địa lý thành một mạng riêng đơn lẻ. Trong ngữ cảnh của chúng ta, đó có nghĩa là kết nối mạng văn phòng cục bộ với VPC AWS đang lưu trữ tài nguyên riêng tư của bạn.
Có hai cách làm điều này:
- Kết nối VPN được quản lý (managed VPN Connection) xây dựng trên AWS Virtual Private Gateway
- Sử dụng VPN của riêng bạn.
Bài viết này tập trung vào phương pháp tự làm (do it yourself).
Máy Chủ Truy Cập OpenVPN (OpenVPN Access Server)
Như tên gọi, OpenVPN là dự án mã nguồn mở, và bạn luôn có thể tải phiên bản cộng đồng miễn phí và tự thiết lập trên máy chủ VPN của mình. Nhưng công ty OpenVPN cũng cung cấp một OpenVPN Access Server được xây dựng dành cho mục đích cụ thể dưới dạng EC2 AMI đi kèm tích hợp thân thiện với AWS và công cụ cấu hình tự động.
Từ những gì tôi thấy, khởi chạy AMI trong VPC AWS của bạn và mở nó cho kết nối từ xa được kiểm soát gần như trở thành cách "chuẩn" để làm việc này.
Chi phí bao nhiêu? Nếu bạn chỉ test và không dự định truy cập VPN dùng hơn hai kết nối cùng lúc, thì AMI miễn phí. Bạn vẫn phải chịu chi phí thường xuyên của instance EC2, nhưng nếu tài khoản vẫn đủ điều kiện Free Tier, bạn có thể lấy miễn phí.
Khi bạn đưa VPN vào sản xuất thực tế, giấy phép bạn mua sẽ phụ thuộc vào số kết nối đồng thời bạn cần. Trang này có chi tiết bạn cần.
Đây là những gì chúng ta sẽ làm trong hướng dẫn này:
- Chọn, cấp phát, và khởi chạy Ubuntu AMI với OpenVPN Access Server cài sẵn vào VPC của tôi
- Truy cập máy chủ bằng SSH và cấu hình VPN
- Thiết lập người dùng admin
- Thiết lập máy cục bộ làm client OpenVPN và kết nối đến instance riêng trong VPC AWS của tôi
Sẵn sàng?
Khởi Chạy OpenVPN Access Server
Từ bảng điều khiển EC2 — và đảm bảo chúng ta ở đúng vùng AWS — khởi chạy instance làm máy chủ VPN. Thay vì dùng Quick Start AMI, tôi nhấp tab AWS Marketplace và tìm "openvpn access server". OpenVPN cung cấp một số hình ảnh chính thức gắn với giấy phép cung cấp số client kết nối tăng dần.
Tôi sẽ chọn hình ảnh Ubuntu này hoạt động qua cơ chế "Mang Giấy Phép Của Bạn" (Bring Your Own License). Như viết trước, chúng ta thực sự không cần giấy phép cho việc chúng ta làm.

Chọn AMI mở popup cho biết hình ảnh này tốn bao nhiêu mỗi giờ dùng các loại instance và lựa chọn lưu trữ EBS khác nhau. Đó chỉ là chi phí cơ sở hạ tầng AWS thông thường, không bao gồm phí giấy phép.

Về loại instance, tôi sẽ hạ cấp xuống t2.micro để giữ trong free tier. Máy chủ sản xuất bận rộn có thể cần sức mạnh hơn.
Vì tôi muốn khởi chạy instance thứ hai trong cùng subnet tra ít phút, tôi sẽ chọn, ví dụ, "us-east-1b" từ trang Cấu Hình Chi Tiết Instance, và ghi nhớ cho sau.

Trang Nhóm Bảo Mật (Security Group) là nơi cài đặt AMI OpenVPN thực sự tỏa sáng. Chúng ta được trình bày một nhóm bảo mật mở mọi thứ chúng ta cần. Cổng 22 cho lưu lượng SSH vào máy chủ, 943 là cổng để truy cập GUI quản trị, 443 là lưu lượng HTTP được mã hóa TLS, và OpenVPN sẽ lắng nghe kết nối client đến trên cổng 1194.

Lưu ý: Nếu thực tế, thường là ý tưởng tốt để siết chặt quy tắc đó để chỉ chấp nhận yêu cầu từ dải IP công ty hợp lệ, nhưng để test ngắn hạn thì ổn.
Từ đây, tôi sẽ xem lại cài đặt, xác nhận tôi có khóa mã hóa SSH liệt kê, và bấm nút.
Khi instance khởi chạy, tôi sẽ thấy thông tin đăng nhập quan trọng — bao gồm thực tế tài khoản người dùng chúng ta sẽ dùng để SSH vào máy chủ gọi là openvpnas — và hướng dẫn Khởi Động Nhanh. Tôi cũng nhận email chứa link đến cùng thông tin.
Quay lại bảng điều khiển instances EC2, trong khi máy mới hoàn tất khởi động, chúng ta thấy địa chỉ IP công cộng. Nếu chúng ta bao giờ cần khởi động lại instance, không đảm bảo chúng ta sẽ lấy lại IP đó, có thể gây rắc rối. Vì vậy gán Elastic IP cho instance là ý kiến tốt.
Để làm vậy, tôi nhấp Elastic IPs rồi Allocate new address. Ghi địa chỉ mới và đóng trang. Bây giờ, với địa chỉ đó được chọn, nhấp Actions, và "Associate Address". Tôi nhấp một lần vào hộp Instance và instance OpenVPN của tôi — với thẻ tag hữu ích — được liệt kê. Tôi chỉ cần chọn, nhấp "Associate" và xong. Từ bây giờ, đó sẽ là IP công cộng vĩnh viễn để truy cập máy chủ.

Truy Cập Máy Chủ
Tôi dán địa chỉ IP công cộng vào terminal như một phần lệnh SSH gọi cặp khóa tôi thiết lập cho instance này.
ssh -i KeyPairName.pem openvpnas@<PublicIPAddress>Nếu bạn truy cập từ Windows hoặc macOS, mọi thứ có thể hoạt động hơi khác, nhưng tài liệu sẽ giúp bạn tất cả những gì cần.
Trước khi rời bảng điều khiển Instances, tuy nhiên, tôi sẽ thực hiện thêm một chức năng quan trọng. Với instance OpenVPN được chọn, tôi nhấp Actions rồi Networking và "Change Source/Dest checking". Tôi đảm bảo kiểm tra đó bị tắt. Không nhiều thứ sẽ khả thi trừ khi tôi làm điều này.
Bây giờ qua phiên SSH. Ngay khi bắt đầu, tôi đối mặt với thỏa thuận EULA OpenVPN, và sau đó là wizard thiết lập. Nếu cần thay đổi cài đặt sau, bạn luôn có thể chạy lại wizard bằng lệnh:
sudo ovpn-init — ec2.Hầu hết mặc định của wizard sẽ ổn, nhưng đáng giá giải thích nhanh những gì xảy ra. Đây là các câu hỏi và bình luận thêm khi cần:
primary Access Server node? yes [Bạn trả lời no nếu thiết lập node backup/failover.] chỉ định giao diện mạng và địa chỉ IP dùng cho Admin Web UI [1 — Cho tất cả giao diện; có thể đổi sang tĩnh sau.] chỉ định số cổng cho Admin Web UI [mặc định] chỉ định số cổng TCP cho OpenVPN Daemon [mặc định] Client traffic có được định tuyến mặc định qua VPN? [no--Đó không phải loại VPN chúng ta xây dựng. Chúng ta chỉ đưa client từ xa an toàn vào VPC. Tương tự cho client DNS traffic.] Client DNS traffic có được định tuyến mặc định qua VPN? [no] Dùng xác thực cục bộ qua DB nội bộ? [no — có thể hữu ích, nhưng dùng xác thực Linux/AWS cho đơn giản.] Private subnets có truy cập được bởi client mặc định? [yes — đó là cả điểm của VPN.] đăng nhập Admin UI như "openvpn"? [yes] Cung cấp khóa giấy phép OpenVPN Access Server [Không cần cho test.]Khi wizard hoàn tất, tôi thấy thông tin kết nối và được khuyên cài daemon thời gian mạng NTP. Điều đó không cần trên hộp Ubuntu này, vì nó đã cài và chạy mặc định.
Như đã nói trước, tôi cần đặt mật khẩu cho user openvpn để dùng đăng nhập web GUI. Tôi làm như sudo với lệnh passwd.
sudo passwd openvpnĐó là tất cả việc phía máy chủ chúng ta cần. Bây giờ tôi sẽ dùng trình duyệt đăng nhập web GUI. Tôi dùng địa chỉ IP công cộng của máy chủ với tiền tố https an toàn, theo sau là dấu gạch chéo và admin.
https://<PublicIPAddress>/adminBạn sẽ nhận cảnh báo "Your connection is not private" (Kết nối không riêng tư) vì dùng chứng chỉ tự ký (self-signed) thay vì do Certificate Authority cấp.

Đó không phải vấn đề cho chúng ta, vì chúng ta chỉ phơi bày VPN cho người dùng chọn lọc từ trong công ty, và họ nên tin chứng chỉ của chúng ta. Vì vậy tôi nhấp qua cảnh báo, đăng nhập, và đồng ý EULA.
Tự do khám phá tính năng do bảng điều khiển admin OpenVPN cung cấp.

Thiết Lập Client VPN
Ngay bây giờ, tôi sẽ mở trang client UI dùng địa chỉ truy cập web chúng ta thấy trước, nhưng lần này không có gạch chéo admin. Đây chỉ là màn hình đăng nhập nơi bạn xác thực bằng cùng user openvpn như trước. (Bạn luôn có thể tạo user mới trở lại bảng điều khiển admin.)
Sau màn hình đăng nhập, chỉ có tập liên kết này với hướng dẫn cài ứng dụng client OpenVPN trên các nền tảng đó. Liên kết cuối, tuy nhiên, gọi là "Yourself" (Bản thân bạn).

Nhấp vào nó sẽ nhắc bạn tải xuống và lưu tệp tên client.ovpn. Tệp này chứa cài đặt cấu hình khớp với máy chủ và khóa thực tế dùng để xác thực. Bạn chắc chắn muốn đối xử cẩn thận với tệp này để nó không rơi vào tay sai. Bao gồm không gửi nó qua email thường qua kết nối không mã hóa.
Tôi sẽ mở tệp cục bộ và sao chép nội dung. Sau đó, trong shell trong máy ảo Linux chạy trong mạng cục bộ của tôi, tôi tạo tệp mới tên client.ovpn và dán nội dung vào. Nếu bạn đã nhấp qua liên kết "OpenVPN for Linux" trong client UI trước, bạn sẽ thấy bước thêm duy nhất cần thiết là cài OpenVPN dùng trình quản lý gói Apt — hoặc Yum nếu bạn dùng CentOS hoặc Red Hat. Vâng, chỉ mất một lệnh. Khi nó xong việc, chúng ta sẵn sàng.
nano client.ovpnsudo apt updatesudo apt install openvpnTiếp theo chúng ta sẽ mở kết nối VPN. Là root — dùng sudo — tôi gõ openvpn với cờ config trỏ đến tệp cấu hình client.ovpn vừa tạo.
sudo openvpn — config client.ovpnKhi được nhắc xác thực, dùng tài khoản openvpn cùng mật khẩu bạn tạo cho nó trên máy chủ.
Bây giờ tôi mở phiên shell thứ hai trên client cục bộ để thử ssh vào máy chủ OpenVPN dùng địa chỉ IP cục bộ (private) — điều không thể nếu không có kết nối VPN hoạt động.
Trước hết, chạy ip a để liệt kê tất cả giao diện mạng đang hoạt động trên máy này.
ip aNgoài mạng cục bộ, bạn cũng nên thấy cái gọi là tun0. Giao diện này được tạo bởi OpenVPN và thường nằm trong dải 172.16.x.x.
Tôi sẽ ssh vào máy chủ từ xa dùng khóa riêng — đương nhiên, cần tồn tại cục bộ — và địa chỉ IP riêng tư của máy chủ. Nếu hoạt động, bạn sẽ có một VPN!
ssh -i KeyPairName.pem openvpnas@<PrivateIPAddress>Cuối cùng, tôi sẽ chứng minh VPN, như cấu hình hiện tại, cho phép truy cập tài nguyên riêng khác trong VPC Amazon của chúng ta. Điều này hữu ích nếu, ví dụ, bạn có instance cơ sở dữ liệu chạy trong VPC mà không thể phơi bày ra mạng công cộng.
Tôi sẽ khởi chạy instance EC2 Ubuntu tiêu chuẩn nhưng tôi sẽ không gán IP công cộng. Tôi sẽ chỉ định cùng subnet us-east-1b dùng cho máy chủ OpenVPN để đơn giản. Nhóm bảo mật tôi dùng sẽ cho phép truy cập SSH qua cổng 22 nhưng không gì khác.
Khi đó chạy, tôi ghi địa chỉ IP riêng của nó và quay lại client cục bộ. Khi chắc instance đã khởi chạy xong, tôi sẽ ssh vào dùng cùng khóa riêng, username "ubuntu" — vì đó là mặc định cho instance EC2 Ubuntu thường — và địa chỉ riêng vừa sao chép.
Lại một lần. Nếu hoạt động, bạn sẽ có kết nối VPN được cấu hình đầy đủ vào tài nguyên riêng AWS của bạn. Tận hưởng khoảnh khắc.
Đừng quên tắt tất cả máy chủ và giải phóng địa chỉ Elastic IP khi xong dùng. Bạn không muốn tốn chi phí không cần thiết.
Bài viết này được chuyển thể từ một phần khóa học Pluralsight mới của tôi, "Kết Nối Tài Nguyên On-prem Với Cơ Sở Hạ Tầng AWS." Còn nhiều hơn nữa tại trang Bootstrap IT của tôi, bao gồm link đến sách Linux in Action, và khóa học kết hợp Linux in Motion gồm hơn 2 giờ video và khoảng 40% văn bản của Linux in Action.