Cách chạy OpenVPN trong Docker Container trên Ubuntu 14.04
Hướng dẫn này sẽ giải thích cách cài đặt và chạy containers OpenVPN với sự trợ giúp của Docker .OpenVPN cung cấp một cách để tạo mạng riêng ảo (VPN) bằng cách sử dụng mã hóa TLS (sự phát triển của SSL). OpenVPN bảo vệ lưu lượng mạng khỏi bị nghe trộm và tấn công người trung gian (MITM). Mạng riêng được dùng để kết nối an toàn một thiết bị, chẳng hạn như notebook hoặc điện thoại di động chạy trên mạng WiFi không an toàn, với một server từ xa, sau đó chuyển tiếp lưu lượng đến Internet. Mạng riêng cũng được dùng để kết nối an toàn các thiết bị với nhau qua Internet.
Docker cung cấp một cách để đóng gói dữ liệu cấu hình và quy trình server OpenVPN để dễ dàng quản lý hơn. Hình ảnh Docker OpenVPN được tạo sẵn và bao gồm tất cả các phụ thuộc cần thiết để chạy server trong môi trường lành mạnh và ổn định. Tập lệnh được bao gồm để tự động hóa đáng kể trường hợp sử dụng tiêu chuẩn, nhưng vẫn cho phép cấu hình thủ công đầy đủ nếu muốn. Một vùng chứa dung lượng Docker cũng được sử dụng để chứa dữ liệu cấu hình và certificate EasyRSA PKI.
Docker Registry là một repository trung tâm cho cả Docker image chính thức và do user phát triển. Hình ảnh được sử dụng trong hướng dẫn này là hình ảnh do user đóng góp có sẵn tại kylemanna / openvpn . Hình ảnh được tập hợp trên các server xây dựng cloud của Docker Registry bằng cách sử dụng nguồn từ repository dự án GitHub . Bản dựng server cloud được liên kết với Github thêm khả năng kiểm tra Docker image để user có thể xem lại Dockerfile nguồn và mã liên quan, được gọi là Bản dựng tin cậy . Khi mã được cập nhật trong repository lưu trữ GitHub, một Docker image mới sẽ được xây dựng và xuất bản trên Docker Registry.
Các trường hợp sử dụng mẫu
- Định tuyến an toàn đến Internet khi sử dụng mạng công cộng (WiFi) không tin cậy
- Mạng riêng để kết nối notebook di động, máy tính văn phòng, máy tính gia đình hoặc điện thoại di động
- Mạng riêng dành cho các dịch vụ an toàn đằng sau bộ định tuyến NAT không có khả năng truyền tải NAT
Bàn thắng
- Cài đặt trình Docker trên Ubuntu 14.04 LTS
- Cài đặt vùng chứa dung lượng Docker để giữ dữ liệu cấu hình
- Tạo cơ quan cấp certificate EasyRSA PKI (CA)
- Extract các file cấu hình client được tạo tự động
- Cấu hình một số ứng dụng OpenVPN được chọn
- Xử lý khởi động containers Docker khi khởi động
- Giới thiệu các chủ đề nâng cao
Yêu cầu
- Kiến thức về shell Linux. Hướng dẫn này phần lớn giả định user có khả năng cài đặt và chạy các trình Linux theo nghĩa truyền thống
-  Quyền truy cập root trên  server  từ xa- Một server DigitalOcean 1 CPU / 512 MB RAM chạy Ubuntu 14.04 được giả định cho hướng dẫn này. Docker giúp việc chạy hình ảnh trên bất kỳ bản phân phối Linux server nào trở nên dễ dàng
- Bất kỳ server ảo nào cũng sẽ hoạt động miễn là server đó đang chạy công nghệ ảo hóa QEMU / KVM hoặc Xen; OpenVZ sẽ không hoạt động
- Bạn cần quyền truy cập root trên server . Hướng dẫn này giả định user đang chạy với quyền là user không có quyền đã bật sudo. Xem lại hướng dẫn Digital Ocean về quản lý user trên Ubuntu 14.04 nếu cần
 
- Một thiết bị khách local như điện thoại Android, notebook hoặc PC. Hầu hết tất cả các hệ điều hành đều được hỗ trợ thông qua các ứng dụng client OpenVPN khác nhau
Bước 1 - Cài đặt và kiểm tra Docker
Docker đang phát triển nhanh chóng và policy hỗ trợ dài hạn (LTS) của Ubuntu không theo kịp.Để giải quyết vấn đề này, ta sẽ cài đặt PPA sẽ cung cấp cho ta version Docker mới nhất.
 Thêm khóa ký gói repository  Docker ngược dòng. Lệnh apt-key sử dụng các  quyền  nâng cao qua sudo , do đó,  dấu nhắc  password  cho password  của  user  có thể xuất hiện:
curl -L https://get.docker.com/gpg | sudo apt-key add - Lưu ý: Nhập password sudo của bạn vào con trỏ nhấp nháy nếu cần.
Thêm repository Docker ngược dòng vào danh sách hệ thống:
echo deb http://get.docker.io/ubuntu docker main | sudo tee /etc/apt/sources.list.d/docker.list Cập nhật danh sách gói và cài đặt gói Docker:
sudo apt-get update && sudo apt-get install -y lxc-docker Thêm  user  của bạn vào  group  docker để kích hoạt giao tiếp với Docker daemon như một  user  bình thường, trong đó sammy là tên  user  của bạn. Thoát và đăng nhập lại để  group  mới có hiệu lực :
sudo usermod -aG docker sammy Sau khi đăng nhập lại, hãy xác minh tư cách thành viên  group  bằng lệnh id . Phản hồi dự kiến phải bao gồm docker như ví dụ sau:
uid=1001(test0) gid=1001(test0) groups=1001(test0),27(sudo),999(docker) Tùy chọn: Chạy bash trong một hình ảnh Debian Docker đơn giản ( --rm để dọn dẹp containers  sau khi thoát và -it để tương tác) để xác minh hoạt động của Docker trên  server :
docker run --rm -it debian:jessie bash -l Phản hồi mong đợi từ docker khi nó kéo hình ảnh vào và cài đặt containers :
Unable to find image 'debian:jessie' locally debian:jessie: The image you are pulling has been verified 511136ea3c5a: Pull complete 36fd425d7d8a: Pull complete aaabd2b41e22: Pull complete Status: Downloaded newer image for debian:jessie root@de8ffd8f82f6:/# Khi vào bên trong containers , bạn sẽ thấy dấu nhắc root@ <container id> :/# biểu thị rằng  shell  hiện tại nằm trong containers  Docker. Để  xác nhận  nó khác với  server , hãy kiểm tra version  Debian đang chạy trong containers :
cat /etc/issue.net Phản hồi mong đợi cho containers OpenVPN tại thời điểm viết bài:
Debian GNU/Linux jessie/sid Nếu bạn thấy một version Debian khác, điều đó tốt.
 Thoát khỏi containers   bằng lệnh  logout và  dấu nhắc  của  server  lưu trữ sẽ xuất hiện trở lại.
Bước 2 - Cài đặt Kho lưu trữ certificate EasyRSA PKI
Bước này thường là một vấn đề đau đầu đối với những người quen thuộc với OpenVPN hoặc bất kỳ dịch vụ nào sử dụng PKI. May mắn là Docker và các tập lệnh trong Docker image đơn giản hóa bước này bằng cách tạo các file cấu hình và tất cả các file certificate cần thiết cho ta .
 Tạo một  container   dung lượng . Hướng dẫn này sẽ sử dụng biến môi trường $OVPN_DATA để làm cho nó thân thiện với việc sao chép-dán. Đặt điều này thành bất kỳ thứ gì bạn thích. Giá trị ovpn-data mặc định  được khuyến khích  cho các  server  containers  OpenVPN Docker. Đặt biến trong shell sẽ thúc đẩy sự thay thế chuỗi để giúp  user  không phải thay thế nó theo cách thủ công cho mỗi bước trong hướng dẫn:
OVPN_DATA="ovpn-data" Tạo một containers   dung lượng  Docker trống bằng cách sử dụng busybox dưới dạng  Docker image  tối thiểu:
docker run --name $OVPN_DATA -v /etc/openvpn busybox Khởi tạo containers  $OVPN_DATA sẽ chứa các file  cấu hình và certificate , đồng thời thay thế vpn.example.com bằng FQDN của bạn. Giá trị vpn.example.com phải là domain  đủ điều kiện mà bạn sử dụng để giao tiếp với  server . Điều này giả sử cài đặt DNS đã được  cấu hình . Ngoài ra, có thể chỉ sử dụng địa chỉ IP của  server , nhưng điều này không được khuyến khích.
docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_genconfig -u udp://vpn.example.com:1194 Tạo tổ chức phát hành certificate EasyRSA PKI. Bạn sẽ được yêu cầu nhập passphrase (password bảo vệ) cho private key CA. Chọn một cái hay và ghi nhớ nó; nếu không có passphrase (password bảo vệ) , sẽ không thể cấp và ký certificate ứng dụng client :
docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn ovpn_initpki Lưu ý, bảo mật của containers  $OVPN_DATA rất quan trọng. Nó chứa tất cả các private key  để mạo danh  server  và tất cả các certificate  client . Hãy  nhớ điều này  và kiểm soát quyền truy cập khi thích hợp. Các tập lệnh OpenVPN mặc định sử dụng  passphrase (password bảo vệ)   cho khóa CA để tăng tính bảo mật và ngăn việc cấp certificate  không có thật.
Xem phần Kết luận bên dưới để biết thêm chi tiết về cách backup kho certificate .
Bước 3 - Chạy Server OpenVPN
 Để tự động khởi động lại containers  Docker chạy quy trình  server  OpenVPN (xem Tích hợp  server  Docker để biết thêm ), hãy tạo file  Upstart init bằng nano hoặc vim :
sudo vim /etc/init/docker-openvpn.conf Nội dung cần đặt trong /etc/init/docker-openvpn.conf :
description "Docker container for OpenVPN server" start on filesystem and started docker stop on runlevel [!2345] respawn script   exec docker run --volumes-from ovpn-data --rm -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn end script Bắt đầu quá trình bằng cơ chế Upstart init:
sudo start docker-openvpn  Xác minh  containers  đã khởi động và không gặp sự cố ngay lập tức bằng cách xem cột STATUS :
test0@tutorial0:~$ docker ps CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                    NAMES c3ca41324e1d        kylemanna/openvpn:latest   "ovpn_run"          2 seconds ago       Up 2 seconds        0.0.0.0:1194->1194/udp   focused_mestorf Bước 4 - Tạo certificate client và file cấu hình
Trong phần này, ta sẽ tạo certificate ứng dụng client bằng PKI CA mà ta đã tạo ở bước trước.
 Đảm bảo thay thế CLIENTNAME nếu thích hợp (đây không phải là FQDN). Tên client  được sử dụng để xác định máy mà client  OpenVPN đang chạy (ví dụ: “ notebook  gia đình”, “ notebook  làm việc”, “nexus5”, v.v.).
 Công cụ easyrsa sẽ nhắc nhập password  CA. Đây là password  mà  ta  đã đặt ở trên trong lệnh ovpn_initpki . Tạo certificate  khách hàng:
docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass Sau khi mỗi client được tạo, server đã sẵn sàng chấp nhận các kết nối.
 Máy khách cần certificate  và file  cấu hình để kết nối. Các tập lệnh nhúng sẽ tự động hóa tác vụ này và cho phép  user  ghi ra một cấu hình vào một file  duy nhất mà sau đó có thể được chuyển cho client .   , hãy thay thế CLIENTNAME nếu thích hợp:
docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn Tệp CLIENTNAME .ovpn kết quả chứa các private key  và certificate  cần thiết để kết nối với VPN. Giữ các file  này an toàn và không nằm xung quanh. Bạn  cần  vận chuyển các file  *.ovpn một cách an toàn đến các client  sẽ sử dụng chúng. Tránh sử dụng các dịch vụ công cộng như email hoặc bộ nhớ  cloud  nếu có thể khi chuyển file  do lo ngại về bảo mật.
Các phương pháp truyền được đề xuất là ssh / scp, HTTPS, USB và thẻ nhớ microSD nếu có.
Bước 5 - Cài đặt khách hàng OpenVPN
Sau đây là các lệnh hoặc hoạt động chạy trên client sẽ kết nối với server OpenVPN được cấu hình ở trên.
Bản phân phối Ubuntu và Debian qua Native OpenVPN
Trên Ubuntu 12.04 / 14.04 và client Debian wheezy / jessie (và tương tự):
Cài đặt OpenVPN:
sudo apt-get install openvpn Sao chép file cấu hình client từ server và đặt quyền an toàn:
sudo install -o root -m 400 CLIENTNAME.ovpn /etc/openvpn/CLIENTNAME.conf  Cấu hình  các tập lệnh init để tự động khởi động lại tất cả các cấu hình  trùng với  /etc/openvpn/*.conf :
echo AUTOSTART=all | sudo tee -a /etc/default/openvpn Khởi động lại quy trình server của ứng dụng client OpenVPN:
sudo /etc/init.d/openvpn restart Arch Linux qua Native OpenVPN
Cài đặt OpenVPN:
pacman -Sy openvpn Sao chép file cấu hình client từ server và đặt quyền an toàn:
sudo install -o root -m 400 CLIENTNAME.ovpn /etc/openvpn/CLIENTNAME.conf Bắt đầu quy trình server của ứng dụng client OpenVPN:
systemctl start openvpn@CLIENTNAME Tùy chọn: cấu hình systemd để bắt đầu /etc/openvpn/ CLIENTNAME .conf khi khởi động:
systemctl enable openvpn@CLIENTNAME MacOS X qua TunnelBlick
Download và cài đặt TunnelBlick .
 Sao chép CLIENTNAME .ovpn từ  server  sang Mac.
 Nhập cấu hình bằng cách nhấp đúp vào file  *.ovpn sao chép trước đó. TunnelBlick sẽ được gọi và nhập cấu hình.
Mở TunnelBlick, chọn cấu hình, sau đó chọn kết nối .
Android thông qua OpenVPN Connect
Cài đặt Ứng dụng OpenVPN Connect từ cửa hàng Google Play.
 Sao chép CLIENTNAME .ovpn từ  server  sang thiết bị Android một cách an toàn. USB hoặc thẻ microSD an toàn hơn. Đặt file  vào thẻ SD của bạn để hỗ trợ mở file .
Nhập cấu hình: Menu -> Nhập -> Nhập cấu hình từ thẻ SD
Chọn kết nối .
Bước 6 - Xác minh hoạt động
Có một số cách để xác minh lưu lượng truy cập đang được định tuyến qua VPN.
Trình duyệt web
Truy cập trang web để xác định địa chỉ IP bên ngoài. Địa chỉ IP bên ngoài phải là của server OpenVPN.
Hãy thử Google “ip của tôi là gì” hoặc icanhazip.com .
Dòng lệnh
 Từ dòng lệnh, wget hoặc curl rất hữu ích. Ví dụ với curl :
curl icanhazip.com Ví dụ với wget :
wget -qO - icanhazip.com Phản hồi mong đợi phải là địa chỉ IP của server OpenVPN.
 Một tùy chọn khác là thực hiện tra cứu DNS đặc biệt đối với  server  DNS được cấu hình đặc biệt chỉ cho mục đích này bằng cách sử dụng host hoặc host dig . Ví dụ sử dụng host :
host -t A myip.opendns.com resolver1.opendns.com Ví dụ với dig :
dig +short myip.opendns.com @resolver1.opendns.com Phản hồi mong đợi phải là địa chỉ IP của server OpenVPN.
Những điều cần kiểm tra bổ sung
 Xem lại cấu hình  network interface  của bạn. Trên các hệ điều hành dựa trên Unix, điều này đơn giản như chạy ifconfig trong một terminal  và tìm kiếm giao diện tunX của OpenVPN khi nó được kết nối.
 Xem lại log . Trên hệ thống Unix, hãy kiểm tra /var/log trên các bản phân phối cũ hoặc journalctl trên các bản phân phối systemd.
Kết luận
Docker image được xây dựng để chạy nó là open-souce và có nhiều khả năng hơn những gì được mô tả ở đây.
Kho lưu trữ mã nguồn docker-openvpn có sẵn để xem xét mã cũng như phân nhánh để sửa đổi. Yêu cầu kéo cho các tính năng chung hoặc sửa lỗi đều được hoan nghênh.
Các chủ đề nâng cao như backup và IP client tĩnh được thảo luận trong folder docker-openvpn / docs .
Báo cáo lỗi cho trình theo dõi vấn đề docker-openvpn .
Các tin liên quan
Cách thiết lập server OpenVPN trên Ubuntu 14.042015-01-28
Cách cài đặt và cấu hình server truy cập OpenVPN trên CentOS 6.5
2014-04-04
Cách bảo mật lưu lượng truy cập giữa các VPS bằng OpenVPN
2013-09-26
Cách thiết lập và cấu hình server OpenVPN trên Debian 6
2013-05-03
Cách thiết lập và cấu hình server OpenVPN trên CentOS 6
2013-05-02
 

