1. Tổng quan.
StrongSwan hỗ trợ việc sử dụng một địa chỉ IP WAN để kết nối đến nhiều site khác nhau bằng IPsec, miễn là bạn cấu hình đúng. Điều này thường được triển khai bằng cách sử dụng một trong các phương pháp sau:
1️⃣ Sử dụng nhiều kết nối (conn) trong ipsec.conf
Bạn có thể thiết lập nhiều kết nối VPN trên cùng một địa chỉ IP WAN bằng cách khai báo nhiều conn
trong ipsec.conf
.
🔹 Ví dụ:
Giả sử bạn có một site trung tâm (Hub) tại 10.237.7.81 kết nối đến Site B (10.237.7.82) và Site C (10.237.7.83).
# Cấu hình chung
config setup
charondebug="ike 2, knl 2, cfg 2, net 2, esp 2, dmn 2, mgr 2"
uniqueids=yes
strictcrlpolicy=no
# Kết nối đến Site B
conn siteA-to-siteB
authby=secret
left=10.237.7.81
leftid=vpn.sitea.com
leftsubnet=192.168.1.0/24,192.168.2.0/24
right=10.237.7.82
rightid=vpn.siteb.com
rightsubnet=192.168.3.0/24,192.168.4.0/24
ike=aes256-sha2_256-modp2048
esp=aes256-sha2_256
keyexchange=ikev2
dpdaction=restart
auto=start
# Kết nối đến Site C
conn siteA-to-siteC
authby=secret
left=10.237.7.81
leftid=vpn.sitea.com
leftsubnet=192.168.1.0/24,192.168.2.0/24
right=10.237.7.83
rightid=vpn.sitec.com
rightsubnet=192.168.5.0/24,192.168.6.0/24
ike=aes256-sha2_256-modp2048
esp=aes256-sha2_256
keyexchange=ikev2
dpdaction=restart
auto=start
📌 Điều quan trọng là mỗi kết nối (conn
) phải có một rightid
và rightsubnet
duy nhất để tránh xung đột.
2️⃣ Sử dụng VPN Hub-and-Spoke (Mô hình trung tâm và các nhánh)
Nếu Site A đóng vai trò là trung tâm (Hub) và nhiều site khác kết nối đến nó, bạn có thể sử dụng tunnel mode với dynamic routing (BGP, OSPF, hoặc static routes) để chuyển tiếp traffic giữa các site.
✅ Lợi ích của mô hình này:
- Không cần tạo nhiều
conn
riêng lẻ mà có thể sử dụng một kết nối động. - Cho phép các site B và C liên lạc trực tiếp thông qua site A.
- Tối ưu hóa khi mở rộng nhiều site.
3️⃣ Sử dụng XFRM Interfaces (Virtual IPsec Interfaces)
Nếu bạn có nhiều site và muốn dễ dàng định tuyến, XFRM interfaces (IPsec virtual interfaces) sẽ giúp bạn quản lý nhiều kết nối tốt hơn thay vì cấu hình từng conn
riêng lẻ.
2. Sơ đồ đấu nối.
Mình sẽ sử dụng sơ đồ đấu nối cũ và vẽ thêm Site C nhé.

3. Hướng dẫn config.
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
Config network cho VPN Server Site C.
cat > /etc/netplan/00-installer-config.yaml << 'OEF'
network:
version: 2
ethernets:
ens160:
addresses:
- 10.237.7.76/24
ens192: {}
vlans:
vlan101:
id: 101
link: ens192
addresses:
- 10.13.1.76/24
OEF
Phân quyền 600 cho file config Netpla /etc/netplan/00-installer-config.yaml
.
chmod 600 /etc/netplan/00-installer-config.yaml
Áp dụng config mới.
netplan apply
Cài đặt daemon StrongSwan IPSec trên hệ thống.
apt-get update
apt-get install strongswan libcharon-extra-plugins strongswan-pki -y
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, nội dung ở dưới chỉ thêm 10.237.7.80 10.237.7.76 : PSK "MyKey123"
vì 10.237.7.80 10.237.7.83 : PSK "MyKey123"
đã được thêm ở bài trước.
cat > /etc/ipsec.secrets << 'OEF'
10.237.7.80 10.237.7.83 : PSK "MyKey123"
10.237.7.80 10.237.7.76 : PSK "MyKey123"
OEF
Config cho VPN Server – Site C
cat > /etc/ipsec.secrets << 'OEF'
10.237.7.76 10.237.7.80 : PSK "MyKey123"
OEF
Config IPSec VPN.
Backup file /etc/ipsec.conf cho cả VPN Server ở các Site liên quan.
mv /etc/ipsec.conf /etc/ipsec.conf.bak
Tạo file config 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
conn site-a-to-site-c
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.76
rightsubnet=10.13.1.0/24,10.13.2.0/24,10.13.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 C.
cat > /etc/ipsec.conf << 'OEF'
config setup
charondebug="all"
uniqueids=yes
strictcrlpolicy=no
conn site-c-to-site-a
authby=secret
left=10.237.7.76
leftid=10.237.7.76
leftsubnet=10.13.1.0/24,10.13.2.0/24,10.13.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
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 đang là MASTER ở Site A đảm bảo chúng đều phải active.
systemctl status strongswan-starter.service
Ví dụ output dịch vụ strongswan-starter
đang có trạng thái active
ở Site C.
shell> systemctl status strongswan-starter
Loaded: loaded (/lib/systemd/system/strongswan-starter.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2025-02-27 03:16:28 UTC; 4s ago
Main PID: 3767 (starter)
Tasks: 18 (limit: 9389)
Memory: 4.1M
CPU: 41ms
CGroup: /system.slice/strongswan-starter.service
├─3767 /usr/lib/ipsec/starter --daemon charon --nofork
└─3772 /usr/lib/ipsec/charon
Feb 27 03:16:28 node76 charon[3772]: 09[ENC] parsed IKE_AUTH response 1 [ IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(ADD_4_ADDR) N(ADD_4_ADDR) N(ADD_4_ADDR) ]
Feb 27 03:16:28 node76 charon[3772]: 09[IKE] authentication of '10.237.7.80' with pre-shared key successful
Feb 27 03:16:28 node76 charon[3772]: 09[IKE] IKE_SA site-c-to-site-a[1] established between 10.237.7.76[10.237.7.76]...10.237.7.80[10.237.7.80]
Feb 27 03:16:28 node76 charon[3772]: 09[IKE] IKE_SA site-c-to-site-a[1] established between 10.237.7.76[10.237.7.76]...10.237.7.80[10.237.7.80]
Feb 27 03:16:28 node76 charon[3772]: 09[IKE] scheduling reauthentication in 2747s
Feb 27 03:16:28 node76 charon[3772]: 09[IKE] maximum IKE_SA lifetime 3287s
Feb 27 03:16:28 node76 charon[3772]: 09[CFG] selected proposal: ESP:AES_CBC_256/HMAC_SHA2_256_128/NO_EXT_SEQ
Feb 27 03:16:28 node76 charon[3772]: 09[IKE] CHILD_SA site-c-to-site-a{1} established with SPIs c9c37b85_i ced5a46c_o and TS 10.13.1.0/24 10.13.2.0/24 10.13.3.0/24 === 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24
Feb 27 03:16:28 node76 charon[3772]: 09[IKE] CHILD_SA site-c-to-site-a{1} established with SPIs c9c37b85_i ced5a46c_o and TS 10.13.1.0/24 10.13.2.0/24 10.13.3.0/24 === 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24
Feb 27 03:16:28 node76 charon[3772]: 09[IKE] peer supports MOBIKE
Sử dụng lệnh ipsec statusall
để show status chi tiết hơn của tunnel Site A (show trên server Master).
shell> ipsec statusall
Status of IKE charon daemon (strongSwan 5.9.5, Linux 5.15.0-106-generic, x86_64):
uptime: 81 seconds, since Feb 27 03:16:09 2025
malloc: sbrk 3231744, mmap 0, used 1572656, free 1659088
worker threads: 10 of 16 idle, 6/0/0/0 working, job queue: 0/0/0/0, scheduled: 8
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
site-a-to-site-c: 10.237.7.80...10.237.7.76 IKEv2, dpddelay=30s
site-a-to-site-c: local: [10.237.7.80] uses pre-shared key authentication
site-a-to-site-c: remote: [10.237.7.76] uses pre-shared key authentication
site-a-to-site-c: child: 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24 === 10.13.1.0/24 10.13.2.0/24 10.13.3.0/24 TUNNEL, dpdaction=restart
Security Associations (2 up, 0 connecting):
site-a-to-site-c[2]: ESTABLISHED 57 seconds ago, 10.237.7.80[10.237.7.80]...10.237.7.76[10.237.7.76]
site-a-to-site-c[2]: IKEv2 SPIs: 3ab118f328052ce8_i* aa8faab4deeadc56_r, pre-shared key reauthentication in 49 minutes
site-a-to-site-c[2]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
site-a-to-site-c{3}: INSTALLED, TUNNEL, reqid 2, ESP SPIs: c549be60_i cd9a5626_o
site-a-to-site-c{3}: AES_CBC_256/HMAC_SHA2_256_128, 0 bytes_i, 0 bytes_o, rekeying in 7 hours
site-a-to-site-c{3}: 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24 === 10.13.1.0/24 10.13.2.0/24 10.13.3.0/24
site-a-to-site-b[1]: ESTABLISHED 81 seconds ago, 10.237.7.80[10.237.7.80]...10.237.7.83[10.237.7.83]
site-a-to-site-b[1]: IKEv2 SPIs: 2ce4b1fdd18fbed9_i* 86e2b395836aa822_r, pre-shared key reauthentication in 43 minutes
site-a-to-site-b[1]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
site-a-to-site-b{1}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: cbd459fe_i c112cd39_o
site-a-to-site-b{1}: AES_CBC_256/HMAC_SHA2_256_128, 13944 bytes_i (166 pkts, 1s ago), 13944 bytes_o (166 pkts, 1s ago), rekeying in 7 hours
site-a-to-site-b{1}: 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
Lệnh ipsec status
sẽ giúp bạn xem ngắn gọn hơn, dưới đây là kết quả tại VPN Server Master tại Site A.
shell> ipsec status
Security Associations (2 up, 0 connecting):
site-a-to-site-c[2]: ESTABLISHED 73 seconds ago, 10.237.7.80[10.237.7.80]...10.237.7.76[10.237.7.76]
site-a-to-site-c{3}: INSTALLED, TUNNEL, reqid 2, ESP SPIs: c549be60_i cd9a5626_o
site-a-to-site-c{3}: 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24 === 10.13.1.0/24 10.13.2.0/24 10.13.3.0/24
site-a-to-site-b[1]: ESTABLISHED 97 seconds ago, 10.237.7.80[10.237.7.80]...10.237.7.83[10.237.7.83]
site-a-to-site-b{1}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: cbd459fe_i c112cd39_o
site-a-to-site-b{1}: 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 statusall
để show status chi tiết hơn của tunnel Site C.
shell> ipsec statusall
Status of IKE charon daemon (strongSwan 5.9.5, Linux 5.15.0-106-generic, x86_64):
uptime: 2 minutes, since Feb 27 03:16:27 2025
malloc: sbrk 3387392, mmap 0, used 1463824, free 1923568
worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 5
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.76
10.13.1.83
Connections:
site-c-to-site-a: 10.237.7.76...10.237.7.80 IKEv2, dpddelay=30s
site-c-to-site-a: local: [10.237.7.76] uses pre-shared key authentication
site-c-to-site-a: remote: [10.237.7.80] uses pre-shared key authentication
site-c-to-site-a: child: 10.13.1.0/24 10.13.2.0/24 10.13.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-c-to-site-a[2]: ESTABLISHED 2 minutes ago, 10.237.7.76[10.237.7.76]...10.237.7.80[10.237.7.80]
site-c-to-site-a[2]: IKEv2 SPIs: 3ab118f328052ce8_i aa8faab4deeadc56_r*, pre-shared key reauthentication in 41 minutes
site-c-to-site-a[2]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
site-c-to-site-a{2}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: cd9a5626_i c549be60_o
site-c-to-site-a{2}: AES_CBC_256/HMAC_SHA2_256_128, 0 bytes_i, 0 bytes_o, rekeying in 7 hours
site-c-to-site-a{2}: 10.13.1.0/24 10.13.2.0/24 10.13.3.0/24 === 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24
Tương tự lệnh ipsec status
sẽ giúp bạn xem ngắn gọn hơn, dưới đây là kết quả tại VPN Serve tại Site C.
shell> ipsec status
Security Associations (1 up, 0 connecting):
site-c-to-site-a[2]: ESTABLISHED 2 minutes ago, 10.237.7.76[10.237.7.76]...10.237.7.80[10.237.7.80]
site-c-to-site-a{2}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: cd9a5626_i c549be60_o
site-c-to-site-a{2}: 10.13.1.0/24 10.13.2.0/24 10.13.3.0/24 === 10.11.1.0/24 10.11.2.0/24 10.11.3.0/24
Để kiểm tra kết quả, bạn phải trỏ thêm 1 route trên Client Site A để học subnet 172.16.101.0/24 thông qua tunnel Site A – Site C.
ip route add 10.13.1.0/24 via 10.11.1.254
ip route add 10.13.2.0/24 via 10.11.1.254
ip route add 10.13.3.0/24 via 10.11.1.254
Kết quả bảng routing table của Client Site A.
shell> route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.237.7.1 0.0.0.0 UG 0 0 0 ens160
10.11.1.0 0.0.0.0 255.255.255.0 U 0 0 0 vlan101
10.12.1.0 10.11.1.254 255.255.255.0 UG 0 0 0 vlan101
10.12.2.0 10.11.1.254 255.255.255.0 UG 0 0 0 vlan101
10.12.3.0 10.11.1.254 255.255.255.0 UG 0 0 0 vlan101
10.13.1.0 10.11.1.254 255.255.255.0 UG 0 0 0 vlan101
10.13.2.0 10.11.1.254 255.255.255.0 UG 0 0 0 vlan101
10.13.3.0 10.11.1.254 255.255.255.0 UG 0 0 0 vlan101
10.237.7.0 0.0.0.0 255.255.255.0 U 0 0 0 ens160
Từ Client Site A ping về IP 172.16.101.76 nằm ở phía trong LAN của Site C, kết quả thành công.
shell> ping -c 2 10.13.1.76
PING 10.13.1.76 (10.13.1.76) 56(84) bytes of data.
64 bytes from 10.13.1.76: icmp_seq=1 ttl=63 time=0.321 ms
64 bytes from 10.13.1.76: icmp_seq=2 ttl=63 time=0.319 ms
--- 10.13.1.76 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1026ms
rtt min/avg/max/mdev = 0.319/0.320/0.321/0.001 ms
Và đây là kết quả traceroute từ Client Site A .
shell> traceroute 10.13.1.76
traceroute to 10.13.1.76 (10.13.1.76), 30 hops max, 60 byte packets
1 10.11.1.81 (10.11.1.81) 0.112 ms 0.090 ms 0.098 ms
2 10.13.1.76 (10.13.1.76) 0.390 ms 0.401 ms 0.375 ms
4. Kết luận.
✔ Có thể dùng một IP WAN để kết nối nhiều site với IPsec StrongSwan.
✔ Phương pháp đơn giản nhất là khai báo nhiều conn
trong ipsec.conf
.
✔ Nếu có nhiều site và cần mở rộng, nên dùng mô hình Hub-and-Spoke hoặc XFRM Interfaces.