Chuyển tiếp cổng trên hotspot Android: ba điểm vào
Điện thoại, đường đi của nhà mạng và lối ra VPN cho thấy những ranh giới khác nhau. Xác định máy nào sở hữu socket lắng nghe trước khi mở bất kỳ cổng nào.
Bạn bật hotspot, kết nối VPN, mở một cổng trong ứng dụng, và thiết bị kia vẫn không kết nối được. Phần còn thiếu gần như không bao giờ là bản thân cổng. Câu hỏi là máy nào sở hữu socket lắng nghe và thiết bị kia phải chạm tới địa chỉ nào. Tôi đi từ điện thoại ra ngoài, vì màn hình bạn đang đứng cho biết bạn thực sự đang kiểm tra điểm vào nào trong ba điểm.
Bắt đầu từ nơi dịch vụ thực sự chạy
Mở ứng dụng lẽ ra phải nhận kết nối và đọc trang trạng thái của chính nó. Nếu nó nói đang lắng nghe, hãy ghi lại địa chỉ mà nó đã gắn vào, vì chi tiết đó quyết định phần lớn các trường hợp bên dưới. Một ứng dụng gắn vào 127.0.0.1 chỉ chạm tới được từ chính điện thoại, và không client hotspot, ánh xạ nhà mạng hay lối ra VPN nào thay đổi điều đó.
Sau đó xác nhận thiết bị nào chạy dịch vụ. Đó là điện thoại, và khi đó socket thuộc ứng dụng, hoặc một laptop phía sau hotspot, và khi đó trình lắng nghe cùng tường lửa thuộc laptop còn điện thoại chỉ chuyển tiếp gói tin. Đây là những thiết kế khác nhau với chủ sở hữu khác nhau, và việc trộn chúng là lý do một cổng mở ở nơi này không làm gì ở nơi kia.
Trên bản dựng có thể gỡ lỗi, adb shell có thể liệt kê socket qua /proc/net/tcp, nhưng với hầu hết mọi người, trạng thái của chính ứng dụng là nguồn trung thực. Nó cũng tránh cái bẫy kiểm tra một socket mà ứng dụng mở trên địa chỉ bạn không ngờ tới.
Điểm vào thứ nhất: thiết bị khác trên hotspot
Đây là trường hợp cục bộ và dễ làm đúng nhất. Thiết bị kia chạm tới điện thoại ở địa chỉ nó thấy là gateway của mình, trên cổng mà ứng dụng lắng nghe, và không gì bên ngoài hotspot phải tham gia. Không cần ánh xạ nhà mạng và không cần tính năng nào của nhà cung cấp, vì lưu lượng không bao giờ rời khỏi phân đoạn cục bộ.
Hai điều phá hỏng nó. Ứng dụng gắn vào loopback, hoặc chính sách client trên điện thoại không cho phép kết nối cục bộ. Hãy kiểm tra bằng giao thức của chính ứng dụng thay vì một kết nối TCP trần nếu ứng dụng có xác thực, vì một trình lắng nghe chấp nhận rồi từ chối trông giống hệt một cổng đóng khi nhìn từ xa.
Nếu dịch vụ chạy trên laptop được nối với điện thoại, địa chỉ hotspot của điện thoại hoàn toàn không phải đích. Bạn cần địa chỉ của laptop trên giao diện hotspot và một trình lắng nghe trên laptop, và điện thoại không còn sở hữu gì ngoài việc chuyển tiếp.
Điểm vào thứ hai: đường đi của nhà mạng
Chạm tới điện thoại từ mạng di động là vấn đề khác, và phần lớn thời gian nó đơn giản không hoạt động với IPv4. Các nhà mạng đặt thiết bị sau phép dịch địa chỉ chia sẻ, đó là lý do RFC 6598 dành riêng một dải địa chỉ chia sẻ cho đúng cách bố trí đó. Một kết nối vào không được yêu cầu không có ánh xạ nào để đi qua, và không cấu hình cục bộ nào tạo ra được, vì bộ dịch không phải thiết bị của bạn.
Quyền root cũng không thay đổi điều đó. Nó cho bạn kiểm soát ngăn xếp của điện thoại, không phải bộ dịch của nhà mạng, và những công thức hứa ngược lại thường giả định một địa chỉ công cộng mà nhà mạng chưa bao giờ cấp. Ở nơi nhà mạng cung cấp tiền tố IPv6 công cộng, một đường vào có thể tồn tại, nhưng trình lắng nghe và tường lửa của điện thoại vẫn cần sự cho phép có chủ đích trước khi bất cứ thứ gì trả lời.
Điểm vào thứ ba: lối ra VPN
Địa chỉ mà một trang web báo cáo khi đường hầm đang hoạt động là địa chỉ của lối ra cho lưu lượng đi ra được bao phủ. Đó không phải là địa chỉ chấp nhận kết nối vào thay bạn. Dùng nó cho chiều vào đòi hỏi một tính năng mà nhà cung cấp thực sự cung cấp, chẳng hạn cổng được chuyển tiếp hoặc ánh xạ vào gắn với tài khoản của bạn, cùng một đường đi dùng được từ lối ra tới client.
Một quy tắc cho phép cục bộ không thể tạo ra ánh xạ đó. Điều nó có thể làm là thay đổi đường đi của các phản hồi từ ứng dụng, và điều này quan trọng khi ứng dụng bị loại trừ khỏi đường hầm: yêu cầu và phản hồi có thể kết thúc trong các ngữ cảnh mạng khác nhau, và kết nối thất bại theo cách trông như vấn đề tường lửa.
Kiểm tra một đường đi từ đầu đến cuối, rồi gọi tên chủ sở hữu
Ghi bộ bốn giá trị trước khi kiểm tra: nguồn dự định, địa chỉ đích, giao vận, cổng và máy sở hữu socket lắng nghe. Nếu bất kỳ thành phần nào là phỏng đoán, bài kiểm tra sẽ không cho bạn biết gì hữu ích, và cuối cùng bạn sẽ thay đổi lớp thứ hai để giải thích lớp thứ nhất.
Sau đó kiểm tra đúng một đường đi được cho phép với xác thực của ứng dụng còn nguyên. Tránh công bố một trình lắng nghe rộng hoặc tắt các kiểm soát không liên quan chỉ để một phép kiểm tra địa chỉ công cộng mơ hồ có câu trả lời, vì cả hai thay đổi đều sống lâu hơn bài kiểm tra và không cái nào chứng minh thiết kế hoạt động.
Hệ thống con tethering của Android chuyển tiếp lưu lượng xuống theo đường riêng của nó, tách khỏi việc bắt VPN thông thường của ứng dụng, nên một trình duyệt chạy được trên laptop được nối không nói gì về truy cập vào một dịch vụ trên điện thoại. Trước khi gọi là hoạt động:
- Socket lắng nghe nằm trên địa chỉ mà đối tác dự định chạm tới được, không phải loopback.
- Đối tác đang dùng địa chỉ thuộc điểm vào đó, không phải địa chỉ lối ra từ trang trạng thái.
- Mọi ánh xạ phía nhà mạng hoặc nhà cung cấp là tính năng được hỗ trợ, không phải quy tắc bạn thêm cục bộ.
- Yêu cầu và phản hồi đi qua cùng một ngữ cảnh mạng, và xác thực của ứng dụng vẫn qua.