Tunnel chia tách của bạn loại trừ trình khởi chạy, không phải trò chơi
Trình khởi chạy khởi động một tệp thực thi khác cho trận đấu, và tiến trình đó có các socket riêng. Tìm tiến trình thật, khớp đúng định danh, rồi kiểm tra.
Bạn thêm trình khởi chạy vào danh sách loại trừ, tốc độ tải xuống nhảy từ chậm sang nhanh, và trận đấu vẫn hạ cánh trên một máy chủ xa. Không có gì hỏng. Trình khởi chạy và trò chơi là hai tiến trình với hai bộ socket, và loại trừ một cái không nói gì về cái kia. Tải xuống nhanh hơn vì tải xuống là lưu lượng của trình khởi chạy; trận đấu là kết nối của người khác, được mở bởi một tệp thực thi mà quy tắc của bạn chưa từng thấy.
Một trình cài đặt, nhiều tiến trình
Phần mềm trò chơi hiện đại là một chòm sao nhỏ. Có một ứng dụng khách đăng nhập cho bạn, một trình cập nhật tải nội dung, một trình khởi chạy khởi động trò chơi, và một tệp thực thi trò chơi có thể tự tạo tiến trình thứ hai cho chống gian lận hoặc cho lớp ghép trận. Mỗi thứ trong số đó có thể giữ các kết nối riêng của nó đến các đích riêng của nó.
Quy tắc loại trừ thường nêu tên một trong số chúng. Nêu tên cái nào phụ thuộc hoàn toàn vào định danh mà ứng dụng VPN hỗ trợ, và đó là phần người dùng hiếm khi kiểm tra. Một số ứng dụng khách khớp đường dẫn tệp thực thi, một số khớp định danh gói hoặc bundle, và một số khớp tên tiến trình mà hai tệp nhị phân không liên quan có thể chia sẻ. Đọc quy tắc trước danh sách tiến trình, vì quy tắc giới hạn cả những gì bạn có thể diễn đạt.
Vì vậy triệu chứng không phải “tunnel chia tách bị hỏng”. Mà là “quy tắc bao phủ một tiến trình không phải là tiến trình mang lưu lượng tôi quan tâm”, một phát biểu hẹp hơn nhiều và dễ sửa hơn nhiều. Khi bạn nói như vậy, bước tiếp theo không còn là phỏng đoán nữa.
Tìm tiến trình sở hữu kết nối của trận đấu
Khởi động trò chơi, vào một trận đấu, và xem ai sở hữu các socket thay vì nhìn những gì trên màn hình. Trên Windows, danh sách tiến trình cùng truy vấn socket cho từng tiến trình trả lời điều đó bằng hai lệnh:
Get-Process | Where-Object { $_.ProcessName -match 'launcher|game|client' } | Select-Object Id,ProcessName,Path
Get-NetTCPConnection -State Established | Select-Object OwningProcess,RemoteAddress,RemotePort | Sort-Object OwningProcess
Lệnh thứ hai in ra ID tiến trình, không phải tên, nên hãy nối hai đầu ra theo ID. Dòng bạn đang tìm là dòng có địa chỉ từ xa thuộc về dịch vụ trò chơi, và tiến trình sở hữu nó là tệp thực thi mà quy tắc của bạn phải nêu tên.
Trên Linux, cùng câu hỏi cần một lệnh cho mỗi loại socket, và đáng kiểm tra cả hai, vì kết nối của trận đấu có thể là UDP trong khi mọi thứ khác là TCP:
ss -tunp state established | grep -i game
ss -tunp | awk 'NR==1 || /udp/'
Nếu trò chơi chạy trong container hoặc lớp tương thích, tiến trình bạn tìm thấy có thể là một shim chứ không phải tệp nhị phân bạn đã cài. Trong trường hợp đó, định danh quan trọng là thứ ứng dụng khách nhìn thấy, có thể là đường dẫn của shim, và không lượng chỉnh sửa tệp gốc nào ảnh hưởng đến nó.
Khớp định danh mà ứng dụng khách của bạn hỗ trợ
Đọc tài liệu của ứng dụng khách về quy tắc loại trừ trước khi thêm bất cứ thứ gì. Ba mô hình phổ biến hoạt động khác nhau, và một trong số đó là bẫy.
| Identifier | How it behaves | Failure mode |
|---|---|---|
| Executable path | Matches exactly the file at that path | Breaks when an update moves the binary |
| Process name | Matches any binary with that name | Too broad; catches unrelated software |
| Package or bundle id | Matches a signed application group | May include services you did not intend |
Quy tắc đường dẫn là chính xác nhất và mong manh nhất. Một bản cập nhật trình khởi chạy di chuyển tệp thực thi để quy tắc trỏ đến một tệp không còn chạy nữa, và triệu chứng quay lại mà không có gì thay đổi rõ ràng. Quy tắc gói chịu được điều đó, và chúng cũng có thể âm thầm bao phủ các tiến trình trợ giúp mà bạn chưa từng nghĩ tới, điều này tiện lợi hoặc đáng lo tùy theo tiến trình trợ giúp.
Dù ứng dụng khách hỗ trợ gì, đừng thêm mục cho mọi tệp thực thi bạn tìm thấy. Một danh sách được lắp bằng thử và sai cho đến khi một phiên hoạt động thì không thể xem xét lại, và nó sẽ âm thầm tích lũy ngoại lệ cho phần mềm không liên quan. Nêu tên tiến trình bạn tìm thấy, và ghi lại nó dùng để làm gì.
Kiểm tra trên trận đấu, không phải trên bản tải xuống
Tốc độ tải xuống của trình khởi chạy là bài kiểm tra tệ nhất có thể, vì nó luyện đúng tiến trình đã bị loại trừ. Dùng thứ đã thất bại, và kiểm tra đường đi thay vì màn hình hiệu năng của chính trò chơi:
ip route get 203.0.113.55
Get-NetTCPConnection -State Established | Where-Object RemotePort -eq 27015
Lệnh đầu tiên cần địa chỉ mà máy chủ trận đấu đã phân giải, thứ mà nhật ký kết nối của trò chơi hoặc ứng dụng khách của bạn có thể cung cấp. Nếu tuyến nêu tên giao diện vật lý, quy tắc đang hoạt động. Lệnh thứ hai cho biết có phiên hay không, điều này tách “bị loại trừ nhưng máy chủ đang chết” khỏi “không bị loại trừ”.
Giữ cố định khu vực và mạng truy cập trong khi kiểm tra. Một trận đấu hạ cánh ở trung tâm dữ liệu khác nhau mỗi lần sẽ tạo ra các địa chỉ khác nhau, và bạn sẽ đuổi theo một mục tiêu di động thay vì xác thực một quy tắc. Hai lần chạy với cùng địa chỉ đáng giá hơn mười lần với địa chỉ khác nhau.
Kiểm tra lại sau bản cập nhật tiếp theo
Mọi quy tắc dựa trên đường dẫn đều có tuổi thọ được đo bằng chu kỳ vá. Khi trò chơi ngừng tôn trọng loại trừ sau một tháng, điều đầu tiên cần kiểm tra là tệp thực thi có di chuyển không, và điều thứ hai là có tiến trình trợ giúp mới xuất hiện bên cạnh nó không.
Mô hình loại trừ ứng dụng được một ứng dụng khách ghi lại là tài liệu tham khảo hợp lý cho cách mô tả các quy tắc này, dù chi tiết khác nhau giữa các sản phẩm. Đọc bản của bạn, ghi lại định danh bạn đã dùng, và ghi ngày. Chính bản ghi đó biến một điều bí ẩn thành bản sửa năm phút vào lần tới khi trình khởi chạy phát hành bản cập nhật.
Nếu ứng dụng khách đơn giản là không thể diễn đạt ranh giới bạn cần, một chính sách rộng hơn đã được phê duyệt tốt hơn một đống ngoại lệ không được ghi lại. Rộng và được hiểu thắng hẹp và sai, đặc biệt khi phiên bản hẹp là thứ mọi người tin rằng đang có hiệu lực.