Chiếm quyền luồng RTMP của PS5: Cách một lập trình viên tự tạo máy chủ Twitch giả để phát game lên Discord
Một lập trình viên đã tìm ra cách chặn luồng phát trực tiếp RTMP của PS5 bằng kỹ thuật DNS giả mạo, biến máy Mac của mình thành máy chủ Twitch giả để phát game lên Discord mà không cần card capture đắt tiền. Giải pháp kết hợp dnsmasq, nginx-rtmp và mpv, mở ra hướng đi mới cho những ai muốn tự do hơn với hệ sinh thái khép kín của Sony.

Sony ngày càng siết chặt những gì bạn có thể làm với phần cứng PS5. Phát trực tiếp là một ví dụ điển hình: máy console cung cấp nút "Broadcast" tiện lợi, nhưng ngay khi bạn muốn làm bất cứ điều gì nằm ngoài vài dịch vụ mà Sony hỗ trợ, mọi thứ trở nên cực kỳ khó chịu. Thiết bị Bluetooth bên thứ ba cũng chung số phận khi Sony khóa chặt ngăn xếp không dây cho phụ kiện của riêng họ.
Vấn đề: Phát game lên Discord từ PS5
Nhiều game thủ thường phát trực tiếp game cho bạn bè xem qua Discord, nhưng PS5 lại không hỗ trợ chia sẻ màn hình lên nền tảng này. Giải pháp hiển nhiên là dùng card capture — cắm đầu ra HDMI vào card, đưa vào OBS trên máy Mac rồi phát từ đó. Nhưng card capture chất lượng tốt không hề rẻ, và không phải ai cũng muốn chi hơn 100 USD chỉ để phục vụ nhu cầu này.
Sơ đồ minh họa luồng phát trực tiếp từ PS5 qua DNS giả mạo đến máy Mac
Remote Play và những hạn chế
Remote Play phần nào giải quyết được vấn đề. Bạn có thể kết nối PS5 với MacBook, chia sẻ màn hình Mac lên Discord và chơi từ đó. Tuy nhiên, bạn phải kết nối mọi thứ vào thiết bị Remote Play: tay cầm, tai nghe, v.v. Đôi khi còn gặp độ trễ đầu vào, và chất lượng luồng hoàn toàn do PS5 kiểm soát — bạn không thể tùy chỉnh bất cứ thứ gì. Việc phải thay đổi thiết lập vật lý mỗi lần muốn phát trực tiếp là điều không ai mong muốn.
PS5 phát trực tiếp như thế nào?
PS5 hỗ trợ phát trực tiếp lên YouTube và Twitch theo mặc định nếu bạn đã đăng nhập vào các tài khoản đó. Giao thức được sử dụng là RTMP (Real-Time Messaging Protocol), vốn phổ biến cho phát trực tiếp âm thanh và video.
Ý tưởng đặt ra: liệu chúng ta có thể biến thiết bị của mình thành Twitch và nhận luồng RTMP đó thay vì Twitch thật? Điểm mấu chốt là PS5 không hardcode địa chỉ IP của Twitch mà tra cứu qua DNS mỗi lần phát. Nếu kiểm soát được DNS trả về gì, chúng ta kiểm soát được luồng đi đâu.
Truy tìm hostname thật sự
Nỗ lực đầu tiên là giả mạo trực tiếp ingest.twitch.tv. Nghe có vẻ hợp lý vì đó là hostname PS5 phân giải khi bạn nhấn broadcast. Nhưng không đơn giản như vậy: ingest.twitch.tv:443 thực chất là endpoint khám phá, không phải máy chủ RTMP. PS5 gọi HTTPS đến đó để hỏi "tôi nên dùng máy chủ ingest vùng nào?", Twitch trả lời bằng một địa chỉ như ap-southeast-1.prod.fi.contribute.live-video.net. Sau đó PS5 mới đẩy luồng thật đến đó.
Giả mạo hostname đó lại vướng vấn đề khác: máy chủ ingest thật của Twitch dùng RTMPS (RTMP qua TLS trên cổng 443), và PS5 kiểm tra chứng chỉ dựa trên các CA tin cậy. Chứng chỉ tự ký không hoạt động, mà bạn cũng không có cách nào cài CA tùy chỉnh lên PS5.
Chuyển sang YouTube như giải pháp tạm: máy chủ RTMP của YouTube dùng RTMP thuần trên cổng 1935 không có TLS, nên luồng truyền qua ổn. Nhưng PS5 dừng phát sau khoảng 60 giây vì nó định kỳ kiểm tra API của YouTube để xác nhận luồng đang thực sự phát. Vì chúng ta chặn luồng, YouTube không hề thấy gì, API trả về rỗng và PS5 bỏ cuộc.
Bước ngoặt đến từ việc theo dõi nhật ký DNS trong lúc phát:
sudo tail -f /tmp/dnsmasq.log
# Sep 22 23:20:28 dnsmasq: query[A] ingest.global-contribute.live-video.net from 192.168.8.171
# Sep 22 23:20:28 dnsmasq: reply aps30.contribute.live-video.net is 35.55.13.0
PS5 đang phân giải ingest.global-contribute.live-video.net, chuỗi này dẫn đến aps30.contribute.live-video.net — đó mới là máy chủ RTMP thật. Giả mạo contribute.live-video.net sẽ bao phủ mọi tên miền con và chuyển hướng luồng thật về máy Mac mà không gặp vấn đề chứng chỉ.
Thủ thuật DNS: Biến máy Mac thành Twitch
Thiết lập gồm hai phần chính: dnsmasq và nginx-rtmp. Tác giả đã xây dựng một ứng dụng menu bar nhỏ trên macOS để đóng gói và quản lý cả hai.
Chạy dnsmasq trên máy Mac và cấu hình để phân giải các tên miền ingest của Twitch về địa chỉ LAN của máy:
server=1.1.1.1
server=8.8.8.8
# Redirect Twitch ingest traffic to the Mac
address=/contribute.live-video.net/192.168.8.175
address=/ingest.global-contribute.live-video.net/192.168.8.175
address=/live.twitch.tv/192.168.8.175
address=/live-sin.twitch.tv/192.168.8.175
address=/live-nrt.twitch.tv/192.168.8.175
address=/live-syd.twitch.tv/192.168.8.175
address=/live-fra.twitch.tv/192.168.8.175
address=/live-ams.twitch.tv/192.168.8.175
address=/live-lhr.twitch.tv/192.168.8.175
address=/live-jfk.twitch.tv/192.168.8.175
address=/live-lax.twitch.tv/192.168.8.175
address=/live-sea.twitch.tv/192.168.8.175
log-queries
log-facility=/tmp/dnsmasq.log
no-hosts
listen-address=0.0.0.0
192.168.8.175 là IP máy Mac. Khi PS5 hỏi DNS về một trong các endpoint Twitch này, dnsmasq trả về IP máy Mac. PS5 kết nối đến máy Mac với suy nghĩ đó là Twitch.
Phần cuối là trỏ PS5 vào máy chủ DNS này. Với router GL.iNet chạy OpenWRT, bạn có thể cấu hình để cấp IP máy Mac làm máy chủ DNS riêng cho lease DHCP của PS5:
# SSH into the router and run:
uci add_list dhcp.lan.dhcp_option="tag:PS5,6,192.168.8.175"
uci commit dhcp
/etc/init.d/dnsmasq restart
Phần tag:PS5 hoạt động vì lease tĩnh của PS5 đã có tag đó trong /etc/config/dhcp. Tùy chọn 6 là tùy chọn DHCP cho máy chủ DNS. PS5 sẽ nhận cấu hình này ở lần gia hạn DHCP tiếp theo, không cần cấu hình DNS thủ công trên máy console.
Nhận luồng bằng nginx-rtmp
Để nhận luồng, tác giả dùng nginx-rtmp:
worker_processes 1;
error_log /tmp/nginx-error.log warn;
pid /tmp/nginx.pid;
events {
worker_connections 512;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application ps5 {
live on;
record off;
sync 10ms;
# Notify our app when a stream starts
on_publish http://127.0.0.1:9988/on_publish;
}
}
}
http {
server {
listen 8080;
location /stat {
rtmp_stat all;
}
}
}
Callback on_publish là cách ứng dụng menu bar phát hiện khi PS5 bắt đầu phát. nginx gửi POST đến localhost:9988 kèm tên luồng, ứng dụng hiển thị URL RTMP đầy đủ sẵn sàng để sao chép.
Lúc này, PS5 đang đẩy luồng (1080p60, H.264, AAC stereo) trực tiếp đến máy Mac thay vì Twitch. Từ đây, bạn có thể kéo luồng vào bất cứ thứ gì: OBS để phát lại, ghi cục bộ, hoặc phát trực tiếp.
Sơ đồ cấu trúc nginx-rtmp nhận luồng từ PS5
Xem luồng và chia sẻ lên Discord
Thay vì đi qua OBS, tác giả dùng mpv để kéo luồng và chia sẻ cửa sổ lên Discord. Profile độ trễ thấp giữ độ trễ dưới một giây:
mpv --profile=low-latency --audio-buffer=0.3 rtmp://127.0.0.1/ps5/stream-key
Đáng ngạc nhiên là cách này khá ổn định. Tác giả đã dùng vài tuần và chưa gặp vấn đề gì. Toàn bộ mã nguồn có thể tìm thấy trên trang cá nhân của tác giả.
Ý nghĩa với người dùng Việt Nam
Giải pháp này đặc biệt hấp dẫn với game thủ Việt Nam, những người thường phát game cho bạn bè qua Discord hoặc các nền tảng ít chính thức. Thay vì bỏ ra vài triệu đồng cho card capture, bạn có thể tận dụng một chiếc máy tính cũ làm máy chủ trung gian, kết hợp router có hỗ trợ OpenWRT — vốn phổ biến và giá rẻ tại thị trường trong nước.
Sơ đồ tổng quan hệ thống chặn và chuyển hướng luồng RTMP của PS5
Điều thú vị hơn là kỹ thuật này phơi bày một lỗ hổng kiến trúc trong cách Sony thiết kế tính năng phát trực tiếp: PS5 hoàn toàn tin tưởng DNS mà không có cơ chế xác thực bổ sung nào. Đây là bài học quen thuộc trong bảo mật — không bao giờ tin tưởng hoàn toàn hạ tầng phân giải tên miền — nhưng các hãng console vẫn thường bỏ qua.
Với cộng đồng yêu thích vọc vạch và tự do phần cứng, đây là minh chứng rằng ngay cả những hệ sinh thái khép kín nhất vẫn có kẽ hở cho sự sáng tạo.