streamflow/docs/VPN_TEST_GUIDE.md

223 lines
5.2 KiB
Markdown
Raw Permalink Normal View History

# VPN Fix - Quick Testing Guide
## 1. Rebuild the Container
```bash
cd /home/iulian/projects/tv
docker-compose down
docker-compose build --no-cache
docker-compose up -d
```
## 2. Test VPN Connection
### From Web UI:
1. Navigate to **Settings → VPN**
2. Enter your ProtonVPN credentials:
- Username: `your-protonvpn-username`
- Password: `your-protonvpn-password`
3. Click **"Save Settings"**
4. Select a country (e.g., United States)
5. Click **"Connect to [Country]"**
6. Wait for "VPN Connected" message
7. Click **"Check IP"** button
8. Verify the results:
- ✓ Public IP is different from your real IP
- ✓ Location shows VPN country
- ✓ ISP contains "Proton" or VPN-related text
- ✓ DNS servers show `10.2.0.1, 10.2.0.2`
- ✓ VPN Interface badge shows "Active" (green)
### From Command Line (Inside Container):
```bash
# Enter the container
docker exec -it streamflow bash
# Run the test script
./scripts/test-vpn.sh
# Or manual tests:
# Check VPN interface
ip addr show tun0
# Check your public IP
curl https://api.ipify.org
# Check DNS
cat /etc/resolv.conf
# Check routing
ip route | grep default
```
## 3. API Testing
### Check IP Address
```bash
# Get your auth token first from browser DevTools (Application → Local Storage)
TOKEN="your-jwt-token"
# Check current IP
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:12345/api/vpn/check-ip | jq
```
Expected output:
```json
{
"publicIp": "X.X.X.X",
"ipInfo": {
"ip": "X.X.X.X",
"city": "...",
"country": "US",
"org": "AS... ProtonVPN..."
},
"dnsServers": ["10.2.0.1", "10.2.0.2"],
"vpnInterfaceActive": true
}
```
### Run Full Diagnostics
```bash
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:12345/api/vpn/diagnostics | jq
```
## 4. Expected Behavior
### BEFORE FIX (Broken):
- ❌ Real IP visible after VPN connect
- ❌ DNS servers: 8.8.8.8, 1.1.1.1 (public DNS)
- ❌ ISP shows your real ISP
- ❌ Location shows your real location
### AFTER FIX (Working):
- ✅ VPN IP visible (different from real IP)
- ✅ DNS servers: 10.2.0.1, 10.2.0.2 (ProtonVPN DNS)
- ✅ ISP shows ProtonVPN or similar
- ✅ Location shows VPN country
- ✅ VPN interface (tun0) active
- ✅ Default route goes through tun0
## 5. Troubleshooting
### VPN won't connect:
```bash
# Check backend logs
docker logs streamflow --tail 100
# Look for:
# - "[VPN] Successfully connected!"
# - "Initialization Sequence Completed"
```
### Connected but real IP still shows:
```bash
# Inside container
docker exec -it streamflow bash
# Check if tun0 exists
ip addr show tun0
# Check routing
ip route
# Should show: default via X.X.X.X dev tun0
```
### DNS Leak:
```bash
# Check DNS servers
docker exec -it streamflow cat /etc/resolv.conf
# Should show:
# nameserver 10.2.0.1
# nameserver 10.2.0.2
```
### Can't access container after VPN:
- Ensure ports are still mapped in docker-compose.yml
- Check if firewall is blocking incoming connections
- Try accessing from localhost vs external IP
## 6. Common Issues
| Issue | Solution |
|-------|----------|
| "VPN not configured" error | Save credentials first before connecting |
| Connection timeout | Try different country/server |
| Real IP still visible | Check logs, verify tun0 exists, restart VPN |
| DNS leak detected | Rebuild container to fix DNS script |
| No internet when VPN connected | Check OpenVPN logs, try different server |
| "NET_ADMIN capability" error | Add capabilities to docker-compose.yml |
## 7. Verify Changes Applied
### Check Dockerfile has updated DNS script:
```bash
grep -A 5 "Update DNS when VPN" Dockerfile
```
Should include the for loop to parse `foreign_option_*`
### Check vpn.js has kill switch:
```bash
grep -A 5 "setupFirewall" backend/routes/vpn.js
```
Should include iptables rules
### Check diagnostics utility exists:
```bash
ls -l backend/utils/vpnDiagnostics.js
```
Should exist and be readable
## 8. Before/After Comparison
Test the same command before and after connecting to VPN:
```bash
# Before VPN
curl https://api.ipify.org
# Output: Your real IP (e.g., 93.114.x.x)
# Connect VPN via UI
# After VPN
curl https://api.ipify.org
# Output: VPN IP (e.g., 185.159.x.x)
# Check location
curl https://ipinfo.io/$(curl -s https://api.ipify.org)/json | jq '.country'
# Should show VPN country code
```
## 9. Files Changed
Summary of modified files:
-`Dockerfile` - Fixed DNS script
-`backend/routes/vpn.js` - Added kill switch, verification, diagnostics
-`backend/utils/vpnDiagnostics.js` - NEW diagnostic utility
-`frontend/src/components/VPNSettings.jsx` - Added Check IP button
-`scripts/test-vpn.sh` - NEW test script
-`docs/VPN_TROUBLESHOOTING.md` - NEW troubleshooting guide
-`VPN_FIX_SUMMARY.md` - NEW summary document
## 10. Success Criteria
VPN is working correctly when:
- [x] VPN connects without errors
- [x] Public IP is VPN IP (not real IP)
- [x] Location matches VPN country
- [x] DNS servers are ProtonVPN DNS
- [x] VPN interface (tun0) is active
- [x] All traffic routes through tun0
- [x] Streaming works through VPN
- [x] No DNS leaks
- [x] Kill switch active (traffic blocked if VPN drops)
---
**Need help?** See `docs/VPN_TROUBLESHOOTING.md` for detailed troubleshooting steps.