Thứ hai, 02/02/2015 | 00:00 GMT+7

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 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 .


Tags:

Các tin trước

Cách thiết lập server OpenVPN trên Ubuntu 14.04 2015-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