Friday, February 28, 2025

[strongSwan] High Availability IPsec VPN

-

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/

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories