1. Tổng quan.
Hướng dẫn này mô tả cách cấu hình VPN IPsec site-to-site giữa hai site A và B sử dụng StrongSwan. Mục tiêu là thiết lập một kết nối bảo mật giữa hai mạng nội bộ thông qua internet.
Hãy so sánh IPSec và WireGuard, ta thấy chúng đều là các giao thức VPN phổ biến, nhưng chúng có những đặc điểm và hiệu suất khác nhau.
IPSec.
- Bảo mật: IPSec là một giao thức VPN rất bảo mật và đã được sử dụng rộng rãi trong nhiều năm. Nó hỗ trợ nhiều thuật toán mã hóa và xác thực.
- Hiệu suất: IPSec có thể có hiệu suất tốt, nhưng nó thường phức tạp hơn để cấu hình và quản lý. Hiệu suất có thể bị ảnh hưởng bởi overhead từ việc mã hóa và xác thực.
- Khả năng tương thích: IPSec được hỗ trợ rộng rãi trên nhiều nền tảng và thiết bị, bao gồm cả các thiết bị mạng doanh nghiệp và hệ điều hành.
- Phức tạp: Cấu hình IPSec có thể phức tạp và yêu cầu nhiều kiến thức về mạng và bảo mật.
WireGuard.
- Bảo mật: WireGuard được thiết kế với mục tiêu đơn giản và bảo mật. Nó sử dụng các thuật toán mã hóa mới và được đánh giá cao về bảo mật.
- Hiệu suất: WireGuard thường có hiệu suất tốt hơn IPSec do thiết kế đơn giản và hiệu quả. Nó có thể cung cấp tốc độ kết nối nhanh hơn và độ trễ thấp hơn.
- Khả năng tương thích: WireGuard là một giao thức mới hơn và không được hỗ trợ rộng rãi như IPSec trên tất cả các thiết bị và nền tảng. Tuy nhiên, nó đang ngày càng được tích hợp vào nhiều hệ điều hành và thiết bị.
- Đơn giản: WireGuard rất dễ cấu hình và quản lý so với IPSec. Cấu hình của nó đơn giản và dễ hiểu.
Nếu bạn cần một giải pháp VPN đơn giản, hiệu suất cao và dễ cấu hình, WireGuard là một lựa chọn tốt. Nếu bạn cần một giải pháp VPN đã được kiểm chứng và hỗ trợ rộng rãi trên nhiều thiết bị và nền tảng, IPSec có thể là lựa chọn phù hợp.
2. Thông tin các site và sơ đồ đấu nối.
Topology mô tả cấu trúc mạng giữa hai site với kết nối IPsec VPN Tunnel (IKEv2).

