Tổng quan
WireGuard là giải pháp VPN miễn phí, mã nguồn mở được phát triển nhằm thấy thế giải pháp IPSec. WireGuard được phát triển như là module của Kernel với mục tiêu kế thừa các tính năng sẵn có của Kernel Linux, từ đó tối ưu hiệu năng giải pháp.
Hiện nay giải pháp WireGuard đang dần trở nên phổ biến. Và đặc biệt hơn, WireGuard đã chính thức được phát hành cùng Kernel version 5.6 vào tháng 3 năm 2020, tức tất cả phiên bản, distro Linux sử dụng Kernel từ verion 5.6 trở đi sẽ có sẵn giải pháp WireGuard.
Chuẩn bị
Trước khi bắt đầu chúng ta cần chuẩn bị 2 VM bao gồm:
- Server VPN WireGuard:
- OS: CentOS 7
- Cấu hình: 2 CPU / 2 GB RAM / 25 GB Disk
- IP: 123.123.123.123 (IP Public – eth0)
- Client:
- OS: CentOS 7
- Cấu hình: 2 CPU / 2 GB RAM / 25 GB Disk
- IP: 10.10.10.99 (IP LAN – eth0)
- Cả Server và Client đều đã tắt Firewalld, SELinux
Phần 1: Cài đặt Wireguard tools
Thực hiện trên cả
Server
vàClient
với quyềnroot
Bước 1: Cài đặt Wireguard tools
yum install -y epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm yum install -y yum-plugin-elrepo yum install -y kmod-wireguard wireguard-tools
Bước 2: Khởi động lại OS
init 6
Kiểm tra
Thực hiện trên Server VPN
[root@vpnserver ~]# modinfo wireguard filename: /lib/modules/3.10.0-1127.19.1.el7.x86_64/weak-updates/wireguard/wireguard.ko intree: Y alias: net-pf-16-proto-16-family-wireguard alias: rtnl-link-wireguard version: 1.0.20200908 author: Jason A. Donenfeld <[email protected]> description: WireGuard secure network tunnel license: GPL v2 retpoline: Y rhelversion: 7.8 srcversion: D75F0FE0090ED5C45DB6EF7 depends: udp_tunnel,ip6_udp_tunnel vermagic: 3.10.0-1127.el7.x86_64 SMP mod_unload modversions signer: The ELRepo Project (http://elrepo.org): ELRepo.org Secure Boot Key sig_key: F3:65:AD:34:81:A7:B2:0E:34:27:B6:1B:2A:26:63:5B:83:FE:42:7B sig_hashalgo: sha256
Thực hiện trên Client
[root@client1099 ~]# modinfo wireguard filename: /lib/modules/3.10.0-1127.19.1.el7.x86_64/weak-updates/wireguard/wireguard.ko intree: Y alias: net-pf-16-proto-16-family-wireguard alias: rtnl-link-wireguard version: 1.0.20200908 author: Jason A. Donenfeld <[email protected]> description: WireGuard secure network tunnel license: GPL v2 retpoline: Y rhelversion: 7.8 srcversion: D75F0FE0090ED5C45DB6EF7 depends: udp_tunnel,ip6_udp_tunnel vermagic: 3.10.0-1127.el7.x86_64 SMP mod_unload modversions signer: The ELRepo Project (http://elrepo.org): ELRepo.org Secure Boot Key sig_key: F3:65:AD:34:81:A7:B2:0E:34:27:B6:1B:2A:26:63:5B:83:FE:42:7B sig_hashalgo: sha256
Phần 2: Sinh cặp khóa Public / Private tại Server và Client
Bước 1: Sinh cặp khóa Public / Private tại Server VPN WireGuard
Thực hiện tại node
Server VPN WireGuard
Tạo thư mục chứa cấu hình WireGuard
sudo mkdir -p /etc/wireguard/
Sinh cặp khóa Public / Private
wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
Kết quả
[root@vpnserver ~]# wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key 1D4UVRkKVRufEXT2YcVmiUpV+r2io9iwSSB+uwh33GE=
Kiểm tra
[root@vpnserver ~]# cat /etc/wireguard/server_private.key wCa2SRefk/XUSfopmn6FTThCINCng/+EoTF8qEgg0XU= [root@vpnserver ~]# cat /etc/wireguard/server_public.key 1D4UVRkKVRufEXT2YcVmiUpV+r2io9iwSSB+uwh33GE=
Lưu ý:
- Khóa Private Server:
wCa2SRefk/XUSfopmn6FTThCINCng/+EoTF8qEgg0XU=
- Khóa Public Server:
1D4UVRkKVRufEXT2YcVmiUpV+r2io9iwSSB+uwh33GE=
Bước 2: Sinh cặp khóa Public / Private tại Client
Thực hiện tại node
Client
Tạo thư mục chứa cấu hình WireGuard
sudo mkdir -p /etc/wireguard/
Sinh cặp khóa Public / Private
wg genkey | sudo tee /etc/wireguard/client_private.key | wg pubkey | sudo tee /etc/wireguard/client_public.key
Kết quả
[root@client1099 ~]# wg genkey | sudo tee /etc/wireguard/client_private.key | wg pubkey | sudo tee /etc/wireguard/client_public.key JDllguLLGT1uctWL2uLK72XRU53XikLG5KY1HsebSFs=
Kiểm tra
[root@client1099 ~]# cat /etc/wireguard/client_private.key AEy7jE1bWj262W4oPOrRniqWRxGrSJPKoZ8tk9gzH3Y= [root@client1099 ~]# cat /etc/wireguard/client_public.key JDllguLLGT1uctWL2uLK72XRU53XikLG5KY1HsebSFs=
Lưu ý:
- Khóa Private Client:
AEy7jE1bWj262W4oPOrRniqWRxGrSJPKoZ8tk9gzH3Y=
- Khóa Public Client:
JDllguLLGT1uctWL2uLK72XRU53XikLG5KY1HsebSFs=
Phần 2: Cấu hình WireGuard
Bước 1: Cấu hình tại Server VPN WireGuard
Thực hiện tại node Server VPN WireGuard
Tạo mới file /etc/wireguard/wg0.conf
Cú pháp
[Interface] Address = <VPN_SERVER_IP>/<PREFIX> ListenPort = 51820 PrivateKey = <SERVER_PRIVATE_KEY> PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = <CLIENT_PUBLIC_KEY> AllowedIPs = <VPN_CLIENT_IP>/<PREFIX>
Lưu ý section [Interface]
:
Address
: IP VPN của Wireguard Server cũng như là range cấp VPN cho các clientPrivateKey
: Private key của VPN Server, nằm tại/etc/wireguard/server_private.key
ListenPort
: Port UDP phục vụ cho Client kết nối tớiPostUp, PostDown
: NAT traffic interfacewg0
tới Interfaceeth0
, khi đó client sẽ sử dụng Gateway của VPN Server để ra Internet
Lưu ý section [Peer]
:
PublicKey
: Public key của Client, nằm tại/etc/wireguard/client_public.key
(trên node Client)AllowedIPs
: IP VPN của Client khi kết nối tới
File config trong bài /etc/wireguard/wg0.conf
[Interface] Address = 30.0.0.1/24 ListenPort = 51820 PrivateKey = wCa2SRefk/XUSfopmn6FTThCINCng/+EoTF8qEgg0XU= PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = JDllguLLGT1uctWL2uLK72XRU53XikLG5KY1HsebSFs= AllowedIPs = 30.0.0.2/32
Thay đổi file permission
sudo chmod 600 /etc/wireguard/ -R
Bước 2: Cấu hình tại Client VPN
Thực hiện tại node Client
Tạo mới file /etc/wireguard/wg-client0.conf
Cú pháp
[Interface] Address = <VPN_CLIENT_IP>/<PREFIX> PrivateKey = <CLIENT_PRIVATE_KEY> [Peer] PublicKey = <SERVER_PUBLIC_KEY> AllowedIPs = 0.0.0.0/0 Endpoint = <SERVER_PUBLIC_IP>:<PORT> PersistentKeepalive = 25
Lưu ý section [Interface]
:
Address
: IP VPN khi Client kết nối tớiPrivateKey
: Khóa Private của Client, tại thư mục/etc/wireguard/client_private.key
Lưu ý section [Peer]
:
PublicKey
: Khóa Public của VPN Server, tại thư mục/etc/wireguard/server_public.key
AllowedIPs
: Giá trị0.0.0.0/0
tức toàn bộ traffic sẽ đi qua Interface VPN để ra InternetEndpoint
: Địa của Public + Port của Server VPNPersistentKeepalive
: Tạo kết nối dạng Keep alive
File config trong bài
[Interface] Address = 30.0.0.2/24 PrivateKey = AEy7jE1bWj262W4oPOrRniqWRxGrSJPKoZ8tk9gzH3Y= [Peer] PublicKey = 1D4UVRkKVRufEXT2YcVmiUpV+r2io9iwSSB+uwh33GE= AllowedIPs = 0.0.0.0/0 Endpoint = 123.123.123.123:51820 PersistentKeepalive = 25
Thay đổi file permission
sudo chmod 600 /etc/wireguard/ -R
Phần 3: Bổ sung cấu hình IP Forwarding trên VPN Server
Thực hiện tại node Server VPN WireGuard
Thực hiện
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf sysctl -p
Kết quả
[root@vpnserver ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf [root@vpnserver ~]# sysctl -p net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv4.ip_forward = 1 net.ipv4.ip_forward = 1
Phần 4: Khởi động VPN Server
Khởi tạo Server VPN Wireguard
Thực hiện tại node Server VPN WireGuard
Cách 1: Sử dụng CMD wg-quick
Khởi tạo tiến trình
wg-quick up /etc/wireguard/wg0.conf
Tắt tiến trình
wg-quick down /etc/wireguard/wg0.conf
Cách 2: Sử dụng Systemd
systemctl start [email protected] systemctl enable [email protected] systemctl status [email protected]
Kết nối VPN tại Client
Thực hiện tại node Client
Khởi động VPN Client
systemctl start [email protected]
Phần 5: Kiểm tra kết nối
Thực hiện tại Server VPN
Kiểm tra các interface hiện có
ip a
Kết quả
[root@vpnserver ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether fa:16:3e:01:a3:23 brd ff:ff:ff:ff:ff:ff inet 123.123.123.123/24 brd 103.124.94.255 scope global noprefixroute dynamic eth0 valid_lft 78847sec preferred_lft 78847sec 8: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 30.0.0.1/24 scope global wg0 valid_lft forever preferred_lft forever
Kiểm tra kết nối VPN
wg
Kết quả
[root@vpnserver ~]# wg interface: wg0 public key: 1D4UVRkKVRufEXT2YcVmiUpV+r2io9iwSSB+uwh33GE= private key: (hidden) listening port: 51820 peer: JDllguLLGT1uctWL2uLK72XRU53XikLG5KY1HsebSFs= endpoint: 321.321.321.321:45728 allowed ips: 30.0.0.0/24 latest handshake: 47 seconds ago transfer: 388 B received, 300 B sent
Tới đây, Peer client đã kết nối thành công tới Server VPN
Thực hiện tại Client
Kiểm tra các interface hiện có
ip a
Kết quả
[root@client1099 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:a0:f8:ad brd ff:ff:ff:ff:ff:ff inet 10.10.10.99/24 brd 10.10.10.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fea0:f8ad/64 scope link noprefixroute valid_lft forever preferred_lft forever 7: wg-client0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 30.0.0.2/24 scope global wg-client0 valid_lft forever preferred_lft forever inet6 fe80::2b19:6952:1135:d007/64 scope link flags 800 valid_lft forever preferred_lft forever
Kiểm tra kết nối VPN
wg
Kết quả
[root@client1099 ~]# wg interface: wg-client0 public key: JDllguLLGT1uctWL2uLK72XRU53XikLG5KY1HsebSFs= private key: (hidden) listening port: 47074 fwmark: 0xca6c peer: 1D4UVRkKVRufEXT2YcVmiUpV+r2io9iwSSB+uwh33GE= endpoint: 123.123.123.123:51820 allowed ips: 0.0.0.0/0 latest handshake: 1 minute, 5 seconds ago transfer: 300 B received, 420 B sent persistent keepalive: every 25 seconds
Kiểm tra địa chỉ IP Public, client sẽ sử dụng ra Interface
curl ipinfo.io
Kết quả
[root@client1099 ~]# curl ipinfo.io { "ip": "123.123.123.123", "city": "Cần Thơ", "region": "Can Tho", "country": "VN", "loc": "10.0371,105.7883", "org": "AS131353 NhanHoa Software company" "postal": "94150", "timezone": "Asia/Ho_Chi_Minh", "readme": "https://ipinfo.io/missingauth" }
Lưu ý, tại đây chúng ta thấy được Gateway client đã được redirect tới VPN Server
Tới đây, mình đã hướng dẫn xong các bạn cách cấu hình Wireguard VPN cơ bản trên CentOS 7.
Nguồn
https://www.wireguard.com/quickstart/
https://www.linuxbabe.com/centos/wireguard-vpn-server-centos