การแจ้งเตือนแบบพุชบน Android ไม่ทำงานเมื่อใช้ VPN? ตรวจสอบสิ่งเหล่านี้
FCM รักษาการเชื่อมต่อขาออกของตัวเองบนพอร์ต 5228-5230 ตรวจสอบกฎพร็อกซี เวลาหมดอายุ NAT และการข้าม VPN ก่อนแตะการตั้งค่าการแจ้งเตือน
การแจ้งเตือนหยุดมาถึงบนโทรศัพท์ที่ยังคงท่องเว็บผ่าน VPN ขององค์กรได้ดี เว็บโหลดได้ แอปเปิดได้ และข้อความจะปรากฏเฉพาะที่บ้านหรือหลังจากปิดอุโมงค์ สำหรับแอปที่สร้างบน Firebase Cloud Messaging ช่องทางพุชคือการเชื่อมต่อขาออกแยกต่างหากที่มีอายุยาวนาน ไม่ใช่เส้นทาง HTTPS ที่เบราว์เซอร์เพิ่งพิสูจน์ ไล่ตรวจสอบเหล่านี้ตามลำดับและหยุดที่ข้อแรกที่ล้มเหลว
ยืนยันว่าแอปใช้ FCM จริง
ไม่ใช่ทุกการแจ้งเตือนจะเป็นพุช บางอย่างแอปตั้งเวลาไว้ในเครื่อง บางอย่างถูกดึงผ่าน HTTPS และบางอย่างมาจากช่องทางของผู้ให้บริการที่ไม่มีส่วนเกี่ยวข้องกับ Firebase หากแมนนิเฟสต์และ dependencies ของแอปมี Firebase Messaging การแจ้งเตือนมักเดินทางผ่านการเชื่อมต่อ FCM และไลบรารีไคลเอนต์บันทึกการลงทะเบียนภายใต้แท็กที่คาดเดาได้
adb logcat -s FirebaseMessaging:V
adb shell dumpsys package <package> | grep -i firebase
โทเค็นการลงทะเบียนในล็อกยืนยันการขนส่ง หากไม่มี แสดงว่าคุณกำลังดีบักไปป์ไลน์การแจ้งเตือนระดับแอป และการแก้ไฟร์วอลล์จะไม่ช่วย ความแตกต่างนี้สำคัญเพราะข้อความที่ส่งถึงแต่ไม่เคยแสดงและข้อความที่ไม่เคยมาถึงดูเหมือนกันสำหรับผู้ใช้
ตรวจสอบพอร์ตขาออก ไม่ใช่เว็บไซต์
การเชื่อมต่อของอุปกรณ์กับ FCM เป็น TCP ที่อุปกรณ์เป็นผู้เริ่มไปยังพอร์ต 5228 โดยมี 5229 และ 5230 เป็นทางเลือกสำรอง และ 443 เป็นทางสุดท้าย ไฟร์วอลล์ที่อนุญาต 443 สำหรับการท่องเว็บยังทำให้พุชเสียได้ และกฎที่อนุญาตโดเมน API ของแอปไม่ได้ครอบคลุมปลายทางการรับส่งข้อความซึ่งเป็นบริการแยกต่างหาก
นี่คือการเชื่อมต่อขาออกจากโทรศัพท์ คุณไม่ได้เผยแพร่พอร์ตขาเข้าบนอุปกรณ์หรือเกตเวย์ VPN ดังนั้นหากมีคนเสนอให้ทำพอร์ตฟอร์เวิร์ด การออกแบบก็ผิดตั้งแต่ต้นแล้ว เช่นเดียวกับกฎที่เปิดพอร์ตหนึ่งให้ทุกที่อยู่ในอินเทอร์เน็ต ควรจำกัดให้เฉพาะปลายทางที่บันทึกไว้
| Port | Role | What to verify |
|---|---|---|
| 5228 | Primary FCM connection | Outbound allowed and session state kept |
| 5229, 5230 | Fallback ports | Often missing from hand-written allowlists |
| 443 | Last-resort fallback | Works only if the client actually falls back |
| HTTP proxy | Not a supported FCM transport | Proxy exclusion or bypass, not a port rule |
คำแนะนำด้านเครือข่ายของ Firebase ยังระบุว่าโปรโตคอลการส่งของ FCM ไม่สามารถขนส่งผ่านพร็อกซี HTTP ทั่วไปได้ ดังนั้นการที่เบราว์เซอร์ทำงานผ่านพร็อกซีเว็บขององค์กรจึงไม่ได้พิสูจน์อะไรเกี่ยวกับซ็อกเก็ตพุช ทั้งสองเป็นไคลเอนต์ต่างกันที่มีเส้นทางต่างกัน
ตรวจสอบเวลาหมดอายุขณะว่างที่ฆ่าซ็อกเก็ต
การเชื่อมต่อ FCM เปิดค้างไว้ระหว่างข้อความ ทำให้ไวต่อเวลาหมดอายุของ NAT และการตรวจสอบสถานะ คำแนะนำของ Firebase ขอให้ทนต่อการว่างอย่างน้อย 30 นาทีในที่ที่มีนโยบายดังกล่าว เวลาหมดอายุเซสชันห้านาทีจะลบแมปปิ้งอย่างเงียบ ๆ และโทรศัพท์จะเชื่อมต่อใหม่เมื่อมีสิ่งใดปลุกเท่านั้น ข้อความจึงมาทีละระลอกหรือไม่มาเลย
อ่านตารางเซสชันบนไฟร์วอลล์หรือเกตเวย์ VPN แล้วหาการเชื่อมต่อของโทรศัพท์ไปยัง 5228-5230 เปรียบเทียบอายุที่เหลือกับค่าที่บันทึกไว้ หากสั้นกว่า ให้เพิ่มเวลาหมดอายุสำหรับพอร์ตเหล่านั้นแทนการเปลี่ยนนโยบายทั้งหมดบนอุปกรณ์ เพราะการเปลี่ยนเวลาหมดอายุแบบทั่วโลกนั้นยากที่จะให้เหตุผลและยากกว่าที่จะย้อนกลับ
การส่งพุชยังขึ้นอยู่กับว่าแมปปิ้งปลายทางอยู่รอดจากการโรมมิ่งระหว่าง Wi-Fi และเครือข่ายมือถือ แมปปิ้งที่ผูกกับอินเทอร์เฟซเดียวอาจถูกทิ้งเมื่อส่งต่อแม้ทั้งสองเครือข่ายอนุญาตพอร์ต
ตัดสินใจว่าการข้าม VPN เป็นที่ยอมรับได้หรือไม่
ไคลเอนต์ VPN บน Android สามารถอนุญาตให้ทราฟฟิกข้ามอุโมงค์ได้ และ FCM อาจใช้เครือข่ายที่อยู่ใต้เมื่ออนุญาตการข้ามนั้น ในกรณีนั้นช่องทางพุชยังคงเข้ารหัสอยู่ แต่ไม่ได้พาแอดเดรสของอุโมงค์อีกต่อไป การปิดบัง IP ของ VPN จึงไม่ใช้กับช่องทางนี้ เป็นการแลกเปลี่ยนเชิงนโยบาย ไม่ใช่ความผิดปกติ
หากนโยบายของคุณห้ามการข้าม เส้นทางอุโมงค์ต้องขนการเชื่อมต่อไว้: เปิดพอร์ต เวลาหมดอายุยาวพอ และพร็อกซีไม่ขวางทาง อย่าตัดบริการที่จัดการออกอย่างเงียบ ๆ และอย่าผ่อนล็อกเพียงเพราะการแจ้งเตือนทำงานบนเครือข่ายที่ไม่ได้จัดการ ไอคอน VPN ไม่ได้บอกว่าบริการใดเลือกเส้นทางใด
แยกการส่งออกจากการแสดงผล แล้วทดสอบเพียงครั้งเดียว
สิทธิ์ การตั้งค่าช่องทาง ห้ามรบกวน และสวิตช์ต่อแอปเป็นตัวกำหนดว่าจะแสดงข้อความที่ส่งถึงหรือไม่ บน Android 13 และใหม่กว่า สิทธิ์การแจ้งเตือนเป็นการให้สิทธิ์ขณะรัน และการให้สิทธิ์ที่ถูกปฏิเสธทำให้เกิดความเงียบที่ดูเหมือนพอร์ตถูกบล็อกทุกประการ ข้อความที่มาถึงแต่ไม่แสดงเป็นปัญหาเรื่องการนำเสนอ ควรจัดการแยก
ทำการทดสอบแบบควบคุมหนึ่งครั้งแทนการส่งข้อความตามอำเภอใจ คงอุปกรณ์ บัญชี และแอปให้เหมือนเดิม ส่งข้อความเดียวที่มีการประทับเวลาที่รู้ แล้วเปรียบเทียบสภาวะ VPN กับเครือข่ายที่ไม่ใช้ VPN ที่อนุมัติแล้ว บันทึกเวลารับใน logcat และเวลาแสดงสำหรับแต่ละรอบ หากการส่งต่างกันแต่การแสดงไม่ต่าง แสดงว่าเส้นทางเครือข่ายเป็นตัวแปร หากทั้งสองเหมือนกัน ให้ดูที่แอปต่อไป
มอบพอร์ต ข้อจำกัดของพร็อกซี เวลาหมดอายุที่วัดได้ และการตัดสินใจเรื่องการข้ามให้เจ้าของเครือข่ายในบันทึกเดียว «ปิด VPN» ไม่ใช่ข้อค้นพบ และการอนุญาตทราฟฟิก Google ทั้งหมดไม่ใช่การแก้ไขที่จำกัดขอบเขต