VPN by Google One und Simple DNSCrypt

Tyler

Komplett-PC-Aufrüster(in)
Hallöchen!

Das Thema "Sinnhaftigkeit der Nutzung von Google-Services für eine VPN-Verbindung" soll hier nicht Gegenstand der Betrachtung sein; das darf jeder mit sich selbst ausmachen. Meine Haltung dazu hier.

Zum Thema:
Beim Verbinden mit "VPN by Google One" (Windows App) erhält man keinen DNS-Server für die Verbindung. Somit werden DNS-Anfragen unverschlüsselt an den DNS-Server der Ethernet/WLAN-Verbindung gesendet, was ich unterbinden möchte. Die Lösung wäre neben der Nutzung von "DNS über HTTPS" im Browser, den Dienst "dnscrypt-proxy" mit "Simple DNSCrypt" zu verwenden.

Nun folgendes Problem in Verbindung mit Googles VPN:
"VPN by Google One" stellt offenbar keine Verbindung her, wenn DNS-Server genutzt werden, die DNSCrypt oder DNS-over-HTTPS (DoH) nutzen.

Hintergund:
Durch "Simple DNSCrypt" wird 127.0.0.1 als DNS auf der aktiven Schnittstelle gesetzt und mittels dem lokalen Dienst "dnscrypt-proxy" die DNS-Resolver genutzt, die in Simple DNSCrypt ausgewählt sind. Google VPN stellt mit dieser Einstellung keine VPN-Verbindung her:
1 - kein VPN mit dnscrypt.png

Alle andere Windows-Anwendungen nutzen die DNS-Server hier mittels dnscrypt-proxy aber problemlos.
Wenn man aber bspw. 8.8.8.8 als DNS auf der aktiven Schnittstelle setzt, verbindet sich Google-VPN jedoch problemlos:
2 - VPN ohne dnscrypt.png

Sobald Google-VPN verbunden ist, kann auch dnscrypt-proxy wieder aktiviert werden (dnscrypt-proxy starten und 127.0.0.1 auf die aktive Schnittstelle setzen). Google-VPN läuft dann auch normal weiter, verliert die Verbindung nicht und kann mit Wireshark nachvollzogen werden:
3 - dnscrypt nach VPN-Verbindung.png

Google-VPN verbindet also initial nur dann, wenn keine DNS-Server verwendet werden, die DNSCrypt oder DoH nutzen.

Warum ist das problematisch?
Insbesondere deshalb, da Google VPN bei Systemstart verbinden soll. Da nach jeder Windows-Sitzung, in der dnscrypt-proxy genutzt wurde, 127.0.0.1 auf der aktiven Schnittstelle gesetzt ist, verbindet sich Google VPN aber nicht. Der DNS-Server muss auf der Schnittstelle von 127.0.0.1 kurz auf bspw. 8.8.8.8 gesetzt werden muss, damit sich Google-VPN verbinden kann.
Durch dieses Verhalten von Google-VPN habe ich den Dienst dnscrypt-proxy auf Starten: Manuell gesetzt und ich muss bei jeder Nutzeranmeldung den DNS-Server auf der aktiven Schnittstelle auf 8.8.8.8 zurücksetzen mit folgendem Powershell-Script:

if ((Get-DnsClientServerAddress -InterfaceAlias "*WLAN*").ServerAddresses -like "127.*") { Set-DnsClientServerAddress -InterfaceAlias "*WLAN*" -ServerAddresses ("8.8.8.8","9.9.9.9") }

Dadurch kann sich Google-VPN bei Systemstart verbinden, aber dnscrypt-proxy muss zur Nutzung immer manuell gestartet und 127.0.0.1 muss wieder als DNS gesetzt werden.
Vielleicht gibt es eine Möglichkeit, mittels Powershell herauszufinden, ob VPN by Google One verbunden ist? Wenn das passiert ist, könnte man dnscrypt-proxy per Script starten und den DNS auf 127.0.0.1 setzen.

Die grundsätzliche Frage, weshalb sich Google-VPN nicht verbinden kann, während man DNSCrypt oder DNS-over-HTTPS nutzt, bleibt aber.
Am trivialsten wäre es, wenn Google VPN auch DoH-Server bereitstellen würde. Dass das nicht im Sinne Googles ist, ist klar.

Ich habe mit dem Google-Support gechattet. Nach kurzem Hin-und-her und weiterreichen an "die Experten", sollte ich das Feedback-Formular nebst Screenshots für dieses Problem nutzen und auf die Chat-Referenznummer verweisen. Bisher ohne Antwort.
 
Zuletzt bearbeitet:
Da alle Kommunikation mit Google keine Lösung bracht, habe ich mir ein PowerShell-Script gebaut, dass bei Anmeldung des Nutzers ausgeführt wird und alles regelt. Vielleicht hilft's ja jemandem, der dasselbe Problem hat.

Die GUI zeigt an, welche DNS-Server auf der Schnittstelle mit Namen *WLAN* gesetzt sind, den Status des Service "dnscrypt-proxy" und den Status des VPN-Tunnels.

Die GUI zeigt einen Status-Check von: DNSCrypt Service "dnscrypt-proxy", VPN Tunnel Connection und gesetzte DNS-Server auf der Schnittstelle mit Namen *WLAN*. Das Script setzt beim Anmelden 8.8.8.8 und 9.9.9.9 als DNS bei Schnittstelle *WLAN* (notwendig für VPN-Verbindung), wenn dort 127.* gesetzt ist und VPN nicht "up" ist. Nach Setzen von 8.8.8.8 UND wenn VPN "up" ist, wird wieder 127.0.0.1 als DNS bei Schnittstelle WLAN gesetzt, um DNSCrypt zu nutzen.

Im Aufgabenplaner bei Anmeldung erstellen und als Aktion "Programm starten" wählen, "powershell" als Programm eintragen und als Argumente: -windowstyle hidden -File C:\Windows\check-vpn.ps1

"Mit höchsten Privilegien ausführen" sollte angehakt werden.

----------------------------
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

# form specs
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "Check VPN and DNS Status"
$objForm.Size = New-Object System.Drawing.Size(200,190)
$objForm.StartPosition = "CenterScreen"
$objForm.KeyPreview = $True
$objForm.MaximumSize = $objForm.Size
$objForm.MinimumSize = $objForm.Size

# form status bar
$objStatusBar = New-Object System.Windows.Forms.StatusBar
$objStatusBar.Name = "statusBar"
$objStatusBar.Text = "Ready"
$objForm.Controls.Add($objStatusBar)

# status counter
$returnStatusCount = New-Object System.Windows.Forms.label
$returnStatusCount.Location = New-Object System.Drawing.Size(8,20)
$returnStatusCount.Size = New-Object System.Drawing.Size(130,20)
$returnStatusCount.BackColor = "Transparent"
$returnStatusCount.Text = "Counter: "
$objForm.Controls.Add($returnStatusCount)

# return status DNSCrypt
$returnStatusDNSCrypt = New-Object System.Windows.Forms.label
$returnStatusDNSCrypt.Location = New-Object System.Drawing.Size(8,50)
$returnStatusDNSCrypt.Size = New-Object System.Drawing.Size(130,20)
$returnStatusDNSCrypt.BackColor = "Transparent"
$returnStatusDNSCrypt.Text = ""
$objForm.Controls.Add($returnStatusDNSCrypt)

# return status DNS
$returnStatusDNS = New-Object System.Windows.Forms.label
$returnStatusDNS.Location = New-Object System.Drawing.Size(8,70)
$returnStatusDNS.Size = New-Object System.Drawing.Size(130,20)
$returnStatusDNS.BackColor = "Transparent"
$returnStatusDNS.Text = ""
$objForm.Controls.Add($returnStatusDNS)

# return status VPN
$returnStatusVPN = New-Object System.Windows.Forms.label
$returnStatusVPN.Location = New-Object System.Drawing.Size(8,90)
$returnStatusVPN.Size = New-Object System.Drawing.Size(130,20)
$returnStatusVPN.BackColor = "Transparent"
$returnStatusVPN.Text = ""
$objForm.Controls.Add($returnStatusVPN)

# create a timer object and set the interval in milliseconds
$timer = New-Object System.Windows.Forms.Timer
$timer.Interval = 1000

$script:count = 0

# create the Tick event where the text in the label is changed (privileged mode needed for Set-DNS!)
$timer.Add_Tick({
$script:count++
$returnStatusCount.Text = "Check count: $script:count"
$returnStatusDNSCrypt.Text = "DNSCrypt: " + (Get-Service -Name "dnscrypt-proxy").Status
if ( (Get-Service -Name "dnscrypt-proxy").Status -eq "Running" ) {
$returnStatusDNSCrypt.ForeColor = "green"
} else {
$returnStatusDNSCrypt.ForeColor = "red"
Get-Service -Name "dnscrypt-proxy" | Start-Service
}

$returnStatusDNS.Text = "DNS: " + (Get-DnsClientServerAddress -InterfaceAlias "*WLAN*").ServerAddresses
$returnStatusVPN.Text = "VPN: " + (Get-NetAdapter -InterfaceDescription "*Tunnel*").Status

# VPN is up & DNS is localhost - desired status and no other actions should be considered (that's why 'elseif' is used)
if ( (Get-DnsClientServerAddress -InterfaceAlias "*WLAN*").ServerAddresses -like "127.*" -and (Get-NetAdapter -InterfaceDescription "*Tunnel*" | where {$_.status -eq "Up"}) ) {
$returnStatusDNS.ForeColor = "green"
$returnStatusVPN.ForeColor = "green"
$objStatusBar.Text = "OK, keep checking - [ESC] = Quit"
}

# VPN is up & DNS is NOT localhosat - set DNS to localhost to use DNSCrypt
elseif ( (Get-NetAdapter -InterfaceDescription "*Tunnel*").Status -eq "Up" ) {
$returnStatusVPN.ForeColor = "green"
$returnStatusDNS.ForeColor = "black"
$objStatusBar.Text = "Set DNS to localhost ..."
Start-Sleep -Milliseconds 5000
Set-DnsClientServerAddress -InterfaceAlias "*WLAN*" -ServerAddresses ("127.0.0.1","::1")
}

# VPN is down & DNS is localhost - set DNS to 8.8.8.8 for getting VPN connection
elseif ((Get-DnsClientServerAddress -InterfaceAlias "*WLAN*").ServerAddresses -like "127.*" ) {
$returnStatusVPN.ForeColor = "red"
$returnStatusDNS.ForeColor = "black"
$objStatusBar.Text = "Set DNS to 8.8.8.8, 9.9.9.9 ..."
Set-DnsClientServerAddress -InterfaceAlias "*WLAN*" -ServerAddresses ("8.8.8.8","9.9.9.9")
}

# VPN is down & DNS is NOT localhost
else {
$returnStatusVPN.ForeColor = "red"
$returnStatusDNS.ForeColor = "black"
$objStatusBar.Text = "VPN should be connecting ..."
}
})

# start the timer on button click
#$objButton.Add_Click( {$timer.Start()} )
$timer.Start()

# close the form on escape key
$objForm.Add_KeyDown( {
if ($_.KeyCode -eq "Escape") {
$objForm.Close()
}
})

# form always on top
$objForm.Topmost = $True

# show the form
$objForm.ShowDialog() | Out-Null

# dispose the timer when disposing the form
$objForm.Add_Closing({ $timer.Dispose() })

# dispose the form when done
$objForm.Dispose()
----------------------------
 
Zurück