3. Hướng dẫn config.
3.1. Kích hoạt chuyển tiếp gói tin trên Kernel.
Thêm các dòng cấu hình vào cuối file `/etc/sysctl.conf` và reload cấu hình.
cat >> /etc/sysctl.conf << 'OEF'
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
OEF
Lưu file và chạy lệnh dưới để áp dụng thay đổi.
sysctl -p
3.2. Config network.
Config network cho VPN Server 1 Site A.
cat > /etc/netplan/00-installer-config.yaml << 'OEF'
network:
version: 2
ethernets:
ens160:
addresses:
- 10.237.7.81/24
ens192: {}
vlans:
vlan101:
id: 101
link: ens192
addresses:
- 10.11.1.81/24
OEF
chmod 600 /etc/netplan/00-installer-config.yaml
netplan apply
Config network cho VPN Server 2 Site A.
cat > /etc/netplan/00-installer-config.yaml << 'OEF'
network:
version: 2
ethernets:
ens160:
addresses:
- 10.237.7.82/24
ens192: {}
vlans:
vlan101:
id: 101
link: ens192
addresses:
- 10.11.1.82/24
OEF
chmod 600 /etc/netplan/00-installer-config.yaml
netplan apply
Config network interface và static route cho Client Site A.
cat > /etc/netplan/00-installer-config.yaml << 'OEF'
network:
version: 2
ethernets:
ens160:
addresses:
- 10.237.7.77/24
gateway4: 10.237.7.1
ens192: {}
vlans:
vlan101:
id: 101
link: ens192
addresses:
- 10.11.1.77/24
routes:
- to: 10.12.1.0/24
via: 10.11.1.254
- to: 10.12.2.0/24
via: 10.11.1.254
- to: 10.12.3.0/24
via: 10.11.1.254
OEF
chmod 600 /etc/netplan/00-installer-config.yaml
netplan apply
Với Site B – Server VPN (phía khách hàng nên demo 1 Server thôi)
cat > /etc/netplan/00-installer-config.yaml << 'OEF'
network:
version: 2
ethernets:
ens160:
addresses:
- 10.237.7.83/24
gateway4: 10.237.7.1
ens192: {}
vlans:
vlan101:
id: 101
link: ens192
addresses:
- 10.12.1.83/24
OEF
chmod 600 /etc/netplan/00-installer-config.yaml
netplan apply
Config network interface và static route cho Client Site B.
cat > /etc/netplan/00-installer-config.yaml << 'OEF'
network:
version: 2
ethernets:
ens160:
addresses:
- 10.237.7.78/24
gateway4: 10.237.7.1
ens192: {}
vlans:
vlan101:
id: 101
link: ens192
addresses:
- 10.12.1.78/24
routes:
- to: 10.11.1.0/24
via: 10.12.1.83
- to: 10.11.2.0/24
via: 10.12.1.83
- to: 10.11.3.0/24
via: 10.12.1.83
OEF
chmod 600 /etc/netplan/00-installer-config.yaml
netplan apply
3.3. Cài đặt và config Keepalived ở Site A.
Cài đặt daemon Keepalived trên hệ thống.
apt-get update
apt-get install keepalived -y
Config Keepalived Site A – VPN Server 1
cat > /etc/keepalived/keepalived.conf << 'OEF'
vrrp_sync_group VNG {
group {
EXT
INT
}
notify "/usr/local/sbin/notify-ipsec.sh"
}
vrrp_instance INT {
state MASTER
interface vlan101
virtual_router_id 11
priority 50
advert_int 5
unicast_src_ip 10.11.1.81
unicast_peer {
10.11.1.82
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.11.1.254/24 dev vlan101
}
garp_master_delay 1
}
vrrp_instance EXT {
state MASTER
interface ens160
virtual_router_id 22
priority 50
advert_int 5
unicast_src_ip 10.237.7.81
unicast_peer {
10.237.7.82
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.237.7.80/24 dev ens160
}
garp_master_delay 1
}
OEF
Config Keepalived Site A – VPN Server 2.
cat > /etc/keepalived/keepalived.conf << 'OEF'
vrrp_sync_group VNG {
group {
EXT
INT
}
notify "/usr/local/sbin/notify-ipsec.sh"
}
vrrp_instance INT {
state BACKUP
interface vlan101
virtual_router_id 11
priority 50
advert_int 5
unicast_src_ip 10.11.1.82
unicast_peer {
10.11.1.81
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.11.1.254/24 dev vlan101
}
garp_master_delay 1
}
vrrp_instance EXT {
state BACKUP
interface ens160
virtual_router_id 22
priority 50
advert_int 5
unicast_src_ip 10.237.7.82
unicast_peer {
10.237.7.81
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.237.7.80/24 dev ens160
}
garp_master_delay 1
}
OEF
Nếu hai server có sự khác biệt về thời gian hệ thống (date
không đồng bộ), gói tin VRRP có thể bị hiểu sai. Hãy đảm bảo đồng bộ thời gian bằng NTP:
timedatectl set-timezone Asia/Ho_Chi_Minh
timedatectl set-ntp on
systemctl restart systemd-timesyncd
Tạo script check status của 2 interface trên cả 2 VPN Server Site A, nếu 1 trong 2 interface down sẽ return về 1 thể hiện thất bại và chuyển mode từ MASTER sang BACKUP. Ngược lại return về 0 và giữ nguyên mode MASTER cho node này.
cat > /usr/local/sbin/notify-ipsec.sh << 'OEF'
#!/bin/bash
if ! ip link show ens160 | grep -q "state UP"; then
/usr/bin/logger "Interface ens160 is down, changing state to BACKUP"
return 1
fi
if ! ip link show ens192 | grep -q "state UP"; then
/usr/bin.logger "Interface ens192 is down, changing state to BACKUP"
return 1
fi
return 0
OEF
chmod +x /usr/local/sbin/notify-ipsec.sh
Khởi động lại Keepalived trên cả 2 VPN Server Site A.
systemctl restart keepalived.service
systemctl enable keepalived.service
systemctl status keepalived.service
3.4. Tạo dịch vụ check để quyết định active dịch vụ IPSec ở VPN Server 1 hay VPN Server 2.
Tạo script /usr/local/bin/strongwan-active
trên 2 Server VPN của Site A.
cat > /usr/local/bin/strongwan-active << 'OEF'
#!/bin/bash
count=0
while true; do
sleep 60
STATE=$(kill -s $(keepalived --signum=DATA) $(cat /var/run/keepalived.pid) && grep -E 'VRRP_Instance|State' /tmp/keepalived.data | awk '/State/ {print $NF}' | grep -E 'MASTER|BACKUP|FAULT' | tail -n 1)
if [[ "$STATE" == "MASTER" ]]; then
if [ $(systemctl is-active strongswan-starter.service) == 'inactive' ]; then
echo "${count} - IPsec is not running, state is MASTER -> Start IPsec"
ipsec stop
sleep 5
systemctl start strongswan-starter.service
sleep 5
ipsec start
else
echo "${count} - IPsec is up and running, state is MASTER"
fi
else
if [[ $(systemctl is-active strongswan-starter.service) == 'inactive' ]]; then
echo "${count} - IPsec is not running, state is BACKUP"
else
echo "${count} - IPsec is up and running, state is BACKUP -> Stop IPsec"
ipsec stop
systemctl stop strongswan-starter.service
fi
fi
count=$((count+1))
done
OEF
chmod +x /usr/local/bin/strongwan-active
Đối với Site B thì mình chỉ có 1 VPN Server nên mình chỉ sử dụng script check ICMP đến 1 host nào đó ở Site A, mục đích đơn giản để nó khởi động lại dịch vụ IPSec hoàn toàn tự động giúp mình khi ICMP bị mất.
cat > /usr/local/bin/strongwan-active << 'OEF'
#!/bin/bash
count=0
while true; do
sleep 30
if [ $(ping -I 10.12.1.83 -c 4 -W 1 10.11.1.254 | grep -c "64 bytes from") -eq 0 ]; then
echo "${count} - IPsec is not running"
ipsec restart
else
echo "${count} - IPsec is up and running"
fi
count=$((count+1))
done
OEF
chmod +x /usr/local/bin/strongwan-active
Tạo file /etc/systemd/system/strongwan-active.service
trên 2 Server VPN của Site A và Site B.
cat > /etc/systemd/system/strongwan-active.service << OEF
[Unit]
After=network.target
[Service]
WorkingDirectory=/usr/local/bin/
ExecStart=/usr/local/bin/strongwan-active
Restart=always
User=root
Group=root
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target
OEF
Reload daemon
và start dịch vụ strongwan-active
vừa tạo trên 2 Server VPN của Site A và Site B.
systemctl daemon-reload
systemctl enable strongwan-active
systemctl restart strongwan-active
systemctl status strongwan-active
Check log.
journalctl -u strongwan-active -f -n 100
3.5. Cài đặt Strongswan.
Cài đặt daemon StrongSwan IPSec trên hệ thống.
apt-get update
apt-get install strongswan libcharon-extra-plugins strongswan-pki -y
3.6. Cấu hình thêm khóa xác thực cho 2 Site.
Thiết lập khóa PSK cho cả hai site trong file `/etc/ipsec.secrets`.
Config cho 2 VPN Server – Site A
cat > /etc/ipsec.secrets << 'OEF'
10.237.7.80 10.237.7.83 : PSK "MyKey123"
OEF
Config cho VPN Server – Site B
cat > /etc/ipsec.secrets << 'OEF'
10.237.7.83 10.237.7.80 : PSK "MyKey123"
OEF
3.7. Config IPSec VPN.
Backup file /etc/ipsec.conf cho cả 2 VPN Server ở 2 Site.
mv /etc/ipsec.conf /etc/ipsec.conf.bak
Tạo file cấu hình mới cho StrongSwan tại `/etc/ipsec.conf` cho cả hai site với các thông số như sau:
Config cho 2 VPN Server – Site A
cat > /etc/ipsec.conf << 'OEF'
config setup
charondebug="all"
uniqueids=yes
strictcrlpolicy=no
conn site-a-to-site-b
authby=secret
left=10.237.7.80
leftid=10.237.7.80
leftsubnet=10.11.1.0/24,10.11.2.0/24,10.11.3.0/24
right=10.237.7.83
rightsubnet=10.12.1.0/24,10.12.2.0/24,10.12.3.0/24
ike=aes256-sha2_256-modp2048
esp=aes256-sha2_256
keyexchange=ikev2
keyingtries=0
ikelifetime=1h
lifetime=8h
dpddelay=30
dpdtimeout=30
dpdaction=restart
auto=start
OEF
Config cho VPN Server – Site B
cat > /etc/ipsec.conf << 'OEF'
config setup
charondebug="all"
uniqueids=yes
strictcrlpolicy=no
conn site-b-to-site-a
authby=secret
left=10.237.7.83
leftid=10.237.7.83
leftsubnet=10.12.1.0/24,10.12.2.0/24,10.12.3.0/24
right=10.237.7.80
rightsubnet=10.11.1.0/24,10.11.2.0/24,10.11.3.0/24
ike=aes256-sha2_256-modp2048
esp=aes256-sha2_256
keyexchange=ikev2
keyingtries=0
ikelifetime=1h
lifetime=8h
dpddelay=30
dpdtimeout=30
dpdaction=restart
auto=start
OEF
Các tùy chọn này giúp cấu hình một kết nối VPN site-to-site bảo mật và ổn định giữa hai mạng và chúng có ý nghĩa như sau:
Phần config setup
.
config setup
charondebug="all"
uniqueids=yes
strictcrlpolicy=no
- charondebug=”all”: Tùy chọn này bật tất cả các mức độ ghi log cho daemon Charon của StrongSwan. Điều này hữu ích cho việc gỡ lỗi vì nó cung cấp thông tin chi tiết về mọi hoạt động của Charon.
- uniqueids=yes: Tùy chọn này đảm bảo rằng mỗi ID của người dùng (ví dụ: địa chỉ IP) là duy nhất. Nếu một người dùng cố gắng kết nối với cùng một ID từ một thiết bị khác, kết nối cũ sẽ bị ngắt.
- strictcrlpolicy=no: Tùy chọn này cho phép các chứng chỉ không có danh sách thu hồi chứng chỉ (CRL) hợp lệ vẫn được chấp nhận. Nếu đặt là
yes
, các chứng chỉ không có CRL hợp lệ sẽ bị từ chối.
Phần conn
ví dụ như conn site-a-to-site-b
.
conn site-a-to-site-b
authby=secret
left=%defaultroute
leftid=10.237.7.80
leftsubnet=10.11.1.0/24,10.11.2.0/24,10.11.3.0/24
right=10.237.7.83
rightsubnet=10.12.1.0/24,10.12.2.0/24,10.12.3.0/24
ike=aes256-sha2_256-modp2048
esp=aes256-sha2_256
keyexchange=ikev2
keyingtries=0
ikelifetime=1h
lifetime=8h
dpddelay=30
dpdtimeout=30
dpdaction=restart
auto=start
- authby=secret: Chỉ định rằng việc xác thực sẽ được thực hiện bằng cách sử dụng pre-shared key.
- left=%defaultroute: Sử dụng interface có default route để thiết lập kết nối VPN
- leftid=10.237.7.80: ID của local, thường là địa chỉ IP hoặc tên miền.
- leftsubnet=10.11.1.0/24,10.11.2.0/24,10.11.3.0/24: Các subnet trong local sẽ được bảo vệ bởi VPN.
- right=10.237.7.83: Địa chỉ IP của remote VPN.
- rightsubnet=10.12.1.0/24,10.12.2.0/24,10.12.3.0/24: Các subnet remote VPN sẽ được bảo vệ bởi VPN.
- ike=aes256-sha2_256-modp2048: Các thuật toán được sử dụng cho IKE (Internet Key Exchange).
aes256
là mã hóa AES với khóa 256-bit,sha2_256
là hàm băm SHA-256 vàmodp2048
là nhóm Diffie-Hellman với kích thước 2048-bit. - esp=aes256-sha2_256: Các thuật toán được sử dụng cho ESP (Encapsulating Security Payload).
aes256
là mã hóa AES với khóa 256-bit vàsha2_256
là hàm băm SHA-256. - keyexchange=ikev2: Sử dụng version 2 của giao thức IKE để trao đổi khóa.
- keyingtries=0: Số lần thử lại khi trao đổi khóa thất bại.
0
có nghĩa là thử lại vô hạn. - ikelifetime=1h: Thời gian sống của khóa IKE trước khi nó cần được làm mới. Ở đây là 1 giờ.
- lifetime=8h: Thời gian sống của khóa IPsec trước khi nó cần được làm mới. Ở đây là 8 giờ.
- dpddelay=30: Khoảng thời gian (giây) giữa các gói DPD (Dead Peer Detection) để kiểm tra kết nối.
- dpdtimeout=120: Thời gian chờ (giây) trước khi xác định rằng peer đã chết nếu không nhận được phản hồi DPD.
- dpdaction=restart: Hành động sẽ được thực hiện khi peer được xác định là đã chết.
restart
có nghĩa là khởi động lại kết nối. - auto=start: Tự động khởi động kết nối khi dịch vụ StrongSwan khởi động.
Ví dụ tham khảo cho cấu hình trên Cisco ASA.
interface GigabitEthernet0/0
nameif outside
security-level 0
ip address 10.237.7.83 255.255.255.0
!
interface GigabitEthernet0/1
nameif inside
security-level 100
ip address 10.22.0.10 255.255.255.0
!
object-group network local-network
network-object 10.22.0.0 255.255.255.0
object-group network remote-network
network-object 10.11.0.0 255.255.255.0
!
access-list asa-strongswan-vpn extended permit ip object-group local-network object-group remote-network
!
route outside 0.0.0.0 0.0.0.0 10.237.7.80 1
!
crypto ipsec ikev1 transform-set TRANSFORM-SS-TEST esp-aes-256 esp-sha-hmac
!
crypto map outside_map 10 match address asa-strongswan-vpn
crypto map outside_map 10 set peer 10.237.7.80
crypto map outside_map 10 set ikev1 transform-set TRANSFORM-SS-TEST
crypto map outside_map 10 set security-association lifetime seconds 28800
crypto map outside_map interface outside
!
crypto isakmp identity address
crypto ikev1 enable outside
crypto ikev1 policy 10
authentication pre-share
encryption aes-256
hash sha
group 5
lifetime 3600
!
tunnel-group 10.237.7.80 type ipsec-l2l
tunnel-group 10.237.7.80 ipsec-attributes
ikev1 pre-shared-key MyKey123
!
nat (inside,outside) source static local-network local-network destination static remote-network remote-network no-proxy-arp route-lookup
Khởi động dịch vụ strongswan-starter.service
và bật tự khởi động theo OS cho nó.
Đầu tiên bạn nên chạy lệnh ipsec stop
để stop IPSec trước.
ipsec stop
Tiếp theo mới khởi động dịch vụ Strongswan
.
systemctl restart strongswan-starter.service
systemctl enable strongswan-starter.service
Check status dịch vụ strongswan-starter.service
ở VPN Server 1 Site A.
shell> systemctl status strongswan-starter.service
● strongswan-starter.service - strongSwan IPsec IKEv1/IKEv2 daemon using ipsec.conf
Loaded: loaded (/lib/systemd/system/strongswan-starter.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2025-02-26 10:11:37 UTC; 5h 6min ago
Main PID: 4853 (starter)
Tasks: 18 (limit: 4558)
Memory: 4.8M
CPU: 2.026s
CGroup: /system.slice/strongswan-starter.service
├─4853 /usr/lib/ipsec/starter --daemon charon --nofork
└─4858 /usr/lib/ipsec/charon
Feb 26 15:16:08 node81 charon[4858]: 05[ENC] generating INFORMATIONAL response 46 [ ]
Feb 26 15:16:08 node81 charon[4858]: 05[NET] sending packet: from 10.237.7.80[4500] to 10.237.7.83[4500] (80 bytes)
Feb 26 15:16:41 node81 charon[4858]: 13[NET] received packet: from 10.237.7.83[4500] to 10.237.7.80[4500] (80 bytes)
Feb 26 15:16:41 node81 charon[4858]: 13[ENC] parsed INFORMATIONAL request 47 [ ]
Feb 26 15:16:41 node81 charon[4858]: 13[ENC] generating INFORMATIONAL response 47 [ ]
Feb 26 15:16:41 node81 charon[4858]: 13[NET] sending packet: from 10.237.7.80[4500] to 10.237.7.83[4500] (80 bytes)
Feb 26 15:17:14 node81 charon[4858]: 10[NET] received packet: from 10.237.7.83[4500] to 10.237.7.80[4500] (80 bytes)
Feb 26 15:17:14 node81 charon[4858]: 10[ENC] parsed INFORMATIONAL request 48 [ ]
Feb 26 15:17:14 node81 charon[4858]: 10[ENC] generating INFORMATIONAL response 48 [ ]
Feb 26 15:17:14 node81 charon[4858]: 10[NET] sending packet: from 10.237.7.80[4500] to 10.237.7.83[4500] (80 bytes)
Check status dịch vụ strongswan-starter.service
ở VPN Server 2 Site A.
root@node83:~# systemctl status strongswan-starter.service
● strongswan-starter.service - strongSwan IPsec IKEv1/IKEv2 daemon using ipsec.conf
Loaded: loaded (/lib/systemd/system/strongswan-starter.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2025-02-26 15:18:19 UTC; 4s ago
Main PID: 8805 (starter)
Tasks: 18 (limit: 4558)
Memory: 3.9M
CPU: 33ms
CGroup: /system.slice/strongswan-starter.service
├─8805 /usr/lib/ipsec/starter --daemon charon --nofork
└─8809 /usr/lib/ipsec/charon
Feb 26 15:18:19 node82 charon[8809]: 05[CFG] added configuration 'site-a-to-site-b'
Feb 26 15:18:19 node82 charon[8809]: 07[CFG] received stroke: initiate 'site-a-to-site-b'
Feb 26 15:18:19 node82 charon[8809]: 07[IKE] initiating IKE_SA site-a-to-site-b[1] to 10.237.7.83
Feb 26 15:18:19 node82 charon[8809]: 07[IKE] initiating IKE_SA site-a-to-site-b[1] to 10.237.7.83
Feb 26 15:18:19 node82 charon[8809]: 07[ENC] generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ]
Feb 26 15:18:19 node82 charon[8809]: 07[NET] sending packet: from 10.237.7.80[500] to 10.237.7.83[500] (1172 bytes)
Feb 26 15:18:19 node82 charon[8809]: 04[NET] error writing to socket: Network is unreachable
Feb 26 15:18:23 node82 charon[8809]: 11[IKE] retransmit 1 of request with message ID 0
Feb 26 15:18:23 node82 charon[8809]: 11[NET] sending packet: from 10.237.7.80[500] to 10.237.7.83[500] (1172 bytes)
Feb 26 15:18:23 node82 charon[8809]: 04[NET] error writing to socket: Network is unreachable
Check status dịch vụ strongswan-starter.service
ở Site B.
shell> systemctl status strongswan-starter.service
● strongswan-starter.service - strongSwan IPsec IKEv1/IKEv2 daemon using ipsec.conf
Loaded: loaded (/lib/systemd/system/strongswan-starter.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2025-02-26 10:11:41 UTC; 5h 7min ago
Main PID: 4132 (starter)
Tasks: 18 (limit: 9389)
Memory: 4.9M
CPU: 1.997s
CGroup: /system.slice/strongswan-starter.service
├─4132 /usr/lib/ipsec/starter --daemon charon --nofork
└─4137 /usr/lib/ipsec/charon
Feb 26 15:17:47 node83 charon[4137]: 16[IKE] sending DPD request
Feb 26 15:17:47 node83 charon[4137]: 16[ENC] generating INFORMATIONAL request 49 [ ]
Feb 26 15:17:47 node83 charon[4137]: 16[NET] sending packet: from 10.237.7.83[4500] to 10.237.7.80[4500] (80 bytes)
Feb 26 15:17:47 node83 charon[4137]: 06[NET] received packet: from 10.237.7.80[4500] to 10.237.7.83[4500] (80 bytes)
Feb 26 15:17:47 node83 charon[4137]: 06[ENC] parsed INFORMATIONAL response 49 [ ]
Feb 26 15:18:20 node83 charon[4137]: 16[IKE] sending DPD request
Feb 26 15:18:20 node83 charon[4137]: 16[ENC] generating INFORMATIONAL request 50 [ ]
Feb 26 15:18:20 node83 charon[4137]: 16[NET] sending packet: from 10.237.7.83[4500] to 10.237.7.80[4500] (80 bytes)
Feb 26 15:18:20 node83 charon[4137]: 06[NET] received packet: from 10.237.7.80[4500] to 10.237.7.83[4500] (80 bytes)
Feb 26 15:18:20 node83 charon[4137]: 06[ENC] parsed INFORMATIONAL response 50 [ ]
4. Khởi động dịch vụ IPsec.
Chạy lệnh ipsec start
trên cả 3 VPN Server.
ipsec start
5. Kiểm tra trạng thái StrongSwan IPsec.
Sử dụng lệnh ipsec status
để show status của tunnel VPN Server 1 – Site A
shell> ipsec status
Security Associations (1 up, 0 connecting):
site-a-to-site-b[8]: ESTABLISHED 36 minutes ago, 10.237.7.80[10.237.7.80]...10.237.7.83[10.237.7.83]
site-a-to-site-b{7}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: c886d912_i c29171b0_o
site-a-to-site-b{7}: 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24 === 10.12.1.0/24 10.12.2.0/24 10.12.3.0/24
Sử dụng lệnh ipsec status
để show status của tunnel VPN Server 2 – Site A kết quả sẽ trống vì server này đang chạy mode Backup, IPSec sẽ bị tắt.
shell> ipsec status
<no output>
Sử dụng lệnh ipsec status
để show status của tunnel Site B.
shell> ipsec status
Security Associations (1 up, 0 connecting):
site-b-to-site-a[7]: ESTABLISHED 36 minutes ago, 10.237.7.83[10.237.7.83]...10.237.7.80[10.237.7.80]
site-b-to-site-a{7}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: c29171b0_i c886d912_o
site-b-to-site-a{7}: 10.12.1.0/24 10.12.2.0/24 10.12.3.0/24 === 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24
Sử dụng lệnh ipsec statusall
để show status chi tiết hơn của tunnel Site A.
shell> ipsec statusall
Status of IKE charon daemon (strongSwan 5.9.5, Linux 5.15.0-106-generic, x86_64):
uptime: 5 hours, since Feb 26 10:11:38 2025
malloc: sbrk 3256320, mmap 0, used 1696560, free 1559760
worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 3
loaded plugins: charon aesni aes rc2 sha2 sha1 md5 mgf1 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem openssl fips-prf gmp agent xcbc hmac gcm drbg attr kernel-netlink resolve socket-default connmark forecast farp stroke updown eap-identity eap-aka eap-md5 eap-gtc eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap eap-tnc xauth-generic xauth-eap xauth-pam tnc-tnccs dhcp lookip error-notify certexpire led addrblock unity counters
Listening IP addresses:
10.237.7.81
10.237.7.80
10.11.1.81
10.11.1.254
Connections:
site-a-to-site-b: 10.237.7.80...10.237.7.83 IKEv2, dpddelay=30s
site-a-to-site-b: local: [10.237.7.80] uses pre-shared key authentication
site-a-to-site-b: remote: [10.237.7.83] uses pre-shared key authentication
site-a-to-site-b: child: 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24 === 10.12.1.0/24 10.12.2.0/24 10.12.3.0/24 TUNNEL, dpdaction=restart
Security Associations (1 up, 0 connecting):
site-a-to-site-b[8]: ESTABLISHED 36 minutes ago, 10.237.7.80[10.237.7.80]...10.237.7.83[10.237.7.83]
site-a-to-site-b[8]: IKEv2 SPIs: cf6cb7503603c311_i* 8706e2e9333dc4f3_r, pre-shared key reauthentication in 13 minutes
site-a-to-site-b[8]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
site-a-to-site-b{7}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: c886d912_i c29171b0_o
site-a-to-site-b{7}: AES_CBC_256/HMAC_SHA2_256_128, 22512 bytes_i (268 pkts, 9s ago), 22512 bytes_o (268 pkts, 9s ago), rekeying in 7 hours
site-a-to-site-b{7}: 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24 === 10.12.1.0/24 10.12.2.0/24 10.12.3.0/24
Tương tự lệnh ipsec statusall
để show status của tunnel VPN Server 2 – Site A kết quả vẫn sẽ trống vì server này đang chạy mode Backup, IPSec sẽ bị tắt.
shell> ipsec statusall
<no output>
Sử dụng lệnh ipsec statusall
để show status chi tiết hơn của tunnel Site B.
shell> ipsec statusall
Security Associations (1 up, 0 connecting):
site-b-to-site-a[7]: ESTABLISHED 36 minutes ago, 10.237.7.83[10.237.7.83]...10.237.7.80[10.237.7.80]
site-b-to-site-a{7}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: c29171b0_i c886d912_o
site-b-to-site-a{7}: 10.12.1.0/24 10.12.2.0/24 10.12.3.0/24 === 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24
root@node83:~# ipsec statusall
Status of IKE charon daemon (strongSwan 5.9.5, Linux 5.15.0-106-generic, x86_64):
uptime: 5 hours, since Feb 26 10:11:41 2025
malloc: sbrk 3366912, mmap 0, used 1697008, free 1669904
worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 3
loaded plugins: charon aesni aes rc2 sha2 sha1 md5 mgf1 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem openssl fips-prf gmp agent xcbc hmac gcm drbg attr kernel-netlink resolve socket-default connmark forecast farp stroke updown eap-identity eap-aka eap-md5 eap-gtc eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap eap-tnc xauth-generic xauth-eap xauth-pam tnc-tnccs dhcp lookip error-notify certexpire led addrblock unity counters
Listening IP addresses:
10.237.7.83
10.12.1.83
Connections:
site-b-to-site-a: 10.237.7.83...10.237.7.80 IKEv2, dpddelay=30s
site-b-to-site-a: local: [10.237.7.83] uses pre-shared key authentication
site-b-to-site-a: remote: [10.237.7.80] uses pre-shared key authentication
site-b-to-site-a: child: 10.12.1.0/24 10.12.2.0/24 10.12.3.0/24 === 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24 TUNNEL, dpdaction=restart
Security Associations (1 up, 0 connecting):
site-b-to-site-a[7]: ESTABLISHED 37 minutes ago, 10.237.7.83[10.237.7.83]...10.237.7.80[10.237.7.80]
site-b-to-site-a[7]: IKEv2 SPIs: cf6cb7503603c311_i 8706e2e9333dc4f3_r*, pre-shared key reauthentication in 7 minutes
site-b-to-site-a[7]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
site-b-to-site-a{7}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: c29171b0_i c886d912_o
site-b-to-site-a{7}: AES_CBC_256/HMAC_SHA2_256_128, 22512 bytes_i (268 pkts, 26s ago), 22512 bytes_o (268 pkts, 26s ago), rekeying in 7 hours
site-b-to-site-a{7}: 10.12.1.0/24 10.12.2.0/24 10.12.3.0/24 === 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24
6. Kiểm tra kết nối.
Sử dụng các lệnh `traceroute` và `ping` để kiểm tra kết nối giữa các server nội bộ của hai site.
Kết quả ICMP từ Client Site A đến 10.12.1.78của Client Site B.
shell> ping -c 2 10.12.1.78
PING 10.12.1.78 (10.12.1.78) 56(84) bytes of data.
64 bytes from 10.12.1.78: icmp_seq=1 ttl=62 time=0.424 ms
64 bytes from 10.12.1.78: icmp_seq=2 ttl=62 time=0.412 ms
--- 10.12.1.78 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1012ms
rtt min/avg/max/mdev = 0.412/0.418/0.424/0.006 ms
Kết quả traceroute từ Client Site A đến 10.12.1.78 của Client Site B.
shell> traceroute 10.12.1.78
traceroute to 10.12.1.78 (10.12.1.78), 30 hops max, 60 byte packets
1 10.11.1.81 (10.11.1.81) 0.108 ms 0.083 ms 0.063 ms
2 10.12.1.83 (10.12.1.83) 0.392 ms 0.404 ms 0.365 ms
3 10.12.1.78 (10.12.1.78) 0.552 ms 0.594 ms 0.591 ms
Kết quả ICMP từ Client Site B đến 10.11.1.77 của Client Site A.
shell> ping -c 2 10.11.1.77
PING 10.11.1.77 (10.11.1.77) 56(84) bytes of data.
64 bytes from 10.11.1.77: icmp_seq=1 ttl=62 time=0.460 ms
64 bytes from 10.11.1.77: icmp_seq=2 ttl=62 time=0.419 ms
--- 10.11.1.77 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1031ms
rtt min/avg/max/mdev = 0.419/0.439/0.460/0.020 ms
Kết quả traceroute từ Client Site B đến 10.11.1.77 của Client Site A.
shell> traceroute 10.11.1.77
traceroute to 10.11.1.77 (10.11.1.77), 30 hops max, 60 byte packets
1 10.12.1.83 (10.12.1.83) 0.104 ms 0.087 ms 0.075 ms
2 10.11.1.81 (10.11.1.81) 0.348 ms 0.443 ms 0.452 ms
3 10.11.1.77 (10.11.1.77) 0.468 ms 0.471 ms 0.442 ms
6. Lưu ý
- Không sử dụng subnet riêng cho tunnel: Traffic giữa các subnet nội bộ của hai site sẽ được mã hóa bởi IPsec VPN Tunnel mà không cần một subnet riêng cho tunnel.
- Sử dụng subnet riêng cho tunnel: Bạn có thể định nghĩa một subnet riêng cho tunnel nếu muốn tách biệt rõ ràng traffic VPN khỏi traffic nội bộ.
Tham khảo https://satishdotpatel.github.io/ha-strongswan-ipsec-vpn/