Thứ năm, 26/09/2013 | 00:00 GMT+7

Cách bảo mật lưu lượng truy cập giữa các VPS bằng OpenVPN


Giới thiệu

OpenVPN là một công cụ tuyệt vời đảm bảo lưu lượng truy cập không bị nghe trộm. Bạn có thể sử dụng điều này đảm bảo kết nối an toàn từ notebook đến VPS DigitalOcean của bạn ( server ) cũng như giữa các server cloud . Bạn cũng có thể thực hiện đồng thời cả hai.

Đây không phải là một bộ hướng dẫn hoàn toàn an toàn, hoàn toàn an toàn, phụ thuộc vào nó. Ta sẽ sử dụng ba phím tắt ở đây, theo tôi là sự cân bằng hợp lý giữa tính dễ sử dụng và tính bảo mật, nhưng tôi cũng như DigitalOcean có thể chịu trách nhiệm về bảo mật cho VPS của bạn, ngay cả khi bạn làm theo các hướng dẫn này.

Để trích dẫn một ngôi sao nhạc rock mật mã, "Bạn phải biết những gì bạn đang làm trong mỗi bước của con đường, từ khi hình thành cho đến khi cài đặt." - Bruce Schneier

Bài viết này là để giúp bạn bắt đầu cách cài đặt Mạng riêng ảo. Bạn đã được cảnh báo. Tôi sẽ chỉ ra các phím tắt được thực hiện và trình tự chung để tránh thực hiện các phím tắt này tại Phụ lục 1 .

Nếu bạn chỉ muốn có hai server cloud để kết nối với nhau, bạn có thể cần tìm một hướng dẫn đơn giản hơn (nhưng kém an toàn hơn) - mặc dù đây là sự thỏa hiệp tốt giữa dễ cài đặt và bảo mật.

Lưu ý: Hướng dẫn này bao gồm bảo mật IPv4. Trong Linux, bảo mật IPv6 được duy trì riêng biệt với IPv4. Ví dụ: "iptables" chỉ duy trì các luật firewall cho địa chỉ IPv4 nhưng nó có một đối tác IPv6 được gọi là "ip6tables", được dùng để duy trì các luật firewall cho địa chỉ mạng IPv6.

Nếu VPS của bạn được cấu hình cho IPv6, hãy nhớ bảo mật cả network interface IPv4 và IPv6 của bạn bằng các công cụ thích hợp. Để biết thêm thông tin về các công cụ IPv6, hãy tham khảo hướng dẫn này: Cách Cấu hình Công cụ để Sử dụng IPv6 trên VPS Linux

Bắt đầu

Bạn cần ít nhất hai server hoặc VPS cho cài đặt OpenVPN này và sẽ hoạt động lên đến khoảng 60 VPS mà không cần sửa đổi lớn. Vì vậy, để bắt đầu, hãy tạo hai server . Đối với phần còn lại của hướng dẫn này, tôi sẽ gọi chúng là Server 1Server 2 .

Trên server 1

• Tạo server với Ubuntu 13.04 x32.

Điều này sẽ hoạt động mà không cần sửa đổi trên bất kỳ version Ubuntu nào mà DigitalOcean cung cấp, nhưng chỉ được thử nghiệm trên 13.04.

Kết nối với VPS thông qua shell an toàn. Ta sẽ cập nhật các gói và cài đặt một số thứ.

aptitude update && aptitude dist-upgrade -y && aptitude install openvpn firehol -y && reboot

Lưu ý, nếu shell của bạn chuyển sang màu tím trong thời gian này, chỉ cần chọn "Cài đặt Phiên bản của Trình duy trì Gói" hai lần.

Trong khi đó, trên Server 2

• Tạo server với Ubuntu 13.04 x32.

, điều này sẽ hoạt động trên mọi version Ubuntu.

Kết nối với VPS thông qua shell an toàn. Ta sẽ cập nhật các gói trong cài đặt một số thứ.

aptitude update && aptitude dist-upgrade -y && aptitude install openvpn -y && reboot

, nếu shell của bạn chuyển sang màu tím trong thời gian này, chỉ cần chọn "Cài đặt Phiên bản của Trình duy trì Gói" hai lần.

Tạo key

Quá trình tạo khóa sẽ được thực hiện độc quyền trên Server 1. Nhập các lệnh sau vào shell:

cd /etc/openvpn/
mkdir easy-rsa
cd easy-rsa
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* .

Tiếp theo, ta sẽ nhập một số cài đặt trước sẽ tăng tốc đáng kể quá trình tạo khóa. Nhập lệnh sau:

