12 minute read

IPsec S2S VPN giữa pfSense và Check Point là bài toán phổ biến khi 2 site dùng thiết bị khác vendor. Lab này dựng thêm một lớp redundancy bằng CARP HA: 2 pfSense node, mỗi node tạo 1 IPsec tunnel riêng về Check Point gateway — tổng cộng 2 tunnel song song, đảm bảo kết nối không bị gián đoạn khi 1 node gặp sự cố. Trên đường tunnel này, mình triển khai Zabbix 7.0 LTS bằng Docker Compose để monitor Ubuntu VM phía Check Point qua SNMPv2c.

Component Version
Check Point R81.20 (Gaia)
pfSense 2.8.1 CE
Zabbix 7.0 LTS
Ubuntu 24.04 LTS

1. Mô hình lab

Mình chia lab thành 2 site:

Site A — pfSense + Zabbix (VLAN 201):

Node WAN (VLAN 200) LAN Vai trò
pfsense-1 10.10.200.11 10.10.201.254/24 CARP Master
pfsense-2 10.10.200.12 10.10.201.253/24 CARP Backup
10.10.201.50 CARP LAN VIP
zabbix-201-11 10.10.201.11/24 Zabbix 7.0 (Docker)

Site B — Check Point (VLAN 202):

Node WAN (VLAN 200) LAN Vai trò
checkpoint 10.10.200.21 10.10.202.254/24 Gateway R81.20
ubuntu-202-11 10.10.202.11/24 Target SNMP

2 IPsec tunnel bảo vệ traffic giữa 10.10.201.0/2410.10.202.0/24. Zabbix tại 10.10.201.11 kết nối SNMP tới 10.10.202.11 qua tunnel này.

2. Chuẩn bị Objects trên SmartConsole

Mình cấu hình phía Check Point trước — tạo các object đại diện cho 2 pfSense node của Site A.

Tạo Interoperable Device cho pfSense-1: Vào Objects → New → Gateways and Servers → Interoperable Device…:

Điền thông tin pfsense-1 và click OK:

Field Value
Name pfsense-1
IPv4 Address 10.10.200.11

Tương tự tạo pfsense-2 với IP 10.10.200.12.

Tạo Network object cho LAN Site A: Vào Objects → New → Network…:

Field Value
Name net-monitoring-lan
Network address 10.10.201.0
Net mask 255.255.255.0

Tạo Network object cho LAN Site B:

Field Value
Name net-customer-lan
Network address 10.10.202.0
Net mask 255.255.255.0

3. Cấu hình VPN Domain

Mình khai báo VPN Domain cho từng object để Check Point biết subnet nào nằm sau mỗi peer.

Gateway Check Point — double-click gateway → Network ManagementVPN Domain:

  • Chọn User defined → chọn net-customer-lan

Object pfsense-1 — double-click → IPSec VPNVPN Domain:

  • Chọn User defined → chọn net-monitoring-lan

Object pfsense-2 — tương tự, chọn net-monitoring-lan (cùng subnet vì CARP pair).

4. Tạo Star VPN Community

Mình tạo Star Community với Check Point làm center, 2 pfSense là satellite.

Vào menu New… → More → VPN Community → Star Community…, đặt tên VPN-Monitoring.

Tab Gateways:

  • Center Gateways: thêm gateway Checkpoint
  • Satellite Gateways: thêm pfsense-1pfsense-2

Failover giữa 2 tunnel hoạt động tự nhiên: pfsense-1 và pfsense-2 cùng là satellite với VPN domain net-monitoring-lan. Check Point duy trì Permanent Tunnel đến cả 2 — khi tunnel pfsense-1 down, traffic tự động chuyển qua pfsense-2 mà không cần cấu hình thêm.

Tab Encryption — chọn Custom encryption suite, IKEv2 only:

IKE Security Association (Phase 1):

Parameter Value
Encryption Algorithm AES-256
Data Integrity SHA256
Diffie-Hellman Group Group 14 (2048 bit)

