NỘI DUNG
Tiếp nối nội dung Phần 3, kỳ này tôi sẽ chuyển sang phần tạo Private Key và ký Certificate cho VPN Server, VPN Client và cấu hình OpenVPN Server. Nếu bạn chưa rõ Certificate, Key để làm cái vẹo gì thì vui lòng de lại mấy phần trước để đọc nhé.
#1. Tạo Private Key và ký Certificate cho VPN Server
Đầu tiên, bạn cần kiểm tra lại vị trí hiện tại có phải giống như ở cuối Phần 3 không.
Nếu đã ok rồi thì bạn tiến hành tạo Private Key và ký Certificate cho VPN Server với dòng lệnh:
./build-key-server server
Lưu ý quan trọng:
– Vì nội dung Sê-ri này quá dài nên tôi phải tách ra thành các phần khác nhau. Quá trình làm thực tế bạn nên chạy dòng lệnh trên ngay sau các dòng “source vars”, “./clean-all” và “./build-ca” trong Phần 3 để tránh phát sinh vấn đề (nếu lỡ rồi thì bạn chịu khó chạy lại 3 dòng lệnh này trước nhé);
– “server” trong dòng lệnh trên sẽ khớp với dòng `export KEY_NAME=”server”` trong Phần 3. Nếu bạn thiết lập khác thì cũng phải cập nhật tương ứng;
– Sau khi “Enter” bạn cũng sẽ thấy một đống thông tin phọt ra như lúc tạo CA. Một điểm khác trong quá trình này là nó sẽ hỏi bạn thêm “A challenge password”. Để đánh nhanh thắng nhanh thì tạm thời bạn bỏ qua vấn đề này (cứ để trống mặc định và “Enter”). Sau đó bạn gõ “y” 2 lần để thể hiện việc đồng ý ký vào Certificate và cập nhật vào cơ sở dữ liệu.
Như tôi đã nói ở Phần 3, kế tiếp bạn sẽ cần một Asymetric Encryption Key để mã hóa các Symetric Encryption Key dùng cho các phiên làm việc giữa VPN Server và VPN Client. Cái Asymetric Encryption Key cụ thể được tạo và sử dụng ở đây là sẽ là Diffie-Hellman key. Bạn có thể bơi vào https://medium.com/@abinesh.mba13/understanding-diffie-hellman-key-exchange-mechanism-d40d1f210b60 để xem kỹ hơn. Tôi định sẽ viết riêng về chủ đề này sau và nếu bạn không gấp thì chờ tôi nhé. Quay trở lại vấn đề chính, bạn sẽ tạo cái Diffie-Hellman key với dòng lệnh:
./build-dh
Lưu ý: Diffie-Hellman key có độ mạnh cũng thuộc thể loại khá “trâu chó” nên dù dòng lệnh trên nhìn có vẻ đơn sơn mộc mạc nhưng cái VM Instance cũng phải è cổ ra xử lý một lúc mới xong chứ không phải đập phát ăn ngay được đâu.
Kế tiếp, bạn sẽ tiếp tục tăng cường độ “trâu” cho nó với “HMAC signature” qua dòng lệnh
openvpn --genkey --secret keys/tiv.key
Lưu ý: “tiv” trong “tiv.key” hàm ý cho TLS integrity verification (hiểu đơn giản là xác thực tính toàn vẹn). Cái tên này có thể thay đổi tùy ý nhưng tôi nghĩ tạm thời bạn đừng thay đổi để tránh việc cấu hình nhầm thông số trong các bước sau. Còn về nguyên lý chi tiết của cái này thì tôi hẹn dẹp khác để nói kỹ hơn nhé.
#2. Tạo Private Key và ký Certificate cho VPN Client
Một lần nữa, việc đầu tiên là bạn cần kiểm tra lại xem có phải bạn ở trong thư mục “openvpn-ca” hay không. Nếu bạn không rõ đang ở vị trí nào thì chắc ăn nhất là chạy lại dòng lệnh:
cd ~/openvpn-ca
Việc thứ 2 cần thực hiện là bảo đảm file “vars” đã được đồng bộ bằng cách chạy lại dòng lệnh
source vars
Sau đó bạn tạo Private Key và ký Certificate cho VPN Client với:
./build-key client
Lưu ý: “client” trong dòng lệnh trên sẽ gán cho từng VPN Client riêng biệt. Nếu sau này bạn chạy nhiều client thì hiển nhiên bạn phải dùng cách khác để đặt tên cho chuẩn “cmn” mực. Còn tạm thời thì bạn cứ để thế chạy là ngon rồi.
Quá trình này cũng sẽ giống với lúc tạo cho VNP Server nên đoạn cuối bạn cũng sẽ cần nhấn “y” 2 lần để thực hiện việc ký vào Certificate.
#3. Cấu hình OpenVPN Server
Nếu bạn không chọc ngoáy gì thì thằng OpenVPN cài đặt ở Phần 3 sẽ thiết lập cho dòng họ nhà nó tạm trú ở thư mục “/etc/openvpn”. Bây giờ việc của bạn là mang cái đám Certificate và Key rối rắm ở trên vào thư mục này để thằng OpenVPN xử lý.
Đầu tiên, bạn mò vào chỗ chứa Certificate và Key với dòng lệnh:
cd ~/openvpn-ca/keys
Sau đó bạn chạy dòng lệnh copy các files liên quan:
sudo cp ca.crt server.crt server.key tiv.key dh2048.pem /etc/openvpn
Góc trợ giúp:
– “cp” ở đây là lệnh “copy”
– “ca.crt server.crt server.key tiv.key dh2048.pem” là cái đống file bạn muốn copy từ vị trí hiện hành (“~/openvpn-ca/keys”) đến thư mục đích “/etc/openvpn”. Lưu ý thằng “tiv.key” trong trường hợp bạn đã lỡ đổi tên file nhé.
Và cũng như bao giang hồ khác, OpenVPN package sẽ cung cấp cho người dùng một file cấu hình mẫu làm nền. Người dùng sẽ thực hiện các tùy chỉnh dựa trên file mẫu này chứ không ai rảnh háng mà ngồi viết lại file cấu hình từ đầu đến đít! Công việc của bạn ở đây là giải nén và lấy cái file cấu hình mẫu “server.conf” này với dòng lệnh:
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf
Góc trợ giúp:
– “gunzip” là dòng lệnh để bạn giải nén file “server.conf.gz” tại thư mục “/usr/share/doc/openvpn/examples/sample-config-files”. Nếu bạn mới thấy file “.gz” lần đầu thì cũng đừng hoảng, cứ đối xử với nó như họ hàng với file “.zip” hay “.rar”;
– Option “-c” của “gunzip” có chức năng để ngăn việc xóa file gốc “server.conf.gz” sau khi giải nén thôi;
– Cái ký tự “|” là “pipes” được dùng để kết hợp 2 dòng lệnh lại. Kết quả của thằng bên trái “pipes” sẽ đóng vai trò làm đầu vào cho thằng bên phải;
– Thằng “tee” command ở đây có chức năng hốt đống output của command bên trái “pipes” (là nội dung file cấu hình mẫu sau giải nén) rồi ghi vào file “server.conf” tại thư mục “/etc/openvpn”. Nó có tên “tee” vì thực tế dòng dữ liệu sẽ còn đi ra ở nhánh thứ 2 là “standart output”. Trong nội dung này, bạn sẽ không có việc gì phải làm với “standart output” nên thôi cứ kệ nó đi.
Quay trở lại với vấn đề chính, bây giờ bạn sẽ mở file “server.conf” tại thư mục “/etc/openvpn” để chuẩn bị cấu hình bằng cách chạy dòng lệnh:
sudo nano /etc/openvpn/server.conf
Bạn dùng phím mũi tên để di chuyển đến đoạn liên quan đến xác thực cho TLS và cập nhật lại như sau (bạn có thể gõ lại hoặc copy rồi dùng “Ctrl + V” để dán vào nội dung file “server.conf”):
tls-auth tiv.key 0 # This file is secret
key-direction 0
Kế tiếp ở đoạn mã hóa bên dưới, bạn cập nhật thành:
cipher AES-128-CBC
auth SHA256
Tiếp tục di chuyển đến đoạn liên quan đến đến thiết lập cho “user” và “group”, bạn cập nhật thành:
user nobody
group nogroup
Lưu ý: Dòng nào có sẵn với dấu “;” phía trước thì bạn chỉ cần xóa “;” cũng được chứ không nhất thiết phải gõ thêm dòng mới.
Kết quả phần này sẽ tương tự như sau.
Nếu muốn gửi toàn bộ traffic qua VPN, bạn cần cập nhật phần liên quan đến “redirect-gateway” và “dhcp-option” như sau (bạn cần di chuyển phím mũi tên lên trên để thấy phần này):
push “redirect-gateway def1 bypass-dhcp”
push “dhcp-option DNS 208.67.222.222”
push “dhcp-option DNS 208.67.220.220”
Góc trợ giúp:
– 208.67.222.222 và 208.67.220.220 là địa chỉ máy chủ DNS chính và phụ của OpenDNS (https://www.opendns.com/). Nếu bạn có DNS server khác thì dùng thay cũng được.
– Nếu chưa có ý tưởng gì về Network thì bạn xem thêm phần nội dung tôi trình bày ở đây nhé.
Tiếp theo, bạn cần cập nhật thông tin về “port” và “protocol” cho OpenVPN hoạt động. Trong Phần 2, khi thiết lập VM Instance, tôi đã nói sẽ sử dụng “port 443” và “protocl tcp” trong Sê-ri demo này nên bạn sẽ cần cập nhật tương ứng (phần này ở đoạn đầu của file cấu hình):
port 443
proto tcp
;proto udp
Cuối cùng, bạn kiểm tra lại thông tin liên quan đến Certificate và Key cho VPN Server. Vì tôi dùng tên “server” nên thông tin cấu hình tương ứng sẽ là.
cert server.crt
key server.key
Như vậy là đã xong phần cấu hình cho OpenVPN. Bạn tiến hành đóng và lưu file lại với tổ hợp phím “Crtl + X”, “Y” và “Enter”. Và đến đây tôi cũng xin tạm dừng nội dung kỳ này. Kỳ tới tôi sẽ chuyển sang cấu hình cho các phần còn lại trên con VPN Server.
Nếu bạn đang tự hỏi “WTF! Còn bao nhiêu kỳ nữa anh mới được ăn con VPN Server miễn phí đây?” thì câu trả lời là “Chắc khoảng 2 kỳ nữa”. Cố gắng lên vì sự nghiệp ăn chùa bạn nhé!
Hi bạn, khi mình thực hiện đến bước tạo key tiv “openvpn –genkey –secret keys/tiv1.key”
thì không tạo được và báo lỗi: “Options error: I’m trying to parse “–genkey” as an –option parameter but I don’t see a leading ‘–‘
Use –help for more information.”
bạn hướng dẫn giúp mình chỗ này với ạ, cảm ơn nhiều <3
Chào bạn. Tôi nghĩ chỗ này có thể phát sinh từ việc thể hiện định dạng của các dòng lệnh. Bạn thử lại với “
openVPN --genkey --secret keys/tiv1.key
“. Dấu chính xác là “- -” (hai gạch viết liền). Bạn thử xem có khắc phục được không nhé. Nhân tiện chắc tôi sẽ kiểm tra lại phần hiển thị các dòng lệnh này luôn.Em đọc ở Phần 3 thì anh có nói là “CA trên VPN Server ký Certificate chứa Public Key (của VPN Server). VPN Client lấy Certificate để thực hiện Key-Exchange theo Asymetric Encryption.” nên em chưa hiểu tại sao phải “Tạo Private Key và ký Certificate cho VPN Client”. Anh giải thích giúp em với.
Chào bạn, tôi chưa rõ câu hỏi của bạn lắm nên xin phép phản hồi một số ý sau để bạn tham khảo:
– Việc tạo và ký Certificate cho Server và Client về cơ bản là để làm cơ sở chứng minh Identity (của Server và Client) trong quá trình tương tác giữa Server và Client;
– Trong quá trình demo triển khai của chuỗi bài này, phần Client certificate và cả CA server đều được triển khai ngay trên OpenVPN server nên việc chứng minh Identity không thể hiện rõ. Thực tế, CA server nên được triển khai riêng (như nội dung cập nhật tại https://dummytip.com/giai-ngo-linux-phan-10-thiet-lap-certificate-authority-ca-tren-ubuntu-22-04-lts/) và Client certificate có thể được tạo ở client machine trước khi gửi qua ký ở CA server.