nano /etc/openvpn/easy-rsa/vars

Hãy tiếp tục và chỉnh sửa các giá trị sau (bạn chỉ cần thực hiện những điều này, mặc dù hiện tại có một số giá trị khác):

  • KEY_COUNTRY
  • KEY_PROVINCE
  • KEY_CITY
  • KEY_ORG
  • KEY_EMAIL

Bạn có thể điều chỉnh KEY_SIZE thành 2048 hoặc cao hơn để tăng cường bảo vệ.

Lưu và thoát bằng Control-O, Enter và Control-X.

Tạo certificate và khóa của tổ chức phát hành certificate

Tiếp theo, nhập các lệnh sau:

source vars
./clean-all
./build-ca

Bạn có thể nhấn Enter mặc dù tất cả các câu hỏi.

Lưu ý: nếu bạn phải quay lại và tạo thêm khóa, bạn cần nhập lại các vars nguồn nhưng không nhập ./clean-all hoặc bạn sẽ xóa Tổ chức phát hành certificate của bạn , phá hoại toàn bộ cài đặt VPN của bạn.

Tạo certificate và khóa server

Tạo certificate và khóa server bằng lệnh sau:

./build-key-server server

Bạn có thể nhấn Enter ở chế độ mặc định, nhưng hãy đảm bảo Tên chung của certificate là " server ".

Nó sẽ yêu cầu bạn thêm một cụm từ password , nhưng chỉ cần nhấn Enter mà không cần nhập một cụm từ.

Khi nó hỏi bạn "Ký certificate ?", Hãy nhập y và nhấn Enter.

Khi có thông báo "1 trong số 1 certificate request được chứng nhận, commit ?", Hãy nhập y và nhấn Enter.

Tạo khóa khách hàng

Tiếp theo là tạo certificate và khóa cho các client . Vì mục đích bảo mật, mỗi client sẽ nhận được certificate và private key .

Tôi đang đặt tên ứng dụng client đầu tiên là "client1", vì vậy nếu bạn thay đổi điều này, bạn sẽ phải điều chỉnh nó vài lần sau đó. Vì vậy, hãy nhập như sau:

./build-key client1

Đối với khóa server , khi nó hỏi bạn "Ký certificate ?", Hãy nhập y và nhấn Enter.

Khi có thông báo "1 trong số 1 certificate request được chứng nhận, commit ?", Hãy nhập y và nhấn Enter.

Hãy tiếp tục và lặp lại điều này cho bao nhiêu khách hàng mà bạn cần. Bạn cũng có thể quay lại điều này sau (mặc dù hãy nhớ "source var" nếu bạn làm như vậy).

Tạo tham số Diffie-Hellman

Điều này được sử dụng sau khi xác thực, để xác định các tham số mã hóa. Chỉ cần gõ dòng sau:

./build-dh

Sao chép key vào vị trí

Tiếp theo, ta sao chép các khóa và certificate khác nhau vào vị trí trên server cloud :

cd /etc/openvpn/easy-rsa/keys
cp ca.crt dh1024.pem server.crt server.key /etc/openvpn

Điều rất quan trọng là khóa được giữ an toàn. Kiểm tra kỹ xem chỉ có root mới có quyền đọc. Vì vậy, hãy nhập:

ls -lah /etc/openvpn

Những gì bạn đang tìm kiếm là server.key-rw ------- cho quyền (đọc / ghi cho chủ sở hữu, không cho group và không cho tất cả mọi người). Nếu bạn cần thay đổi nó, hãy sử dụng lệnh sau:

chmod 600 /etc/openvpn/server.key

Phân phối certificate và khóa khách hàng

Bảng sau đây cho thấy những file nào được chuyển vào client nào.

client1 client2
cacrt cacrt
client1.crt client2.crt
client1.key (BÍ MẬT) client2.key (BÍ MẬT)

Ta sẽ sao chép an toàn các file vào VPS thứ hai bằng cách sử dụng bản sao an toàn. (Bạn cũng có thể mèo, sau đó copy paste trên các cửa sổ SSH. Nhưng đây là một kỹ thuật hay để sao chép file một cách an toàn.)

Trên server 1

Tạo SSH key bằng lệnh sau:

ssh-keygen -t rsa

Nó sẽ chọn một tên file mặc định và sau đó yêu cầu bạn nhập passphrase (password bảo vệ) an toàn mà bạn nên đặt. Tìm public key SSH bạn vừa tạo và nhập:

cat ~/.ssh/id_rsa.pub

Sao chép kết quả vào clipboard . Đó là một vài dòng chữ cái và số trông giống như:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCo249TgbI1gYP42RbLcDhsNN28r/fNT6ljdFOZxhk+05UAPhxq8bASaqSXZI3K8EEI3wSpigaceNUu65pxLEsZWS8xTtjY4AVxZU2w8GIlnFDSQYr3M2A77ZAq5DqyhGmnnB3cPsIJi5Q6JQNaQ/Meg1v7mYR9prfEENJeXrDiXjxUqi41NlVdb5ZQnPL1EdKM+KN/EPjiTD5XY1q4ICmLJUB8RkffHwH2knEcBoSZW2cNADpMu/IqtxTZpFL0I1eIEtoCWg4mGIdIo8Dj/nzjheFjavDhiqvUEImt1vWFPxHEXt79Iap/VQp/yc80fhr2UqXmxOa0XS7oSGGfFuXz root@openvpn1

Nhưng SỬ DỤNG CỦA RIÊNG BẠN, không phải của tôi. Id_rsa.pub của bạn không cần phải được giữ an toàn, nhưng nếu bạn sử dụng khóa ở trên, điều đó sẽ cho phép tôi truy cập vào VPS của bạn.

Trong khi đó, trên Server 2

cd ~/.ssh

(Nếu bạn gặp lỗi, hãy tạo folder bằng mkdir ~/.ssh ).

nano authorized_keys

Dán public key trong clipboard của bạn vào một dòng mới, sau đó lưu và thoát bằng Control-O, Enter, Control-X.

Quay lại Server 1

Tiếp theo, ta sao chép các khóa thích hợp vào server thứ hai:
scp /etc/openvpn/easy-rsa/keys/ca.crt \
    /etc/openvpn/easy-rsa/keys/client1.crt \
    /etc/openvpn/easy-rsa/keys/client1.key \
    root@server2ip:~/

Nó sẽ hỏi bạn "Bạn có chắc chắn muốn tiếp tục kết nối (có / không) không?", Vì vậy hãy nhập yes và nhấn Enter.

Sau đó nhập passphrase (password bảo vệ) bạn vừa tạo.

Chuyển lại sang Server 2

Tiếp theo, ta di chuyển các certificate và khóa vào vị trí cuối cùng của chúng:

cd ~
mv ca.crt client1.crt client1.key /etc/openvpn
ls -l /etc/openvpn

Vì khóa phải được giữ an toàn, hãy đảm bảo client1.key có quyền chính xác ( -rw ------- ).

, nếu cần, các quyền có thể được đặt lại bằng lệnh sau:

chmod 600 /etc/openvpn/client1.key

Kết nối mạng

Tiếp theo là sự phấn khích đó là kết nối mạng trên VPN. Bạn có thể sử dụng OpenVPN bằng cách sử dụng định tuyến hoặc bắc cầu. Nếu bạn biết sự khác biệt là gì, bạn không cần sự giúp đỡ của tôi khi lựa chọn. Đối với hướng dẫn này, ta sẽ sử dụng định tuyến. Ta cũng sẽ sử dụng phạm vi mạng mặc định của OpenVPN, là 10.8.0.0/24 . Trừ khi bạn đã sử dụng dải mạng này ở đâu đó, điều này sẽ ổn. Nếu bạn cần một phạm vi khác, hãy chọn một phạm vi riêng tư và đảm bảo bạn điều chỉnh tất cả các bước cấu hình sau cho phù hợp.

Server 1

Trên server OpenVPN, ta cũng cần cấu hình định tuyến và cài đặt firewall . Tôi sử dụng một công cụ có tên là firehol để cấu hình iptables, giúp cài đặt một firewall phức tạp rất đơn giản. Vì vậy, hãy nhập các lệnh sau:

nano /etc/firehol/firehol.conf

Mặc dù ta có thể cho phép các kết nối OpenVPN đến từ bất kỳ địa chỉ nào, nhưng ta sẽ giới hạn các kết nối này với địa chỉ IP của máy tính bạn muốn kết nối. Tạo danh sách địa chỉ IP của bạn ngay bây giờ.

Lưu ý: Cấu hình sau chỉ cho phép các kết nối SSH và OpenVPN đến. Nếu bạn có các dịch vụ khác cần nhận các kết nối đến, bạn cần sửa đổi firewall để hỗ trợ các kết nối này.

version 5

interface eth0 inet
  client all accept                           // allow all outgoing connections
  server ssh accept                           // allow all incoming SSH connections
  server openvpn accept src "1.2.3.4 2.3.4.5" // allow incoming OpenVPN connections
                                              //   from these designated addresses 
                                              //   NOTE: EDIT THESE ADDRESSES

interface tun0 vpn                            
  server all accept                           // allow all incoming connections on the VPN 
  client all accept                           // allow all outgoing connections on the 

router inet2vpn inface eth0 outface tun0
  route all accept                            // route freely to the VPN

router vpn2inet inface tun0 outface eth0
  masquerade                                  // use NAT masquerading from the VPN
  route all accept                            // route freely to the VPN

Sau đó, khởi động firewall bằng lệnh sau:

firehol start

Nếu bạn gặp sự cố với firewall của bạn , bạn có thể khởi động lại VPS của bạn và cấu hình firewall sẽ bị xóa. Để đặt firewall vĩnh viễn, hãy nhập thông tin sau:

nano /etc/default/firehol

Tìm dòng sau:

START_FIREHOL=NO

Bây giờ, thay đổi KHÔNG thành CÓ. Lưu và thoát bằng Control-O, Enter, Control-X.

Tệp cấu hình Server OpenVPN

Trên server 1

Bước tiếp theo là sao chép cấu hình server mẫu vào vị trí và chỉnh sửa nó theo nhu cầu của ta .

cd /etc/openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
gunzip server.conf.gz
nano /etc/openvpn/server.conf

Server OpenVPN sẽ khởi động dưới dạng root, nhưng ta có thể đặt nó giảm xuống các quyền thấp hơn sau khi khởi động, đây là một biện pháp bảo mật tốt. Để cấu hình điều này, hãy tìm các dòng sau và bỏ ghi chú bằng cách xóa dấu chấm phẩy:

;user nobody
;group nogroup

Nếu bạn có nhiều server cần giao tiếp với nhau, hãy tìm dòng sau và xóa dấu chấm phẩy:

;client-to-client 

Nếu bạn đã tăng kích thước khóa của khóa DH, hãy tìm dòng:

dh dh1024.pem

và thay đổi 1024 thành 2048 (hoặc bất kỳ số nào bạn đã chọn).

Ta sẽ gán các địa chỉ IP tĩnh cho các client khác nhau từ server OpenVPN, vì vậy, để làm điều đó, hãy bỏ comment sau:

;client-config-dir ccd

Lưu với Control-O, Enter, Control-X. Tiếp theo, tạo folder cấu hình client :

mkdir /etc/openvpn/ccd

và ta sẽ thêm cấu hình cho khách hàng đầu tiên tại đây:

nano /etc/openvpn/ccd/client1

Nhập lệnh sau, lệnh này sẽ gán địa chỉ IP của client1, 10.8.0.5:

ifconfig-push 10.8.0.5 10.8.0.6

Lưu và thoát bằng Control-O, Enter, Control-X.

Vì những lý do yêu cầu kiến thức chuyên sâu về mạng để hiểu, hãy sử dụng các địa chỉ sau cho các khách hàng bổ sung:

/ etc / openvpn / ccd / client2 ifconfig-push 10.8.0.9 10.8.0.10

/ etc / openvpn / ccd / client3: ifconfig-push 10.8.0.13 10.8.0.14

Đơn giản, thêm 4 vào mỗi IP cho mỗi bộ mới. Giải thích thêm về kỹ thuật tại Phụ lục 2 .

Bây giờ ta có thể khởi động server OpenVPN bằng lệnh sau:

service openvpn start

Chờ một chút, sau đó nhập các lệnh sau đảm bảo OpenVPN đang chạy:

ifconfig

Và trong số các network interface , bạn sẽ thấy rằng giao diện tun0 trông như thế này:

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:140 errors:0 dropped:0 overruns:0 frame:0
          TX packets:149 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:13552 (13.5 KB)  TX bytes:14668 (14.6 KB)

Bạn cũng có thể nhập:

service openvpn status

và nếu OpenVPN đang chạy, bạn sẽ thấy như sau:

 * VPN 'server' is running

Nếu cả hai điều này theo thứ tự, thì server đang hoạt động và ta sẽ cấu hình kết nối client tiếp theo.

Tệp cấu hình ứng dụng client OpenVPN

Trên server 2

Đầu tiên, hãy sao chép file cấu hình ứng dụng client mẫu vào các vị trí thích hợp:

cd /etc/openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .
Nó chủ yếu được cấu hình , nhưng ta phải "cho biết" địa chỉ của server OpenVPN của ta , Server 1:
nano /etc/openvpn/client.conf

Tìm dòng cho biết:

remote my-server-1 1194

Và thay đổi my-server-1 thành địa chỉ IP của Server 1. Tiếp theo, ta phải đảm bảo khóa client và certificate trùng với tên file thực. Tìm kiếm các dòng sau:

cert client.crt
key client.key

và điều chỉnh chúng thành các khóa được sao chép qua (ví dụ: client1.crtclient1.key ).

Lưu và thoát bằng Control-O, Enter, Control-X.

Và tiếp theo, hãy bắt đầu VPN:

service openvpn start
, ta có thể kiểm tra nó bằng các lệnh sau:
service openvpn status
ifconfig

Bây giờ cả hai đầu của VPN đều hoạt động, ta nên kiểm tra mạng. Sử dụng lệnh sau:

ping 10.8.0.1

Và nếu thành công, bạn sẽ thấy thông tin như :

PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_req=1 ttl=64 time=0.102 ms
64 bytes from 10.8.0.1: icmp_req=2 ttl=64 time=0.056 ms

Xin chúc mừng, bạn đã hoàn tất!

Bất kỳ lưu lượng nào bạn không cần mã hóa, bạn có thể kết nối qua địa chỉ IP công khai. Bất kỳ lưu lượng nào giữa các server cloud bạn muốn được mã hóa, hãy kết nối với địa chỉ mạng Internet, ví dụ: Server 1 kết nối với 10.8.0.1 . Server 2 là 10.8.0.5 , Server 3 là 10.8.0.9 , v.v.

Truy cập được mã hóa sẽ chậm hơn so với không được mã hóa, đặc biệt nếu các server cloud của bạn nằm trong các trung tâm dữ liệu khác nhau, nhưng cả hai phương thức lưu lượng đều khả dụng đồng thời, vì vậy hãy chọn cho phù hợp.

Ngoài ra, bây giờ là thời điểm tốt để tìm hiểu thêm về OpenVPN và mã hóa nói chung. Trang web OpenVPN có một số tài nguyên tốt cho việc này.

Phụ lục 1

Bảo vệ

Có ba phím tắt được sử dụng ở đây mà nếu bảo mật là quan trọng nhất, bạn không nên làm.

  • Đầu tiên, tất cả các khóa đều được tạo từ xa trên một server ảo nằm trên Internet và không hoàn toàn nằm trong sự kiểm soát của ai đó. Cách an toàn nhất để thực hiện việc này là tạo các khóa của Tổ chức phát hành certificate trên một máy tính độc lập (không kết nối Internet) ở một vị trí an toàn.
  • Thứ hai, các khóa được truyền đi thay vì được tạo ra tại chỗ. SSH cung cấp một phương pháp truyền file an toàn hợp lý nhưng có nhiều trường hợp SSH không được bảo mật hoàn toàn. Nếu bạn tạo trong server , hãy chuyển CSR đến CA offline của bạn, ký chúng ở đó, sau đó truyền lại các yêu cầu đã ký, điều này sẽ an toàn hơn.
  • Thứ ba, không có password nào được gán cho các khóa. Vì đây là những server và có thể cần khởi động lại mà không cần giám sát, nên sự cân bằng này đã được thực hiện.

Ngoài ra, OpenVPN hỗ trợ vô số các tính năng tăng cường khác, ngoài phạm vi của hướng dẫn này. Đọc tại openvpn.org nên được thực hiện.

trở lại

Phụ lục 2

Một lưu ý trên mạng

Vì vậy, ứng dụng client đầu tiên sẽ sử dụng 10.8.0.6 làm địa chỉ IP và 10.8.0.5 là điểm cuối tunnel VPN. Địa chỉ thứ hai chỉ được sử dụng để định tuyến giao thông qua tunnel . Điều này là do mỗi client sử dụng mạng CIDR / 30, nghĩa là 4 địa chỉ IP được sử dụng trên mỗi client .

Vì vậy, server VPN sẽ sử dụng mạng 10.8.0.0/30:

10.8.0.0 Mạng lưới
10.8.0.1 Địa chỉ IP server
10.8.0.2 Điểm cuối tunnel
10.8.0.3 Phát thanh

Và ứng dụng client đầu tiên, client1, sẽ sử dụng mạng 10.8.0.4/30:

10.8.0.4 Mạng lưới
10.8.0.5 Địa chỉ IP server
10.8.0.6 Điểm cuối tunnel
10.8.0.7 Phát thanh

Và như thế...

trở lại

Tags:

Các tin trước

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