Hệ thống thông tin ngày càng trở nên phức tạp và tiềm ẩn nhiều môi đe dọa hơn đòi hỏi các hệ thống cần có các phương pháp quản lý lưu lương truy cập một cách phù hợp hơn. Điển hình những năm gần đây đối với môi trường Kubernetes ta đã nghe nhiều đến khái niệm Service Mesh giúp tăng khả năng giám sát và quản lý lưu lượng mạng. Điều này chứng tỏ rằng việc quản lý ở các layer thấp như Network chưa bao giờ hết quan trọng. Trong bài viết ngày hôm nay mình sẽ giới thiệu đến các bạn một khái niệm mới là Traffic Mirroring hay Port Mirroring.
Traffic Mirroring là gì?
Traffic Mirroring (hay Port Mirroring) là kỹ thuật sao chép lưu lượng mạng từ một nguồn (ví dụ: người dùng hoặc một ứng dụng) và gửi bản sao này đến một hệ thống đích để phân tích hoặc kiểm tra. Hiểu đơn giản một yêu cầu được gửi đến sẽ được nhân đôi, một bản gửi đến hệ thống đích như mong muốn, có thể là một web server, APIs,... Yêu cầu còn lại sẽ được gửi đến một hệ thống khác, thường là một hệ thống giám sát hoặc một web server, APIs tương tự để phân tích.
Mục tiêu chính của Traffic Mirroring là tạo một "bản sao" của lưu lượng thực tế mà không gây ảnh hưởng đến hoạt động của hệ thống đang chạy.
Traffic Mirroring thường được sử dụng để ám chỉ việc sao chép yêu cầu (requests) từ client ở tầng Application, xử lý bằng phần mềm. Ngược lại, Port Mirroring được sử dụng để ám chỉ việc sao chép gói tin (packets) ở các thiết bị vật lý như Switch, Router.
Lợi ích và usecase
Đầu tiên phải kể đến lợi ích được sử dụng nhiều nhất là Phân tích lưu lượng. Việc sao chép lưu lượng mạng cho phép kiểm tra hiệu suất của các ứng dụng và hệ thống mà không gây gián đoạn đến hệ thống production. Trong nhiều trường hợp việc tích hợp hệ thống giám sát hay SDK vào trong source code để giám sát các request người dùng đến hệ thống rất khó khăn và yêu cầu sự thay đổi lớn.
Ví dụ: Bạn muốn thống kê số lượng request user gửi đến có Header "Token". Để làm được việc này trong hệ thống Production sẽ yêu cầu thay đổi source code và kiểm thử nhiều lần qua các môi trường dev, staging, uat,... Ngược lại nếu sử dụng kỹ thuật Traffic Mirroring bạn chỉ cần xây dựng 1 hệ thống thứ 3 để xử lý requests.
Việc phân tích lưu lượng còn giúp phát hiện các lỗi tiềm ẩn mà một số hệ thống giám sát khác không nắm bắt được mà chỉ có thể biết được khi bóc tách từng request.
Khi kết hợp Traffic Mirroring với các hệ thống an toàn thông tin như IDS (Intrusion Detection System) còn giúp phát hiện sớm các hành động khai thác hay tấn công mạng.
Ngoài ra sao chép lưu lượng mạng còn được sử dụng để kiểm thử các tính năng mới.
Trong nhiều trường hợp các tính năng mới yêu cầu phải có request từ người dùng thật chứ không thể kiểm thử bằng các yêu cầu giả lập. Và thực thế khi các tính năng khi được kiểm thử với request thật sẽ tiềm ẩn ít lỗi hơn khi đem lên môi trường production.
Ví dụ: Khi các tính năng mới đã sẵn sàng trên staging, hoàn toàn bạn có thể thử nghiệm sao chép 1 phần dữ liệu trên production để đẩy về môi trường staging.
Tích hợp Traffic Mirroring
Như phần giới thiệu ban đầu mình đã chỉ ra có 2 nơi chúng ta có thể áp dụng kỹ thuật sao chép lưu lượng này đó là sử dụng phần cứng (Router, Switch) hoặc sử dụng phần mềm như Nginx, Apache. Trong bài viết này mình sẽ tập trung nhiều hơn vào tích hợp trên phần mềm vì nó phổ biến và dễ dàng hơn.
Hệ thống phần cứng
Đối với các hệ thống phần cứng như Router hoặc Switch nếu như thiết bị của bạn có hỗ trợ port SPAN (Switched Port Analyzer port) thì bạn có thể sử dụng trực tiếp port này bằng cách cắm dây mạng vào thiết bị giám sát.
Nếu thiết bị không có sẵn port này thì cũng đừng lo, bạn có thể kiểm tra xem thiết bị của bạn có cho phép chuyển đổi port Lan thành port SPAN không. Hiện tại có rất nhiều các thiết bị đều hỗ trợ theo phương thức này.
Hệ thống phần mềm
Traffic Mirroring trên Nginx
Để tích hợp Traffic Mirroring cho Nginx, bạn cần chỉnh sửa file cấu hình có thể là nginx.conf
hoặc trong folder sites-enabled
, tùy thuộc vào việc bạn để file cấu hình ở đâu. Dưới đây là cấu hình ví dụ:
http { server { listen 80; server_name example.com; location / { proxy_pass https://api.hoangviet.io.vn; mirror /mirror_endpoint; # Sao chép lưu lượng đến endpoint khác } location /mirror_endpoint { internal; # Đảm bảo endpoint này không thể truy cập từ bên ngoài proxy_pass https://api-staging.hoangviet.io.vn; # Điểm đến để xử lý bản sao lưu lượng } }
}
Cấu hình trên sẽ sao chép các request vào path /
vốn được chuyển tiếp sang api api.hoangviet.io.vn
giờ sẽ được tạo thêm 1 bản nữa và gửi sang backend mới ở domain api-staging.hoangviet.io.vn
Sau khi cấu hình xong hãy tiến hành reload cấu hình nginx để kích hoạt nhé
nginx -t # Test thử cấu hình mới xem có gặp vấn đề gì không
systemctl reload nginx # Load file cấu hình mới lên và chạy
Traffic Mirroring trên Apache
Tương tự như nginx, Apache cũng có thể cấu hình để mirror traffic. Trong cấu hình cho site ta setup như sau:
<VirtualHost *:80> ServerName api.hoangviet.io.vn ProxyPass / https://api.hoangviet.io.vn/ ProxyPassReverse / https://api.hoangviet.io.vn/ # Cấu hình mirror traffic RewriteEngine On RewriteRule ^/(.*)$ https://api-staging.hoangviet.io.vn/$1 [P]
</VirtualHost>
Cấu hình trên cũng sẽ sao chép các request từ api.hoangviet.io.vn
qua api-staging.hoangviet.io.vn
.
Giải thích phần cấu hình mirror traffic:
RewriteEngine On
: Kích hoạt Rewrite Engine, một phần của mod_rewrite, để xử lý các quy tắc chuyển hướng hoặc sửa đổi URL.RewriteRule ^/(.*)$ https://api-staging.hoangviet.io.vn/$1 [P]
- Đây là quy tắc chính để thực hiện Traffic Mirroring:
^/(.*)$
: Biểu thức chính quy (regex) này khớp với mọi URL sau dấu / (ví dụ: /api/users hoặc /index.html).https://api-staging.hoangviet.io.vn/$1
: Chuyển lưu lượng đến server https://api-staging.hoangviet.io.vn/, nơi $1 là phần còn lại của URL (được lấy từ regex). Ví dụ: /api/users → https://api-staging.hoangviet.io.vn/api/users.[P]
: Cờ P (Proxy) yêu cầu Apache xử lý yêu cầu thông qua mod_proxy, gửi lưu lượng đếnapi-staging.hoangviet.io.vn
.
- Đây là quy tắc chính để thực hiện Traffic Mirroring:
Sau đó bạn cần kích hoạt module mod_proxy
để có thể chạy được cấu hình trên
a2enmod proxy
a2enmod proxy_http
systemctl restart apache2
Lưu ý khi sử dụng Traffic Mirroring
Bởi lượng lưu lượng mạng được nhân lên gấp đôi nên thiết bị vật lý hoặc phần mềm sẽ phải chịu tải lớn hơn. Nếu số lượng request đến quá nhiều có thể gây ra quá tải hệ thống và ảnh hưởng đến hiệu năng của hệ thống chính.
Ngoài ra cũng còn một vài điều khác liên quan đến việc đảm bảo an toàn chia sẻ dữ liệu khi mirror traffic qua một dịch vụ hoặc hạ tầng bên thứ 3 nếu có.
Kết
Trong bài viết mình đã chia sẻ với các bạn về cách để áp dụng kỹ thuật Traffic Mirroring trong thực tế và cấu hình trên các phần mềm phổ biến hiện nay như Apache và Nginx. Cám ơn các bạn đã đọc đến tận đây, hy vọng bài viết có đem lại giá trị cho bạn.
Nếu thấy bài viết hay hãy Upvote và Follow mình để theo dõi thêm các bài viết khác nữa nhé
Chuyên mục quảng cáo
Nếu như bạn đang gặp khó khăn trong vấn đề chuyên môn, cần người hỗ trợ về mặt hệ thống, DevOps tools hay cần định hướng trong công việc thì mình tự tin có thể hỗ trợ được bạn. Liên hệ với mình để trao đổi thêm nhé https://hoangviet.io.vn/