Contents

How to Stream Netflix & Disney+ on a VPS That Can’t Unlock Full Episodes — Xray + Cloudflare Warp

TL;DR: If your VPS can’t reliably unlock full episodes on Netflix or Disney+, you can route streaming into Cloudflare Warp using Xray ≥1.6.5 WireGuard outbound. This provides a clean, cost-effective exit path that often improves unblocking success compared with direct VPS exit IPs. Tested on Debian 12.9 with a DMIT LAX.EB.INTRO VPS. Includes wgcf setup, Xray JSON snippets, routing rules, cron updates for geosite.dat/geoip.dat, validation, and troubleshooting.


Why this approach

  • Streaming-focused: Many budget VPS IPs are flagged by streaming providers. Warp provides “clean” exit IPs that can improve success when unblocking Netflix and Disney+.
  • Security: Routing sensitive return traffic through Warp reduces exposure to interception on transit nodes.
  • Cost & simplicity: Instead of buying specialized unblock VPSes, use Warp (free option) plus Xray’s WireGuard outbound to centralize routing and keep costs down.
  • Maintainability: With geosite.dat/geoip.dat and Xray routing, you get flexible, updatable domain/IP controls.

This is not guaranteed to bypass every provider’s detection. Always test individual services and respect their Terms of Service.


Quick component map

Component Purpose Example / Path
wgcf Generate Warp WireGuard profile & keys /usr/local/bin/wgcf
Xray (≥1.6.5) Proxy + WireGuard outbound /etc/xray/config.json
geosite.dat / geoip.dat Domain/IP groups used by routing rules /etc/xray/geosite.dat
Cron Keep geosite/geoip fresh 0 0 * * *
Validation Confirm outboundTag in Xray logs /var/log/xray/access.log

1. Prerequisites

  • Debian 12.9 VPS (example: DMIT LAX.EB.INTRO 1C/1G/10GB/500GB @ 1Gbps)
  • Xray version ≥1.6.5
  • curl, systemd, basic shell tools
  • Basic WireGuard key familiarity

2. Install wgcf (Warp client helper)

wgcf registers and generates a WireGuard profile for Warp.

# download wgcf binary and make executable
curl -Lo /usr/local/bin/wgcf \
  https://github.com/ViRb3/wgcf/releases/download/v2.2.29/wgcf_2.2.29_linux_amd64
chmod +x /usr/local/bin/wgcf

# register and generate wg profile (interactive)
wgcf register
wgcf generate
# expect a generated wgcf-profile.conf with keys and endpoint info

Security: Treat generated keys as secrets. Use secretKey (private) in Xray and publicKey (peer) as needed.


3. Xray WireGuard outbound (server)

Add a WireGuard outbound to /etc/xray/config.json. Replace placeholders with your keys.

{
  "outbounds": [
    {
      "protocol": "wireguard",
      "settings": {
        "secretKey": "<YOUR_PRIVATE_KEY>",
        "address": [
          "172.16.0.2/32",
          "2606:4700:110:8949:fed8:2642:a640:c8e1/128"
        ],
        "peers": [
          {
            "publicKey": "<WARP_PUBLIC_KEY>",
            "endpoint": "engage.cloudflareclient.com:2408"
          }
        ],
        "reserved": [0, 0, 0]
      },
      "tag": "wireguard-warp"
    }

    /* other outbounds as needed */
  ]
}

Notes:

  • secretKey: your WireGuard private key (from wgcf generate).
  • publicKey: Warp peer public key (from profile).
  • endpoint: commonly engage.cloudflareclient.com:2408.

Use domainStrategy: "IPIfNonMatch" and force streaming domains/geoip groups to wireguard-warp.

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": [
          "reddit.com",
          "geosite:cn",
          "geosite:disney",
          "geosite:netflix",
          "geosite:cloudflare"
        ],
        "outboundTag": "wireguard-warp"
      },
      {
        "type": "field",
        "ip": [
          "geoip:cn",
          "geoip:cloudflare",
          "geoip:cloudfront",
          "geoip:netflix"
        ],
        "outboundTag": "wireguard-warp"
      }
    ]
  }
}

Tip: geosite groups (e.g., geosite:netflix) reduce maintenance overhead vs enumerating CDN hosts.


5. Keep geosite.dat / geoip.dat updated

Schedule a daily updater to avoid stale rules and false positives.

cat >/usr/local/bin/update-xray-dat <<'EOF'
#!/bin/bash
set -e
DST="/usr/local/bin"
mkdir -p "$DST"
curl -fsSL -o "$DST/geosite.dat" \
  "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"
curl -fsSL -o "$DST/geoip.dat" \
  "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat"
EOF
chmod +x /usr/local/bin/update-xray-dat

# add cron job (crontab -e)
0 0 * * * /usr/local/bin/update-xray-dat >/dev/null 2>&1

6. Deploy & validate

1. Restart Xray:

sudo systemctl restart xray

2. From a client behind your Xray server, test streaming sites (Netflix, Disney+). Confirm the public IP is a Warp IP:

curl ifconfig.me
# or
curl ipinfo.io/ip

3. Verify Xray access logs show the wireguard-warp tag:

# watch Xray access.log for wireguard-warp entries
sudo tail -f /var/log/xray/access.log | grep '"outboundTag":"wireguard-warp"'

If streaming requests appear with the wireguard-warp tag, traffic is being routed through Warp.


7. Troubleshooting checklist

  • No WireGuard handshake / no traffic

    • Verify keys (no extra whitespace).
    • Ensure UDP port 2408 (endpoint) is reachable.
  • Traffic not hitting Warp

    • Confirm rule ordering — earlier rules may preempt.
    • Ensure geosite.dat/geoip.dat are readable and current.
  • Streaming still blocked

    • Providers evolve detection—test different geosite groups and CDN IPs.
    • Try different Warp exit points (Cloudflare decides exit location).
  • Debugging

    • Increase Xray loglevel to debug temporarily:
    {
      "log": {
        "access": "/var/log/xray/access.log",
        "error": "/var/log/xray/error.log",
        "loglevel": "debug"
      }
    }

8. Security & operational notes

  • Do not commit Warp keys or config files to public repos.
  • Monitor performance; streaming-heavy traffic via Warp can trigger provider-side limits.
  • Periodically update Xray and wgcf for security and compatibility.
  • Respect streaming services’ Terms of Service.