Cách TCP/IP fingerprinting hoạt động: TTL, kích thước cửa sổ, MSS và thứ tự tùy chọn TCP tiết lộ hệ điều hành của bạn — và cách p0f, JA4T đọc chúng.
Trước khi trình duyệt gửi đi một byte nào của TLS ClientHello, hệ điều hành của bạn đã tự giới thiệu mình rồi. Bắt tay ba bước (three-way handshake) của TCP mở đầu mọi kết nối mang theo một nhúm tham số cấp thấp — TTL ban đầu, kích thước cửa sổ được quảng bá, kích thước phân đoạn tối đa, và thứ tự các tùy chọn TCP — mà nhân (kernel) hệ điều hành của bạn điền vào bằng giá trị mặc định của riêng nó. Không giá trị nào trong số đó do bạn hay ứng dụng của bạn chọn, và tổ hợp ấy đủ nhất quán để đoán ra hệ điều hành bạn đang chạy. Đó chính là TCP/IP fingerprinting: phát hiện hệ điều hành một cách thụ động từ các header gói tin thô, được thực hiện trước khi bất kỳ lớp mã hóa nào được đàm phán.
Điểm mấu chốt
- Nhân hệ điều hành mới là thứ viết ra dấu vân tay, không phải trình duyệt. TTL ban đầu, kích thước cửa sổ TCP, MSS và thứ tự các tùy chọn TCP trong gói SYN đều do stack mạng của hệ điều hành thiết lập — nên dấu vân tay nhận diện hệ điều hành, chứ không phải ứng dụng đưa ra yêu cầu.
- Nó xảy ra trước TLS. TCP/IP fingerprinting đọc gói SYN của bắt tay ba bước, một lớp bên dưới bắt tay TLS mà JA3/JA4 lấy dấu vân tay. Hai lớp này xếp chồng lên nhau.
- Nó mang tính thụ động. Một máy chủ có thể lấy dấu vân tay hệ điều hành của bạn chỉ bằng cách chấp nhận kết nối — không thăm dò, không JavaScript, không gửi lại gì cho bạn. Các công cụ như p0f đã tiên phong cách làm này; JA4T là phiên bản hiện đại, có cấu trúc.
- Nó để lộ sự không khớp giữa OS thực và OS được khai báo. Một gói SYN mà các giá trị mặc định nói "Linux" nhưng lại đến kèm
User-Agenttuyên bố "Windows Chrome" là tín hiệu giả mạo kinh điển được dùng trong phát hiện bot. - NAT, proxy và VPN làm mờ nó. Vì các tín hiệu nằm trong những header mà cổng (gateway) và đường hầm (tunnel) ghi đè lại, dấu vân tay phản ánh stack gần nhất đã viết ra gói tin — và đó chính xác là lý do nó giúp phát hiện VPN và proxy.
TCP/IP Fingerprinting là gì?
Mọi kết nối TCP đều mở đầu bằng bắt tay ba bước: client gửi một SYN, máy chủ đáp lại SYN-ACK, và client xác nhận bằng ACK. Gói SYN đầu tiên đó được lắp ráp bởi stack TCP/IP của hệ điều hành, và một số trường của nó không được quy định bởi các chuẩn giao thức — các chuẩn định nghĩa ý nghĩa của từng trường nhưng để giá trị mặc định cho bên triển khai quyết định. Các nhân khác nhau chọn giá trị mặc định khác nhau, và chúng hiếm khi thay đổi giữa các kết nối.
Vì các giá trị mặc định đó được nung sẵn trong stack mạng của hệ điều hành, dấu vân tay mô tả hệ điều hành và phiên bản của nó, không phải trình duyệt hay người dùng. Hai trình duyệt khác nhau trên cùng một máy Windows tạo ra cùng một dấu vân tay TCP/IP; cùng một trình duyệt trên Windows và trên Linux tạo ra hai dấu vân tay khác nhau. Điều này ngược lại với browser fingerprinting, vốn nhận diện ứng dụng và mù tịt với nhân bên dưới.
Các tín hiệu trong một gói SYN
Bốn giá trị header đảm nhận phần lớn công việc, được rút ra từ tầng IP (RFC 791) và tầng TCP (RFC 9293).
1. TTL ban đầu (Time To Live)
Trường TTL của header IP bị giảm đi một tại mỗi chặng router, nên người quan sát không bao giờ thấy trực tiếp giá trị gốc — nhưng các hệ điều hành khởi đầu từ một nhóm nhỏ các giá trị mặc định nổi tiếng: 64 (Linux, macOS, BSD hiện đại), 128 (Windows), và 255 (một số thiết bị mạng và Unix cũ). Nếu một gói tin đến với TTL là 57, gần như chắc chắn nó đã khởi đầu từ 64 và đi qua 7 chặng. Làm tròn TTL quan sát được lên giá trị mặc định phổ biến gần nhất sẽ khôi phục được họ hệ điều hành nguồn.
2. Kích thước cửa sổ TCP
Header TCP quảng bá một cửa sổ nhận ban đầu — bao nhiêu byte mà bên gửi sẵn sàng chấp nhận trước khi yêu cầu một xác nhận (acknowledgement). Giá trị khởi đầu chính xác là đặc thù của từng stack: trong lịch sử Windows, Linux và macOS mỗi hệ đều xuất xưởng kích thước cửa sổ ban đầu khác biệt rõ rệt, và giá trị này là một trong những yếu tố phân biệt mạnh nhất trong gói SYN. Kết hợp với tùy chọn window scale (RFC 7323), nó thu hẹp được hệ điều hành và đôi khi cả phiên bản.
3. Kích thước phân đoạn tối đa (MSS)
Tùy chọn MSS (RFC 6691) khai báo payload TCP lớn nhất mà client sẽ chấp nhận trong một phân đoạn. Giá trị của nó được suy ra từ MTU của đường truyền — thường là 1460 byte trên Ethernet chuẩn (MTU 1500 trừ đi 40 byte header), nhưng thấp hơn qua PPPoE, đường hầm hay VPN. Một MSS bất thường tự nó đã mang thông tin: giá trị 1400 hoặc thấp hơn thường để lộ rằng lưu lượng đang đi qua một đường hầm, đây là gợi ý rằng có VPN đang được dùng.
4. Các tùy chọn TCP và thứ tự của chúng
Trường tùy chọn TCP có thể mang MSS, window scale, SACK-permitted, timestamp và phần đệm NOP — và quan trọng là, thứ tự mà một stack liệt kê chúng là đặc thù của bên triển khai. Linux, Windows và macOS mỗi hệ phát ra một bố cục tùy chọn đặc trưng (ví dụ MSS, SACK, Timestamp, NOP, Window-Scale so với MSS, NOP, Window-Scale, SACK, Timestamp). Giống như thứ tự các tiện ích mở rộng trong một TLS ClientHello, thứ tự để lộ danh tính nhiều hơn bất kỳ giá trị đơn lẻ nào.
| Tín hiệu | Được đặt bởi | Linux điển hình | Windows điển hình |
|---|---|---|---|
| TTL ban đầu | stack IP | 64 | 128 |
| Kích thước cửa sổ | stack TCP | đặc thù stack | đặc thù stack |
| MSS | suy ra từ MTU | 1460 | 1460 |
| Thứ tự tùy chọn | stack TCP | bố cục riêng biệt | bố cục riêng biệt |
Phát hiện thụ động: p0f và JA4T
Đặc tính then chốt của TCP/IP fingerprinting là nó mang tính thụ động. Khác với các công cụ phát hiện OS chủ động vốn gửi các gói thăm dò được chế tác và đo phản hồi, một bộ lấy dấu vân tay thụ động chỉ cần quan sát lưu lượng mà client dù sao cũng đã gửi. Chấp nhận một kết nối thông thường là đủ để đọc gói SYN.
p0f là công cụ phổ biến hóa cách tiếp cận này — một bộ lấy dấu vân tay thụ động đối chiếu các gói SYN quan sát được với một cơ sở dữ liệu chữ ký OS đã biết, nhận diện hệ điều hành, và đôi khi cả thời gian hoạt động (uptime) hay loại đường truyền, mà không gửi một gói nào tới mục tiêu. Nó đã thiết lập định dạng chữ ký mà hầu hết các bộ phát hiện OS thụ động vẫn còn tuân theo.
JA4T là thành viên ở tầng TCP của bộ JA4+ từ FoxIO, cùng dự án đứng sau dấu vân tay TLS JA4 hiện đại. JA4T kết hợp kích thước cửa sổ TCP, các tùy chọn TCP theo thứ tự, giá trị MSS và giá trị window scale thành một chuỗi có cấu trúc, dễ đọc duy nhất — đưa triết lý "dấu vân tay sắp xếp được, đọc được" của JA4 xuống tầng truyền tải. Vì nó nằm dưới TLS, JA4T có thể gắn cờ một kết nối ngay cả trước khi ClientHello được phân tích.
Cách nó xếp chồng với TLS Fingerprinting
TCP/IP fingerprinting và TLS fingerprinting đọc các tầng liền kề của cùng một chuỗi bắt tay, và chúng nhận diện những thứ khác nhau:
| Tầng | Kỹ thuật | Nhận diện |
|---|---|---|
| IP + TCP | p0f / JA4T | Nhân hệ điều hành |
| TLS | JA3 / JA4 | Thư viện TLS (và do đó là ứng dụng) |
Sự khác biệt đó là điều khiến cặp đôi này trở nên mạnh mẽ. Dấu vân tay TCP/IP cho biết hệ điều hành nào đã gửi gói tin; dấu vân tay TLS cho biết phần mềm client nào đã mở phiên. Khi hai cái mâu thuẫn — một gói SYN kiểu Windows mang theo một bắt tay TLS khớp với macOS Safari — thì kết nối đó tự mâu thuẫn nội tại, và sự thiếu nhất quán giữa các tầng quan sát được chính là nguyên lý cốt lõi đằng sau các kỹ thuật phát hiện bot. Một bộ thu thập (scraper) chạy trên máy chủ Linux mà giả mạo User-Agent Chrome-trên-Windows vẫn phát ra một gói SYN kiểu Linux, và không header nào nó đặt có thể thay đổi điều đó.
Nó để lộ điều gì — và giới hạn của nó
Một dấu vân tay TCP/IP có thể để lộ họ và phiên bản hệ điều hành, gợi ý loại đường truyền (Ethernet, PPPoE, tunnel) từ MSS, và phơi bày sự không khớp giữa nền tảng được khai báo và nền tảng thực. Nhưng nó là một công cụ thô so với các dấu vân tay ở tầng cao hơn, và một số thứ làm mờ nó:
- NAT và bộ cân bằng tải có thể ghi lại hoặc chuẩn hóa các tùy chọn TCP, nên dấu vân tay có thể phản ánh một cổng (gateway) thay vì máy chủ cuối.
- VPN và proxy kết thúc hoặc đóng gói lại kết nối; khi đó máy chủ lấy dấu vân tay hệ điều hành của điểm cuối VPN, không phải của bạn. Điều này có hai mặt — nó che giấu OS thật của bạn, nhưng một IP trông giống dân cư (residential) đi kèm với dấu vân tay OS kiểu trung tâm dữ liệu tự nó lại là một tín hiệu VPN/proxy.
- Độ phân giải thấp. TCP/IP fingerprinting phân biệt tốt các họ hệ điều hành nhưng không thể nhận diện một trình duyệt, kiểu thiết bị hay người dùng cụ thể. Nó là một bộ lọc đầu tiên thô ráp, không phải một định danh duy nhất.
Vì những lý do này, nó gần như luôn được dùng làm một đầu vào trong nhiều đầu vào — kết hợp với dấu vân tay TLS và HTTP/2, danh tiếng IP và các tín hiệu hành vi — thay vì làm một phán quyết độc lập.
Câu hỏi thường gặp
Tôi có thể thay đổi dấu vân tay TCP/IP của mình không?
Chỉ bằng cách thay đổi stack mạng của hệ điều hành tạo ra nó. Một số công cụ bảo mật và chống kiểm duyệt cung cấp tính năng "giả mạo dấu vân tay OS" vốn ghi lại TTL, kích thước cửa sổ và thứ tự tùy chọn để mô phỏng một hệ thống khác, nhưng nó hoạt động ở cấp nhân/tường lửa — cài đặt trình duyệt, tiện ích mở rộng và việc ghi đè User-Agent không thể chạm tới nó, vì các giá trị được viết ra trước khi bất kỳ mã ứng dụng nào chạy.
VPN có che giấu dấu vân tay TCP/IP của tôi không?
Một phần. Một VPN tạo đường hầm cho lưu lượng của bạn, nên máy chủ đích thấy gói SYN được tạo bởi stack của client VPN hoặc nút thoát của nó, chứ không phải gói gốc của bạn. Dấu vân tay OS thật của bạn được che giấu, nhưng đường hầm thường để lại dấu vết riêng — một MSS bị giảm do chi phí đóng gói, hoặc một dấu vân tay OS không khớp với IP dân cư — mà các hệ thống phát hiện dùng để suy ra rằng có VPN đang hiện diện.
TCP/IP fingerprinting có giống với phát hiện OS bằng Nmap không?
Không. Nmap thực hiện phát hiện OS chủ động — nó gửi một loạt gói thăm dò được chế tác và phân tích các phản hồi. TCP/IP fingerprinting như được bàn ở đây là thụ động: nó chỉ quan sát các gói mà client gửi trong một kết nối bình thường, điều khiến nó im lặng và không thể phát hiện được từ phía client.
Tại sao chỉ riêng TTL không nhận diện được một OS?
Vì TTL bị giảm tại mỗi chặng router, giá trị bạn quan sát được là giá trị mặc định khởi đầu trừ đi số chặng, và các giá trị mặc định khác nhau có thể trùng nhau sau đủ số chặng. TTL thu hẹp họ hệ điều hành (64 so với 128 so với 255) nhưng chỉ đáng tin khi kết hợp với kích thước cửa sổ, MSS và thứ tự tùy chọn — toàn bộ chữ ký, chứ không phải bất kỳ trường đơn lẻ nào.


