1. Tổng quan về High Availability (HA) trên OPNsense.
High Availability (HA) là một tính năng quan trọng trong hệ thống mạng, đặc biệt đối với các firewall, nhằm đảm bảo tính liên tục của dịch vụ ngay cả khi một thành phần trong hệ thống gặp sự cố. Trên OPNsense, HA được triển khai thông qua cơ chế CARP (Common Address Redundancy Protocol), kết hợp với XMLRPC Sync để đồng bộ hóa cấu hình giữa các firewall trong một cụm.
Khi được triển khai đúng cách, HA trên OPNsense cung cấp:
- Redundancy (Dự phòng): Nếu firewall chính (Primary) bị lỗi, firewall dự phòng (Backup) sẽ tự động tiếp nhận vai trò mà không làm gián đoạn kết nối.
- State Synchronization: Các trạng thái kết nối hiện tại được đồng bộ giữa các firewall, giúp duy trì phiên làm việc của người dùng ngay cả khi chuyển đổi giữa Primary và Backup.
- Configuration Synchronization: Cấu hình của firewall Primary được đồng bộ tự động đến Backup để đảm bảo sự nhất quán.
2. Thành phần chính của HA.
- CARP (Common Address Redundancy Protocol):
CARP cung cấp một địa chỉ IP ảo (Virtual IP – VIP) mà cả hai firewall (Primary và Backup) cùng chia sẻ. Khi Primary hoạt động, nó sẽ xử lý toàn bộ lưu lượng thông qua VIP. Nếu Primary gặp sự cố, VIP sẽ được tự động chuyển sang Backup. - pfsync:
Đây là interface chuyên dụng để đồng bộ hóa trạng thái kết nối (connection states) giữa các firewall. Nó giúp đảm bảo rằng các phiên làm việc (sessions) không bị gián đoạn khi failover xảy ra. - XMLRPC Sync:
Tính năng này cho phép cấu hình trên firewall Primary được tự động đẩy qua firewall Backup. Nó đảm bảo rằng cả hai firewall luôn có cùng cấu hình, bao gồm NAT rules, firewall rules, aliases và các thiết lập khác.
3. Quy trình hoạt động của HA.
- Failover:
- CARP sẽ phát hiện khi Primary firewall không hoạt động (do mất kết nối, mất nguồn, hoặc lỗi phần cứng).
- VIP sẽ tự động chuyển sang Backup firewall, đảm bảo tính liên tục của dịch vụ.
- State Synchronization:
- pfsync truyền thông tin về các trạng thái kết nối (states) từ Primary sang Backup.
- Khi Backup nhận VIP, các phiên kết nối hiện tại vẫn được giữ nguyên, người dùng không cần kết nối lại.
- Configuration Synchronization:
- Firewall Primary sử dụng XMLRPC để đồng bộ hóa các thay đổi cấu hình với Backup.
- Điều này giúp giảm thiểu nguy cơ sai lệch cấu hình giữa hai thiết bị.
4. Yêu cầu để triển khai HA.
- Hai firewall OPNsense với cấu hình phần cứng và phần mềm tương đồng.
- Một interface chuyên dụng cho pfsync để đồng bộ trạng thái.
- Một hoặc nhiều địa chỉ IP ảo (VIP) được cấu hình bằng CARP.
- Kết nối tin cậy giữa hai firewall để đồng bộ qua XMLRPC Sync.
5. Sơ đồ ví dụ và cách cấu hình.
5.1. Sơ đồ.
5.2. Cấu hình Interface.
OPNSense 10.10.99.101.
Cấu hình cho Interface WAN (vtnet0_vlan310).
Cấu hình cho Interface LAN (vtnet1_vlan1649).
Cấu hình cho Interface pfSync.
OPNSense 10.10.99.102.
Cấu hình cho Interface WAN (vtnet0_vlan310).
Cấu hình cho Interface LAN (vtnet1_vlan1649).
Cấu hình cho Interface pfSync.
5.3. Cấu hình Firewall Rules.
Cấu hình Firewall Rules cho pfSync cho cả 2 Firewall.
Cấu hình Firewall Rules cho vtnet0_vlan310 cho cả 2 Firewall.
Cấu hình Firewall Rules cho vtnet1_vlan1649 cho cả 2 Firewall.
5.4. Hãy chắc chắn địa chỉ IP của interface pfSync của cả 2 firewall đã có thể giao tiếp với nhau.
- Do rule của interface này mình đã mở all ở phần trên nên mình sẽ check ICMP thử bằng cách vào phần ping ở interface:
- Hostname or IP: Đây là địa chỉ IP của firewall còn lại.
- Source address: Đây là địa chỉ IP của firewall hiện tại bạn đang đứng.
Kết quả khi gửi 1 gói tin icmp và cũng đã nhận được 1 gói tin icmp phản hồi từ bên kia firewall.
5.5. Cấu hình Virtual IPs (VIPs) với CARP.
Virtual IPs là gì?
- Virtual IP (VIP) là một địa chỉ IP không được gán trực tiếp cho một interface vật lý nào, nhưng nó được sử dụng để:
- Tạo khả năng chuyển đổi dự phòng (high availability) giữa nhiều thiết bị firewall trong một cluster.
- Dùng cho NAT 1:1, hoặc để chia sẻ IP giữa các dịch vụ khác nhau.
- Đảm bảo tính liên tục của mạng trong trường hợp một firewall chính gặp sự cố.
CARP là gì?
- CARP là một giao thức được sử dụng để chia sẻ một địa chỉ IP ảo (VIP) giữa các thiết bị firewall trong một cluster nhằm:
- Đảm bảo dự phòng (Failover): Nếu firewall chính gặp lỗi, firewall dự phòng sẽ tự động tiếp quản địa chỉ IP ảo.
- Cân bằng tải (Load Balancing) (trong một số thiết lập nâng cao).
Đây là giao diện cấu hình Virtual IPs (VIPs) trong OPNsense, cụ thể là mục cấu hình CARP (Common Address Redundancy Protocol).
- Mình có hai địa chỉ Virtual IP (VIP) với loại CARP:
- 125.253.124.240/26 trên interface
vtnet0_vlan310
, với VHID (Virtual Host ID) là1
. - 10.10.99.103/24 trên interface
vtnet1_vlan1649
, với VHID là2
.
- 125.253.124.240/26 trên interface
- VHID:
- Mỗi địa chỉ CARP có một VHID duy nhất, xác định firewall nào nào chịu trách nhiệm chính.
- Các firewall trong cluster phải có VHID khớp nhau cho cùng một VIP.
- freq. (1/0):
- Tần số gửi gói tin CARP để thông báo trạng thái, với 1/0 là tần số gửi mặc định.
Đây là chi tiết cấu hình của 2 VIPs trên cả 2 firewall.
Với 125.253.124.240/26 sử dụng cho WAN.
Với 10.10.99.103/24 sử dụng cho LAN.
5.6 Cấu hình CARP cho High Availability (HA).
Thiết lập CARP để firewall chính (master) và dự phòng (backup) chia sẻ một VIP. Khi firewall chính gặp lỗi, thiết bị dự phòng sẽ tự động tiếp quản VIP để giữ cho mạng không bị gián đoạn.
Dưới đây là ví dụ cấu hình đáp ứng các yêu cầu cơ bản để thiết lập chế độ High Availability (HA) trên OPNsense.
Trên firewall chính.
Trên firewall dự phòng.
Dưới đây mình sẽ giải thích ý nghĩa của từng thành phần ở hình trên nhé.
General Settings:
- Disable preempt (Không chọn):
- Ý nghĩa: Khi không chọn, firewall chính (master) sẽ luôn giữ vai trò chính trừ khi xảy ra sự cố. Firewall dự phòng (backup) chỉ chuyển thành master nếu firewall chính không khả dụng.
- Lưu ý: Đây là cấu hình chuẩn cho High Availability (HA), vì tránh các tình huống failover không cần thiết.
- Synchronize States (Được chọn):
- Ý nghĩa: Cho phép đồng bộ các trạng thái kết nối (state table) từ firewall chính sang firewall dự phòng. Điều này giúp duy trì các phiên hoạt động (như kết nối SSH, tải file, hoặc truy cập website) mà không bị gián đoạn khi xảy ra failover.
- Synchronize Interface (pfsync):
- Ý nghĩa: Chỉ định interface dùng để đồng bộ trạng thái (state) giữa các firewall. Interface này thường được cấu hình trong một mạng riêng (vlan/physical), đảm bảo không ảnh hưởng đến các interface khác.
- Cấu hình: Interface phải có địa chỉ IP riêng trên cả hai firewall và sử dụng đường kết nối chuyên biệt.
- Sync Compatibility (OPNsense 24.7 or above):
- Ý nghĩa: Đảm bảo tương thích giữa các phiên bản OPNsense. Điều này rất quan trọng nếu hai firewall sử dụng các phiên bản khác nhau.
Synchronize Peer IP:
- Đây là IP của firewall đối tác mà trạng thái sẽ được đồng bộ:
- Trên firewall chính: Nhập IP của firewall dự phòng (VD:
10.10.10.102
). - Trên firewall dự phòng: Nhập IP của firewall chính (VD:
10.10.10.101
).
- Trên firewall chính: Nhập IP của firewall dự phòng (VD:
Lưu ý: Địa chỉ này phải nằm trê interface được chọn làm Synchronize Interface (pfsync).
Configuration Synchronization Settings (XMLRPC Sync):
- Synchronize Config (Được chọn):
- Ý nghĩa: Cho phép đồng bộ cấu hình từ firewall chính sang firewall dự phòng qua giao thức XMLRPC. Tất cả các thay đổi cấu hình trên firewall chính sẽ tự động được áp dụng lên firewall dự phòng.
- Remote System Username/Password:
- Ý nghĩa: Thông tin đăng nhập (username/password) của firewall đối tác, dùng để xác thực khi đồng bộ hóa cấu hình.
- Cách thiết lập đúng:
- Username: Tài khoản quản trị (thường là
root
) của firewall dự phòng. - Password: Mật khẩu của tài khoản này.
- Username: Tài khoản quản trị (thường là
- Remote IP:
- Trên firewall chính: Nhập IP của firewall dự phòng (VD:
10.10.10.102
). - Trên firewall dự phòng: Nhập IP của firewall chính (VD:
10.10.10.101
).
- Trên firewall chính: Nhập IP của firewall dự phòng (VD:
Services to Synchronize (Các dịch vụ được đồng bộ):
- Aliases, Auth Servers, Backup, Captive Portal:
- Ý nghĩa: Đảm bảo đồng bộ các thành phần quan trọng như:
- Aliases: Danh sách các alias được sử dụng trong firewall rules.
- Auth Servers: Cấu hình máy chủ xác thực.
- Backup: Sao lưu cấu hình.
- Captive Portal: Các thiết lập liên quan đến quản lý truy cập.
- Ý nghĩa: Đảm bảo đồng bộ các thành phần quan trọng như:
Lưu ý: Nên chọn đồng bộ toàn bộ dịch vụ cần thiết để hai firewall có cấu hình giống nhau, tránh lỗi khi chuyển đổi vai trò (failover).
5.7. Ánh xạ NAT hoặc Port Forwarding.
Mình sử dụng Manual Rules trong chế độ NAT Outbound.
- Cấu hình rule sau:
- Interface:
vtnet0_vlan310
(interface chính nơi VLAN 1649 sẽ kết nối đến). - Source:
vtnet1_vlan1649 address
(địa chỉ source, là địa chỉ IP của VLAN 1649). - Source Port/Destination Port:
*
(không giới hạn, áp dụng cho tất cả các cổng source và dest). - Destination:
*
(không giới hạn, áp dụng cho tất cả các dest). - NAT Address:
125.253.124.240
(địa chỉ IP Public dùng để NAT). - Static Port:
NO
(nghĩa là sẽ thay đổi cổng nguồn nếu cần thiết).
- Interface:
Ý nghĩa của rule này:
- Bất kỳ lưu lượng nào từ VLAN 1649 (vtnet1_vlan1649) đi qua interface
vtnet0_vlan310
sẽ được NAT sang địa chỉ IP công khai125.253.124.240
. - Ứng dụng: Thường dùng khi bạn muốn đảm bảo tất cả các thiết bị trong VLAN 1649 đều sử dụng một địa chỉ IP cố định (125.253.124.240) khi truy cập Internet.
Sau khi lưu lại, chúng ta có rule như dưới. Ở hình dưới mình cũng đã tạo ra một NAT Outbound với source any và NAT Address là Interface address nữa để LAN có thể đi Internet được nhé.
6. Xác minh cấu hình thành công bằng cách tạo rule test cho phép LAN đi internet.
Nhìn hình dưới bạn sẽ thấy khi bạn thay đổi config (ví dụ như là tạo rule mới) bạn sẽ nhận được thông báo sau đây:
The changes have been applied successfully, remember to update your backup server in System: High availability: status
Ý nghĩa:
- The changes have been applied successfully: Các thay đổi config của bạn đã được áp dụng thành công trên firewall hiện tại (primary firewall hoặc backup firewall).
- Remember to update your backup server in System: High availability: status:
- Đây là một lời nhắc rằng nếu bạn đang sử dụng High Availability (HA) với cấu hình CARP (Common Address Redundancy Protocol) giữa hai firewall (Primary và Backup), bạn cần đồng bộ hóa các thay đổi NAT này lên firewall Backup.
- Điều này đảm bảo rằng cả hai firewall (Primary và Backup) đều có cùng một cấu hình NAT. Nếu không, khi xảy ra failover, các kết nối ra/vào có thể bị gián đoạn.
Để đảm bảo cấu hình trên Primary firewall được đồng bộ lên Backup firewall, thực hiện các bước sau:
- Truy cập System > High Availability > Status.
- Chọn Synchronize Config to Backup (nếu bạn đã bật XMLRPC Sync trong High Availability).
Kiểm tra trạng thái đồng bộ giữa hai firewall (Primary và Backup) để đảm bảo rằng các thay đổi đã được áp dụng.
Tại sao cần đồng bộ?
- Khi bạn sử dụng High Availability, cả hai firewall phải có cấu hình giống nhau (bao gồm cả các rule NAT, firewall rules và các thiết lập khác).
- Nếu không đồng bộ, Backup firewall sẽ không có quy tắc NAT mới. Khi xảy ra failover, các kết nối mạng có thể bị gián đoạn, gây ảnh hưởng đến hệ thống.
Nếu bạn không dùng cấu hình High Availability, bạn sẽ không có thông báo này.
7. Kiểm tra.
Hãy vào server 10.10.99.250 và thực hiện các command như dưới để test kết quả nhé. Tường hợp này server mình đang có IP 10.10.99.250 đi qua Gateway VIP 10.10.99.103.
Khi bạn check curl ifconfig.co bạn nhận thấy hiện tại Firewall Backup đang phục vụ với IP 125.253.124.248. Điều này cũng đúng khi bạn thực hiện traceroute 8.8.8.8 bạn thấy hướng đi internet đang qua nexhop đang là 10.10.99.102 của Firewall Firewall Backup.
root@staging:~# ip a | grep 10.10.99
inet 10.10.99.250/24 brd 10.10.99.255 scope global ens18
root@staging:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.99.103 0.0.0.0 UG 0 0 0 ens18
10.10.99.0 0.0.0.0 255.255.255.0 U 0 0 0 ens18
root@staging:~# ping -c 4 wiki.hoanghd.com
PING wiki.hoanghd.com (113.161.201.163) 56(84) bytes of data.
64 bytes from static.vnpt.vn (113.161.201.163): icmp_seq=1 ttl=248 time=3.38 ms
64 bytes from static.vnpt.vn (113.161.201.163): icmp_seq=2 ttl=248 time=4.91 ms
64 bytes from static.vnpt.vn (113.161.201.163): icmp_seq=3 ttl=248 time=3.31 ms
64 bytes from static.vnpt.vn (113.161.201.163): icmp_seq=4 ttl=248 time=5.83 ms
--- wiki.hoanghd.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 3.311/4.358/5.828/1.062 ms
root@staging:~# curl ifconfig.co
125.253.124.248
root@staging:~# traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 10.10.99.102 (10.10.99.102) 0.253 ms 0.220 ms 0.190 ms
2 125.253.124.193 (125.253.124.193) 10.523 ms 10.498 ms 10.477 ms
3 10.0.2.1 (10.0.2.1) 0.671 ms 0.664 ms 0.741 ms
4 10.0.0.1 (10.0.0.1) 0.931 ms 0.914 ms 0.940 ms
5 static.cmcti.vn (203.205.25.61) 1.087 ms 1.097 ms 1.047 ms
6 static.cmcti.vn (203.205.56.230) 21.321 ms 22.108 ms 22.062 ms
7 72.14.215.153 (72.14.215.153) 22.932 ms * *
8 * * *
9 dns.google (8.8.8.8) 21.105 ms 21.088 ms 21.065 ms
Và khi mình tắt Firewall Backup đi và check lại curl ifconfig.co bạn nhận thấy hiện tại Firewall Master đang phục vụ với IP 125.253.124.247. Điều này cũng đúng khi bạn thực hiện traceroute 8.8.8.8 bạn thấy hướng đi internet đang qua nexhop đang là 10.10.99.101 của Firewall Firewall Master.
root@staging:~# ip a | grep 10.10.99
inet 10.10.99.250/24 brd 10.10.99.255 scope global ens18
root@staging:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.99.103 0.0.0.0 UG 0 0 0 ens18
10.10.99.0 0.0.0.0 255.255.255.0 U 0 0 0 ens18
root@staging:~# ping -c 4 wiki.hoanghd.com
PING wiki.hoanghd.com (113.161.201.163) 56(84) bytes of data.
64 bytes from static.vnpt.vn (113.161.201.163): icmp_seq=1 ttl=248 time=2.98 ms
64 bytes from static.vnpt.vn (113.161.201.163): icmp_seq=2 ttl=248 time=6.37 ms
64 bytes from static.vnpt.vn (113.161.201.163): icmp_seq=3 ttl=248 time=6.07 ms
64 bytes from static.vnpt.vn (113.161.201.163): icmp_seq=4 ttl=248 time=5.27 ms
--- wiki.hoanghd.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 2.975/5.170/6.366/1.329 ms
root@staging:~# curl ifconfig.co
125.253.124.247
root@staging:~# traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 10.10.99.101 (10.10.99.101) 0.218 ms 0.186 ms 0.163 ms
2 125.253.124.193 (125.253.124.193) 12.613 ms 12.592 ms 12.571 ms
3 10.0.2.1 (10.0.2.1) 0.722 ms 0.695 ms 0.710 ms
4 10.0.0.1 (10.0.0.1) 0.736 ms 0.710 ms 0.777 ms
5 static.cmcti.vn (203.205.25.61) 0.977 ms 0.994 ms 0.936 ms
6 static.cmcti.vn (203.205.56.230) 21.246 ms 21.389 ms 21.351 ms
7 72.14.215.153 (72.14.215.153) 23.762 ms 23.611 ms *
8 * * *
9 dns.google (8.8.8.8) 21.177 ms 21.367 ms 21.113 ms
8. Ví dụ với 1 rule Forwarding.
Mình tạo rule Forwarding port 22 của server 10.10.99.250 như hình dưới.
Thực hiện Sync config.
Kiểm tra trên 125.253.124.247 và 125.253.124.248 bạn không thể telnet vì mình chỉ Forwarding port 22 của server 10.10.99.250 sang VIP 125.253.124.240.
Has-iMac:~ hoanghd$ telnet 125.253.124.247 22
Trying 125.253.124.247...
^C
Has-iMac:~ hoanghd$ telnet 125.253.124.248 22
Trying 125.253.124.248...
^C
Has-iMac:~ hoanghd$ telnet 125.253.124.240 22
Trying 125.253.124.240...
Connected to .
Escape character is '^]'.
SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.10
Nếu bạn muốn Forwarding port 22 của server 10.10.99.250 ra cả IP vật lý thì có thể tham khảo rule dưới đây.
Kiểm tra Server thì thấy Firewall Master đang phục vụ.
root@staging:~# curl ifconfig.co
125.253.124.247
Do Firewall Master đang phục vụ nên bạn chỉ telnet đến 125.253.124.247 và 125.253.124.240 thôi nhé.
Has-iMac:~ hoanghd$ telnet 125.253.124.247 22
Trying 125.253.124.247...
Connected to .
Escape character is '^]'.
SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.10
Has-iMac:~ hoanghd$ telnet 125.253.124.248 22
Trying 125.253.124.248...
Has-iMac:~ hoanghd$ telnet 125.253.124.240 22
Trying 125.253.124.240...
Connected to .
Escape character is '^]'.
SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.10
9. Tổng kết.
High Availability (HA) trên OPNsense không chỉ đảm bảo tính liên tục của dịch vụ mạng mà còn giúp hệ thống có khả năng tự động phục hồi khi xảy ra lỗi. Với sự kết hợp giữa CARP, pfsync và XMLRPC Sync, OPNsense cung cấp một giải pháp HA mạnh mẽ và đáng tin cậy cho các tổ chức từ nhỏ đến lớn.
Trong bài viết này, mình đã được giới thiệu tổng quan về HA trên OPNsense, cách nó hoạt động và các thành phần liên quan. Phần lab thực tế sẽ cung cấp cái nhìn chi tiết hơn về cách triển khai và kiểm thử tính năng này. Việc triển khai đúng cách sẽ giúp hệ thống của bạn đạt được mức độ ổn định và an toàn cao nhất.