Bài 5: Cài đặt host-to-net VPN với OpenVPN

 

Trong bài này, giả sử một nhân viên công ty di chuyển ra ngoài văn phòng công ty và kết nối Internet từ một máy trạm (Cx) có địa chỉ 205.192.25.17/24. Nhân viên này muốn kết nối về mạng nội bộ của công ty (có địa chỉ 192.168.3.0/24) để trao đổi dữ liệu với một người dùng khác đang làm việc tại công ty trên máy trạm C3 có địa chỉ 192.168.3.7. Hiển nhiên, từ máy trạm Cx không thể truy cập đến C3 do địa chỉ mạng riêng 192.168.3.0/24 không tồn tại trên mạng công cộng Internet. Hơn nữa, router R4 với chức năng là Gateway của mạng nội bộ công ty ra ngoài Internet cũng ngăn cản tất cả các truy nhập không được phép từ ngoài mạng Internet vào mạng nội bộ của công ty. Giải pháp VPN ở đây là tạo ra một mạng riêng ảo (giả sử có địa chỉ 172.27.234.0/24) gắn vào R4 và cho phép các máy trạm bên ngoài Internet dạng Cx kết nối vào mạng VPN này thông qua mạng công cộng Internet. Sau khi kết nối thành công, một đường hầm được tạo ra giữa trạm CxR4 để người sử dụng trên trạm Cx tham gia vào mạng VPN 172.27.234.0/24 như một thành viên của mạng này (với địa chỉ IP tương ứng là 172.27.234.x). Ngoài ra, R4 cũng được cấu hình sẵn để các trạm trong mạng riêng ảo có thể kết nối sang mạng nội bộ 192.168.3.0, qua đó Cx sẽ kết nối được với C3. Các bước thực hiện như sau:

  • Download & cài đặt máy chủ OpenVPN trên R4.
  • Download & cài đặt phần mềm hỗ trợ OpenVPN trên máy trạm Cx.
  • Cầu hình và thực hiện kết nối VPN từ Cx vào R4.

Bước 1: Download, cài đặt OpenVPN Access Server

Download OpenVPN Access Server cho CentOS 6 (có thể vào OpenVPN web site để download phiên bản phù hợp) và cài đặt:

[root@R4 ~]# wget http://swupdate.openvpn.org/as/openvpn-as-2.1.2-CentOS6.x86_64.rpm
. . .
[root@R4 ~]# rpm -Uvh ./openvpn-as-2.1.2-CentOS6.x86_64.rpm
. . .

Chạy script ovpn-init để khởi tạo các tham số ban đầu cho OpenVNP AS. Lưu ý chọn giao diện cấu hình web tại địa chỉ 203.162.5.11.

[root@R4 ~]# /usr/local/openvpn_as/bin/ovpn-init
Detected an existing OpenVPN-AS configuration.
Continuing will delete this configuration and restart from scratch.
Please enter 'DELETE' to delete existing configuration: DELETE
Stopping openvpnas daemon...

          OpenVPN Access Server
Initial Configuration Tool
------------------------------------------------------

Quản trị OpenVPN có thể được thực hiện thông qua giao diện web, tại địa chỉ khi khởi tạo các thônng số cấu hình với ovpn-init. Tuy nhập vào https://203.162.5.11/admin để bắt đầu cấu hình. Account quản trị của OpenVPN có tên openvpn. Cần sử dụng lệnh passwd openvpn để thiết lập mật khẩu. Dùng tài khoản openvpn và mật khẩu đã thiết lập để login vào trang admin quản trị OpenVPN, giao diện web để quản trị máy chủ OpenVPN trên router R4 có dạng như sau:

Các thông số có thể giữ nguyên theo thiết lập mặc định khi chạy ovpn-init. Một số thông số cần kiểm tra và thiết lập lại. Đầu tiên là dải địa chỉ sẽ được cấp tự động mỗi khi một trạm kết nối vào mạng VPN. Chọn “VPN Settings” và thiết lập dải địa chỉ này là 172.27.224.0/24.

Sau khi thiết lập dải địa chỉ IP cho mạng riêng ảo, khởi động lại server để cấu hình mới được thực thi. Tiến trình máy chủ openvpn được khởi động lại và thiết lập các kết nối mạng as0t0as0t1 để R4 đóng vai trò là Gateway của mạng VPN 172.27.224.0:

[root@R4 ~]# ps -ef | grep openvpn
root      6237     1  0 08:50 ?        00:00:14 python -c from pyovpn.sagent.sagent_entry import openvpnas ; openvpnas() --logfile=/var/log/openvpnas.log --pidfile=/var/run/openvpnas.pid
501       6240  6237  0 08:51 ?        00:00:09 python -c from pyovpn.cserv.wserv_entry import start ; start() -no -u openvpn_as -g openvpn_as --pidfile /usr/local/openvpn_as/etc/tmp/wserv.pid -r epoll
501       6576  6237  0 10:24 ?        00:00:00 openvpn-openssl --errors-to-stderr --config stdin
501       6579  6576  0 10:24 ?        00:00:00 openvpn-openssl --errors-to-stderr --config stdin
501       6597  6237  0 10:24 ?        00:00:01 openvpn-openssl --errors-to-stderr --config stdin
root      6656  6640  0 11:07 pts/0    00:00:00 grep openvpn

[root@R4 ~]# ifconfig -a
as0t0     Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
inet addr:172.27.224.1  P-t-P:172.27.224.1  Mask:255.255.255.128
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:200
RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

as0t1     Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
inet addr:172.27.224.129  P-t-P:172.27.224.129  Mask:255.255.255.128
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
RX packets:2250 errors:0 dropped:0 overruns:0 frame:0
TX packets:2230 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:200
RX bytes:188304 (183.8 KiB)  TX bytes:187356 (182.9 KiB)

Bước 2: Download, cài đặt OpenVPN client

Cài đặt OpenVPN trên trạm client bằng lệnh yum. Sau khi cài đặt thành công, chương trình openvpn đã sẵn sang để kết nối VPN đến server.

[root@Cx ~]# yum install openvpn
[root@Cx ~]# openvpn --version
OpenVPN 2.3.11 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on May 10 2016
library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.03
Originally developed by James Yonan
Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
Compile time defines: enable_crypto=. . .

Để phục vụ kết nối VPN đến server, cần chuẩn bị các tài khoản user trên server này và thiết lập cấu hình kết nối. OpenVPN chấp nhận nhiều phương án xác thực user, trong đó phương án sử dụng Pluggable Authentication Modules (PAM) là đơn giản nhất. PAM là phương pháp mặc định để xác thực tài khoản login trong Linux, khi hệ thống vừa khởi động. Danh sách các tài khoản đang có của hệ thống có thể được xem trong file /etc/passwd. Để tạo thêm tài khoản, dùng lệnh adduser, để thiết lập mật khẩu cho user này, dùng passwd. Giả sử cần tạo thêm một tài khoản hoangph để phục vụ kết nối từ client OpenVPN:

[root@R4 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

[root@R4 ~]# adduser hoangph
[root@R4 ~]# passwd hoangph
Changing password for user hoangph.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

[root@R4 ~]# cat /etc/passwd | grep hoangph
hoangph:x:502:503::/home/hoangph:/bin/bash

Bước cuối cùng là chuẩn bị cấu hình kết nối đến OpenVPN server cho client. Có thể tạo file cấu hình bằng các lệnh trên server nhưng đơn giản nhất là sử dụng giao diện web. Truy nhập vào server theo địa chỉ https://203.162.5.11 (chú ý là không có đường dẫn /admin), login bằng tài khoản hoangph vừa tạo, server sẽ cho phép thực hiện một số các lựa chọn sau:

File cấu hình kết nối VPN từ client có thể được tải xuống từ server qua đường link “Yourself (user-locked profile)”. Tải file này về client với tên gọi client.ovpn. Nội dung file bao gồm các thông số kết nối cũng như phương pháp xác thực cho user hoangph:

[root@Cx ~]# cat ./Downloads/client.ovpn
# Automatically generated OpenVPN client config file
# Generated on Tue Aug  2 05:28:02 2016 by R4
# Note: this config file contains inline private keys
#       and therefore should be kept confidential!
# Note: this configuration is user-locked to the username below
# OVPN_ACCESS_SERVER_USERNAME=ope
. . .

Bước 3: Kết nối VPN

Sau khi đã chuẩn bị đầy đủ các dữ liệu cấu hình, bước cuối cùng là tạo kênh kết nối đến VPN server. Khi tạo kết nối, mặc dù file cấu hình đã được thiết lập riêng cho user hoangph nhưng vì lý do an ninh, người sử dụng một lần nữa phải nhập vào tên và mật khẩu của user này. Nếu tên và mật khẩu nhập vào không khớp với thông tin user đã được cấu hình trong file client.ovpn, kết nối sẽ không được thiết lập.

[root@Cx ~]# openvpn --config ./Downloads/client.ovpn
Thu Aug 18 08:46:41 2016 OpenVPN 2.3.11 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on May 10 2016
Thu Aug 18 08:46:41 2016 library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.03
Enter Auth Username:hoangph
Enter Auth Password:
Thu Aug 18 08:46:48 2016 Control Channel Authentication: tls-auth using INLINE static key file
Thu Aug 18 08:46:48 2016 Outgoing Control Channel Authentication:

Sau khi cung cấp user name và mật khẩu để xác thực người dùng thành công, chương trình OpenVPN trên máy trạm client mở một đường hầm kết nối đến server thông qua một kết nối ảo có tên là tun0:

[root@Cx ~]# ifconfig -a

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
inet addr:172.27.224.130  P-t-P:172.27.224.130  Mask:255.255.255.128
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
RX packets:1714 errors:0 dropped:0 overruns:0 frame:0
TX packets:1726 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:143976 (140.6 KiB)  TX bytes:144696 (141.3 KiB)

Kết nối mạng tun0 (viết tắt của tunnel - đường hầm) được tự động gán địa chỉ 172.27.224.130 như đã được cấu hình trên server. Ngoài ra, bảng routing được cập nhật thêm các liên kết trực tiếp trong mạng riêng ảo 172.27.224.0 và một Gateway mặc định của mạng riêng ảo này (có địa chỉ 172.27.224.130) được thêm vào:

[root@Cx ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
203.162.5.11    205.192.25.1    255.255.255.255 UGH   0      0        0 eth2
172.27.224.128  0.0.0.0         255.255.255.128 U     0      0        0 tun0
205.192.25.0    0.0.0.0         255.255.255.0   U     0      0        0 eth2
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth2
0.0.0.0         172.27.224.129  128.0.0.0       UG    0      0        0 tun0
128.0.0.0       172.27.224.129  128.0.0.0       UG    0      0        0 tun0
0.0.0.0         205.192.25.1    0.0.0.0         UG    0      0        0 eth2

Kiểm tra kết nối thành công từ trạm Cx đến C3 bằng lệnh ping. Nếu ping không thành công, cần kiểm tra lại các cấu hình tường lửa (iptables) trên các trạm và router trung gian. Giải pháp đơn giản là tắt các dịch vụ iptables trên các trạm và router trung gian này.

[root@Cx ~]# ping -c 3 192.168.3.7
PING 192.168.3.7 (192.168.3.7) 56(84) bytes of data.
64 bytes from 192.168.3.7: icmp_seq=1 ttl=63 time=3.67 ms
64 bytes from 192.168.3.7: icmp_seq=2 ttl=63 time=2.43 ms
64 bytes from 192.168.3.7: icmp_seq=3 ttl=63 time=2.03 ms

--- 192.168.3.7 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2007ms
rtt min/avg/max/mdev = 2.032/2.714/3.679/0.702 ms

Kiểm tra đường đi của gói tin giữa CxC3 bằng lệnh traceroute. Có thể thấy đường đi được thể hiện như là trạm Cx đang kết nối trực tiếp trong mạng 172.27.244.0 và để gói tin đi đến C3, nó chỉ cần qua một router duy nhất là R4 (địa chỉ 172.27.224.129):

[root@Cx ~]# traceroute 192.168.3.7
traceroute to 192.168.3.7 (192.168.3.7), 30 hops max, 60 byte packets
1  172.27.224.129 (172.27.224.129)  3.514 ms  12.702 ms  12.444 ms
2  192.168.3.7 (192.168.3.7)  17.819 ms  17.691 ms  17.281 ms

Sử dụng Wireshark chạy trên Cx để kiểm tra các gói tin ICMP của lệnh ping giữa CxC3. Có thể thấy các gói tin chạy trên TCP/IP protocol stack giống hệt như Cx đang kết nối trực tiếp với C3 thông qua router R4:



Tuy nhiên, đứng trên router trung gian R5, sử dụng Wireshark để kiểm tra các gói tin trung chuyển giữa CxC3. Hoàn toàn không thấy các gói tin ICMP mà thay vào đó là các gói UDP đã được mã hóa, gửi qua lại giữa 2 đầu đường hầm 203.162.5.11 và 203.192.25.17: