223 lines
5.2 KiB
Markdown
223 lines
5.2 KiB
Markdown
|
|
# 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.
|