Từng bước xây dựng server VPN L2TP/IPSec trên CentOS 7

7Host sẽ hướng dẫn các bạn cài đặt VPN giao thức L2TP trên CentOS 7 kết hợp mã hóa dữ liệu bằng IPSec, với ưu điểm setup nhanh và không cần cài thêm ứng dụng thứ ba.

Virtual Private Network hay thường được gọi là tắt là VPN, một thuật ngữ quen thuộc đối với dân CNTT. VPN đã xuất hiện từ rất lâu đời với các giao thức có thể kể đến như PPTP, L2TP, SSTP, OpenVPN, IKEv2…Bài viết này 7Host sẽ hướng dẫn các bạn cài đặt VPN trên giao thức L2TP kết hợp mã hóa dữ liệu bằng IPSec.

1. Chuẩn bị

Các bạn cần chuẩn bị một VPS/Server chạy hệ điều hành CentOS 7 đã cập nhật phần mềm mới nhất. Nếu chưa cập nhật hãy gõ ngay lệnh sau:

[root@server7h ~] yum update -y
Tham khảo thêm: Hướng dẫn cài CentOS 7 toàn tập

Tiếp đến bạn nên tắt SELinux để tránh các lỗi phát sinh:

[root@server7h ~] nano /etc/sysconfig/selinux

Sửa giá trị “SELINUX=enforcing” thành “SELINUX=disabled” như bên dưới.

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled

Sau khi cập nhật xong và tắt SELinux bạn lưu ý phải khởi động lại máy chủ để nhận cấu hình mới.

2. Các bước cài đặt

Cài đặt giao thức L2TP

Mặc định trên CentOS 7 chưa hỗ trợ sẵn giao thức L2TP nên các bạn cần cài vào máy chủ hai gói sau. Nhưng trước tiên hãy đảm bảo là bạn đã cài repository chứa các gói dự định sẽ cài.

[root@server7h ~] yum install epel-release

Tiếp tục cài L2TP:

[root@server7h ~] yum install xl2tpd libreswan

Thiết lập các thông số trong kernel

Để luồng dữ liệu từ các máy client kết nối vào VPN Server các bạn cần thiết lập các thông số bên dưới vào kernel Linux. Thực hiện mở file “sysctl.conf” tại đường dẫn sau:

[root@server7h ~] nano /etc/sysctl.conf

Thêm vào cuối file nội dung như bên dưới:

vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.ip_forward = 1
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_source_route = 0

Các bạn tiến hành save lại và dùng lệnh sau để kernel nhận các thiết lập này.

[root@server7h ~] sysctl -p

Cấu hình IPSec

IPSec là một giao thức bảo mật dùng để mã hóa thông tin. Mặc định IPSec đã có sẵn trên CentOS 7 nên các bạn chỉ cần cấu hình thông số theo ý muốn mà không cần phải cài đặt. Các bạn mở file cấu hình tại đường dẫn sau:

[root@server7h ~] nano /etc/ipsec.d/l2tp_psk.conf

Thêm vào nội dung bên dưới:

conn L2TP-PSK-NAT
     rightsubnet=vhost:%priv
     also=L2TP-PSK-noNAT
conn L2TP-PSK-noNAT
     authby=secret
     pfs=no
     auto=add
     keyingtries=3
     dpddelay=30
     dpdtimeout=120
     dpdaction=clear
     rekey=no
     ikelifetime=8h
     keylife=1h
     type=transport
     left=10.10.10.100
     leftprotoport=17/1701
     right=%any
     rightprotoport=17/%any

Lưu ý: Phần IP 10.10.10.100 các bạn thay bằng IP của VPS/Server nhé.

Tiếp đến cần cấu hình mật khẩu Pre-Shared Key (PSK), đây là mật khẩu chung được gửi tới toàn bộ client muốn kết nối đến VPN phải nhập mật khẩu này.

[root@server7h ~] nano /etc/ipsec.secrets

Các bạn khai báo như sau:

10.10.10.100 %any: PSK "www.7host.vn"

Lưu ý: Phần IP 10.10.10.100 các bạn thay bằng IP của VPS/Server và phần PSK các bạn cần đặt mật khẩu phức tạp tối thiểu 6 kí tự.

Tiếp đến là bật dịch vụ IPSec lên và kiểm tra xem chúng ta cấu hình có sai cú pháp đoạn nào hay không.

[root@server7h ~] systemctl start ipsec.service

[root@server7h ~] ipsec verify
Verifying installed system and configuration files

Version check and ipsec on-path                   	[OK]
Libreswan 3.25 (netkey) on 3.10.0-1127.8.2.el7.x86_64
Checking for IPsec support in kernel              	[OK]
 NETKEY: Testing XFRM related proc values
         ICMP default/send_redirects              	[OK]
         ICMP default/accept_redirects            	[OK]
         XFRM larval drop                         	[OK]
Pluto ipsec.conf syntax                           	[OK]
Two or more interfaces found, checking IP forwarding	[OK]
Checking rp_filter                                	[ENABLED]
 /proc/sys/net/ipv4/conf/eth0/rp_filter           	[ENABLED]
  rp_filter is not fully aware of IPsec and should be disabled
Checking that pluto is running                    	[OK]
 Pluto listening for IKE on udp 500               	[OK]
 Pluto listening for IKE/NAT-T on udp 4500        	[OK]
 Pluto ipsec.secret syntax                        	[OK]
Checking 'ip' command                             	[OK]
Checking 'iptables' command                       	[OK]
Checking 'prelink' command does not interfere with FIPS	[OK]
Checking for obsolete ipsec.conf options          	[OK]

Sau khi gõ lệnh verify để kiểm tra thì các bạn sẽ thấy có một cảnh báo màu đỏ với nội dung khuyến nghị nên tắt chức năng rp_filter trong kernel để đảm bảo là IPSec hoạt động đầy đủ tính năng.

Các bạn thực hiện tắt bằng một lệnh sau:

[root@server7h ~] echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter

Sau đó các bạn thử verify lại sẽ không còn cảnh báo nào nữa.

Cho phép IPSec tự bật khi khởi động lại server.

[root@server7h ~] systemctl enable ipsec

Cấu hình dịch vụ xl2tpd

Đây là dịch vụ giúp chúng ta tương tác được với giao thức L2TP. Tại đây các bạn sẽ cấu hình được các thông số như địa chỉ IP cấp phát, cách thức xác thực cũng như quản lý user đăng nhập.

Đầu tiên các bạn tiến hành mở file sau:

[root@server7h ~] nano /etc/xl2tpd/xl2tpd.conf

Thay thế bằng nội dung sau:

[global]
listen-addr = 10.10.10.100
ipsec saref = yes
[lns default]
ip range = 192.168.100.100-192.168.100.200
local ip = 192.168.100.99
require chap = yes
refuse pap = yes
require authentication = yes
name = 7Host VPN Server
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

Tiếp đến mở file “options.xl2tpd” tại đường dẫn:

[root@server7h ~] /etc/ppp/options.xl2tpd

Xóa hết nội dung bên trong và dán vào nội dung mới bên dưới:

ipcp-accept-local
ipcp-accept-remote
ms-dns  8.8.8.8
ms-dns  1.1.1.1
noccp
noauth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000

Tiếp đến là khai báo username và password cho từng client trong file sau:

[root@server7h ~] nano /etc/ppp/chap-secrets

USERNAME PASSWORD

Lưu ý: Các bạn đổi Username và Password thành user/pass mà các bạn mong muốn.

Tham khảo thêm: Cách tạo mật khẩu phức tạp

Khởi động dịch vụ xl2tpd lên và cho phép khởi động cùng server bằng hai lệnh sau:

[root@server7h ~] systemctl start xl2tpd

[root@server7h ~] systemctl enable xl2tpd

Cấu hình firewall

Các bạn cần cấu hình mở port và cho phép gói tin đi qua card mạng trên server. Các bạn gõ trực tiếp các lệnh sau:

[root@server7h ~] iptables -A INPUT -p gre -j ACCEPT
[root@server7h ~] iptables -A OUTPUT -p gre -j ACCEPT
[root@server7h ~] iptables -A FORWARD -s 192.168.100.0/24 -j ACCEPT
[root@server7h ~] iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens18 -j MASQUERADE
[root@server7h ~] iptables-save 
[root@server7h ~] iptables -A INPUT -p udp --dport 1701 -j ACCEPT
[root@server7h ~] iptables -A INPUT -p udp --dport 500 -j ACCEPT
[root@server7h ~] iptables -A INPUT -p udp --dport 4500 -j ACCEPT
[root@server7h ~] iptables-save

Lưu ý: Đoạn “ens18” các bạn thay thế bằng đúng tên card mạng của server.

3. Kiểm tra kết quả

Như vậy là các bước xây dựng một server VPN chạy giao thức L2TP/IPSec đã hoàn tất. Đến đây các bạn có thể kiểm thử bằng các vào thiết lập VPN Client tích hợp sẵn trên hầu hết các nền tảng từ Windows, Linux, MacOS đến Android, iOS…7Host sẽ cố gắng cập nhật bài hướng dẫn kết nối trong thời gian sớm nhất đến các bạn.

Nếu trong quá trình cài đặt theo bài viết này gặp khó khăn các bạn đừng ngần ngại gửi email về [email protected] để 7Host hỗ trợ cho các bạn nhé.

Hướng Dẫn Cài Đặt CentOS 7 Toàn Tập

Hướng Dẫn Cài Đặt CentOS 8 Toàn Tập

Hướng dẫn cài đặt nhanh NodeJS trên CentOS 7

Các hàm xử lý chuỗi nâng cao trong Bash (Phần 2)

Hướng dẫn cài đặt WordPress trên DirectAdmin (Evolution Skin)

Các toán tử cơ bản, cấu trúc so sánh và mảng trong Bash

Hướng Dẫn Trỏ File Hosts Trên Máy Tính Để Kiểm Tra Website Khi Chưa Có DNS

Hướng Dẫn Cài Đặt Nhiều Phiên Bản PHP Trên DirectAdmin