IKE Security Association (Phase 2):

Parameter Value
Encryption Algorithm AES-256
Data Integrity SHA256
Use Perfect Forward Secrecy
Diffie-Hellman Group Group 14 (2048 bit)

Tab Tunnel Management:

  • Set Permanent Tunnels: ✓ → chọn On specific tunnels in the community → click Select Gateways… chọn pfsense-1pfsense-2
  • Tunnel down track: Log
  • VPN Tunnel Sharing: One VPN tunnel per subnet pair

Tab Shared Secret:

Peer Name Shared Secret
pfsense-1 Zxc123!@#
pfsense-2 Zxc123!@#

Password trong bài dùng Zxc123!@# — đổi lại trong môi trường thực tế.

Click OK để lưu community.

5. Security Policy

Mình thêm rule cho phép traffic 2 chiều qua VPN. Vào Security Policies → Policy → Add Rule:

No. Name Source Destination VPN Services & Applications Action Track
2 SiteA-to-SiteB net-monitoring-lan net-customer-lan VPN-Monitoring Any Accept Log
3 SiteB-to-SiteA net-customer-lan net-monitoring-lan VPN-Monitoring Any Accept Log

PublishInstall Policy lên gateway Check Point.

6. Cấu hình pfSense-1

Mình cấu hình IPsec tunnel trên pfSense-1 kết nối về Check Point.

Phase 1

Vào VPN → IPsec → Tunnels → Add P1:

Parameter Value
Description VPN-To-Checkpoint
Key Exchange version IKEv2
Internet Protocol IPv4
Interface WAN
Remote Gateway 10.10.200.21
Authentication Method Mutual PSK
My Identifier My IP address
Peer Identifier Peer IP address
Pre-Shared Key Zxc123!@#
Encryption Algorithm AES
Key length 256 bits
Hash SHA256
DH Group 14 (2048 bit)
Life Time 86400
NAT Traversal Auto
Dead Peer Detection ✓ Enable DPD
Delay 10
Max failures 5

Phase 2

Click Show Phase 2 Entries → Add P2:

Parameter Value
Description VPN-To-Checkpoint-P2
Mode Tunnel IPv4
Local Network LAN subnet
NAT/BINAT translation None
Remote Network Network — 10.10.202.0/24
Protocol ESP
Encryption Algorithms ✓ AES 256 bits
Hash Algorithms ✓ SHA256
PFS key group 14 (2048 bit)
Life Time 3600
Automatically ping host (trống)
Keep Alive ✓ Enable periodic keep alive check

Save → Apply Changes.

Firewall Rules

Vào Firewall → Rules → IPsec → Add:

Field Value
Action Pass
Interface IPsec
Address Family IPv4
Protocol Any
Source Network — 10.10.202.0/24
Destination Network — 10.10.201.0/24
Description Allow Site-B inbound

Save → Apply Changes.

Kiểm tra trạng thái tunnel

Vào Status → IPsec → Overview để xác nhận tunnel pfSense-1 lên thành công. Phase 1 hiện Established và Phase 2 hiện Installed là đã kết nối xong.

7. Cấu hình pfSense-2

pfSense-2 cấu hình hoàn toàn tương tự pfSense-1. WAN interface khác (10.10.200.12) nên Check Point nhận diện đây là tunnel riêng biệt.

Phase 1 — giống pfSense-1, Remote Gateway vẫn là 10.10.200.21, Pre-Shared Key Zxc123!@#.

Phase 2 — giống pfSense-1: Local 10.10.201.0/24, Remote 10.10.202.0/24.

Firewall Rules → IPsec — thêm rule giống pfSense-1.

Kiểm tra 2 tunnel trên Check Point

Mở Check Point SmartView MonitorTunnels → Tunnels on Gateway → Checkpoint. Cả 2 tunnel về pfsense-1 (10.10.200.11) và pfsense-2 (10.10.200.12) đều hiển thị State: Up là thành công.

8. Cấu hình CARP VIP LAN trên pfSense

Mình tạo CARP VIP 10.10.201.50 trên LAN interface của cả 2 pfSense để Zabbix dùng làm default gateway — khi pfSense-1 down, VIP tự động chuyển sang pfSense-2 mà không cần đổi cấu hình gì trên Zabbix.

Trên pfSense-1 — vào Firewall → Virtual IPs → Add:

Field Value
Type CARP
Interface LAN
IP Address 10.10.201.50 / 24
Virtual IP Password Zxc123!@#
VHID Group 1
Advertising Frequency Base: 1 / Skew: 0
Description CARP-LAN-VIP

Save → Apply Changes.

Trên pfSense-2 — cấu hình giống hệt pfSense-1, chỉ khác Skew: 100 để pfSense-2 là backup.

Sau khi apply trên cả 2 node, vào Status → Dashboard → widget CARP Status để xác nhận:

  • pfSense-1: 10.10.201.50MASTER
  • pfSense-2: 10.10.201.50BACKUP

Trên VM zabbix-201-11, đặt default gateway là 10.10.201.50:

# Kiểm tra gateway hiện tại
ip route show default

# Đổi gateway qua netplan (Ubuntu 24.04)
sed -i 's/via: .*/via: 10.10.201.50/' /etc/netplan/50-cloud-init.yaml
netplan apply

# Xác nhận sau khi apply
ip route show default

9. Triển khai Zabbix 7.0 LTS bằng Docker Compose

Mình cài Docker và dựng Zabbix trên zabbix-201-11 (10.10.201.11).

Cài Docker

apt update && apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
  > /etc/apt/sources.list.d/docker.list
apt update && apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Docker Compose file

mkdir -p /opt/zabbix && cat > /opt/zabbix/docker-compose.yml << 'EOF'
services:
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: zabbix
      POSTGRES_USER: zabbix
      POSTGRES_PASSWORD: Zxc123!@#
    volumes:
      - postgres_data:/var/lib/postgresql/data

  zabbix-server:
    image: zabbix/zabbix-server-pgsql:ubuntu-7.0-latest
    restart: unless-stopped
    ports:
      - "10051:10051"
    environment:
      DB_SERVER_HOST: postgres
      POSTGRES_DB: zabbix
      POSTGRES_USER: zabbix
      POSTGRES_PASSWORD: Zxc123!@#
    depends_on:
      - postgres

  zabbix-web:
    image: zabbix/zabbix-web-nginx-pgsql:ubuntu-7.0-latest
    restart: unless-stopped
    ports:
      - "80:8080"
    environment:
      DB_SERVER_HOST: postgres
      POSTGRES_DB: zabbix
      POSTGRES_USER: zabbix
      POSTGRES_PASSWORD: Zxc123!@#
      ZBX_SERVER_HOST: zabbix-server
      PHP_TZ: Asia/Ho_Chi_Minh
    depends_on:
      - zabbix-server
      - postgres

volumes:
  postgres_data:
EOF

Khởi động

cd /opt/zabbix
docker compose up -d
docker compose ps

Truy cập Zabbix web tại http://10.10.201.11 — login mặc định Admin / zabbix.

Truy cập Zabbix từ ngoài qua pfSense Port Forward

Nếu không truy cập được trực tiếp vào VLAN 201, mình cấu hình NAT Port Forward trên pfSense-1 để forward http://10.10.200.11:8080 vào 10.10.201.11:80.

Vào Firewall → NAT → Port Forward → Add:

Field Value
Interface WAN
Address Family IPv4
Protocol TCP ← phải chọn TCP để hiện port fields
Destination / Type WAN address
Destination port range 8080 → 8080
Redirect target IP / Type Address or Alias
Redirect target IP / Address 10.10.201.11
Redirect target port 80
Description Zabbix-Web-Forward
Filter rule association Add associated filter rule

Save → Apply Changes.

Truy cập Zabbix tại http://10.10.200.11:8080.

10. Cấu hình SNMP trên ubuntu-202-11

Mình cài và cấu hình snmpd trên ubuntu-202-11 (10.10.202.11) để Zabbix poll SNMP qua tunnel.

apt update && apt install -y snmpd snmp

Mình ghi đè config mặc định để cho phép Zabbix đọc qua community string:

cat > /etc/snmp/snmpd.conf << 'EOF'
agentaddress udp:161
rocommunity public 127.0.0.1
rocommunity public 10.10.201.0/24
sysLocation "Customer Site"
sysContact admin@customer.local
EOF

Ubuntu mặc định disable MIB names trong /etc/snmp/snmp.conf — bỏ comment dòng đó để snmpwalk dùng được tên OID:

apt install -y snmp-mibs-downloader
download-mibs

sed -i 's/^mibs :/# mibs :/' /etc/snmp/snmp.conf
systemctl enable snmpd && systemctl restart snmpd

Kiểm tra SNMP từ chính máy:

snmpwalk -v2c -c public 127.0.0.1 system

11. Verify VPN tunnel

Trước khi thêm host vào Zabbix, mình xác nhận tunnel đã up.

Ping test từ zabbix-201-11:

ping -c 4 10.10.202.11

SNMP test qua tunnel:

# Hostname
snmpget -v2c -c public 10.10.202.11 SNMPv2-MIB::sysName.0

# Danh sách IP interfaces
snmpwalk -v2c -c public 10.10.202.11 1.3.6.1.2.1.4.20

Nhận được sysName và danh sách IP interface trả về là tunnel hoạt động và SNMP reachable qua đường VPN.

12. Thêm host vào Zabbix và kiểm tra monitoring

Mình vào Zabbix web (http://10.10.201.11) → Configuration → Hosts → Create host.

Tab Host:

Field Value
Host name ubuntu-202-11
Visible name Ubuntu Site B
Groups Linux servers

Tab Interfaces — Add → SNMP:

Field Value
IP address 10.10.202.11
Port 161
SNMP version SNMPv2
SNMP community public

Tab Templates:

  • Thêm template Linux by SNMP

Click Add để lưu host.

Sau 1–2 phút, mình vào Monitoring → Latest data → filter host ubuntu-202-11. Các item như CPU utilization, memory, network interfaces sẽ bắt đầu có data.

Bật SNMP trên Check Point Gaia

Mình vào Gaia Portal (https://10.10.200.21) → System Management → SNMP.

SNMP General Settings — tick Enable SNMP Agent, Version giữ nguyên v1 / v2 / v3 (any), click Apply.

Agent Interfaces — giữ tất cả interface được chọn (eth0, eth1, lo).

V1 / V2 Settings — điền public vào Read Only Community String, click Apply.

Bật SNMP trên pfSense

Thực hiện trên cả 2 node pfSense-1 và pfSense-2. Vào Services → SNMP:

SNMP Daemon — tick Enable the SNMP Daemon and its controls.

SNMP Daemon Settings:

Field Value
Polling Port 161
Read Community String public

SNMP Modules — giữ nguyên mặc định (MibII, Netgraph, PF, Host Resources, UCD, Regex đều được chọn).

Interface Binding:

Field Value
Internet Protocol IPv4
Bind Interfaces LAN

Click Save.

Thêm Check Point và pfSense vào Zabbix

Mình dùng toàn bộ LAN IP để tránh phụ thuộc vào WAN routing: pfSense-1/2 reach trực tiếp qua LAN 201, Check Point reach qua IPsec tunnel (LAN 202). Thêm lần lượt 3 host vào Configuration → Hosts → Create host.

Host: checkpoint — dùng IP LAN 10.10.202.254 (qua IPsec tunnel):

Tab Field Value
Host Host name checkpoint
Host Groups Applications
Interfaces IP address 10.10.202.254
Interfaces Port 161
Interfaces SNMP version SNMPv2
Interfaces SNMP community public
Templates Check Point Next Generation Firewall by SNMP

Host: pfsense-1 — dùng IP LAN 10.10.201.254:

Tab Field Value
Host Host name pfsense-1
Host Groups Applications
Interfaces IP address 10.10.201.254
Interfaces Port 161
Interfaces SNMP version SNMPv2
Interfaces SNMP community public
Templates PFSense by SNMP

Host: pfsense-2 — tương tự pfsense-1, IP 10.10.201.253.

Click Add cho từng host. Sau 1–2 phút, mình vào Monitoring → Latest data → filter từng host để xác nhận data đang về.

13. Test Failover: Node pfSense-1 down

Thiết kế này failover theo cấp node: CARP VIP gắn với pfSense node đang sống, không tự chuyển khi chỉ tunnel drop mà node vẫn chạy. Nếu chỉ tắt tunnel trên pfSense-1 (node vẫn up), VIP 10.10.201.50 giữ nguyên ở pfSense-1 — zabbix-201-11 vẫn route qua pfSense-1, không có tunnel nên ping/SNMP sẽ fail. Kịch bản failover thực tế là pfSense-1 down hoàn toàn: VIP và tunnel cùng chuyển sang pfSense-2.

Chuẩn bị: xác nhận baseline

Mình xác nhận trạng thái ban đầu trước khi test:

# Từ zabbix-201-11 — xác nhận SNMP hoạt động trước khi test
snmpget -v2c -c public 10.10.202.11 SNMPv2-MIB::sysName.0
ping -c 4 10.10.202.11

Test — Tắt pfSense-1 hoàn toàn

Kịch bản: pfSense-1 shutdown → CARP VIP chuyển sang pfSense-2 đồng thời Tunnel-1 drop → zabbix-201-11 tự động đi qua pfSense-2 và Tunnel-2 — Zabbix không mất data.

  1. Tắt pfSense-1 VM hoàn toàn.

  2. CARP failover — trên pfSense-2Status → Dashboard → widget CARP Status: sau ~5 giây, entry 10.10.201.50 chuyển từ BACKUP sang MASTER.

  1. Tunnel failover — trên Check Point SmartView Monitor → Tunnel-2 (10.10.200.12) vẫn Up.

  1. Kiểm tra SNMP vẫn hoạt động — zabbix-201-11 lúc này đi qua VIP 10.10.201.50 (pfSense-2 MASTER) → Tunnel-2 → ubuntu-202-11:
# Từ zabbix-201-11
ping -c 4 10.10.202.11
snmpget -v2c -c public 10.10.202.11 SNMPv2-MIB::sysName.0
  1. Trên ZabbixMonitoring → Hosts: host ubuntu-202-11 vẫn hiển thị data liên tục — không có gap.

Lưu ý Port Forward: Khi pfSense-1 down, URL http://10.10.200.11:8080 không còn hoạt động. Nếu cần admin access vào Zabbix web khi pfSense-1 down, thêm cùng rule Port Forward trên pfSense-2 (Firewall → NAT → Port Forward, WAN 10.10.200.12:808010.10.201.11:80).

  1. Khôi phục: bật lại pfSense-1 → pfSense-1 giành lại MASTER (Skew 0), Tunnel-1 renegotiate tự động.

Lời kết

Trọng tâm của lab là cặp pfSense CARP: mỗi node dựng 1 tunnel riêng về Check Point, nên khi pfSense-1 down hoàn toàn, CARP VIP tự chuyển sang pfSense-2 và Tunnel-2 vẫn đang sẵn sàng — Zabbix không mất kết nối. Check Point chỉ đóng vai remote end, không cần can thiệp gì. Mô hình dễ mở rộng: thêm site mới chỉ cần tạo thêm 2 tunnel (1 từ mỗi pfSense), Zabbix server không thay đổi.

Updated: