When you use a VPN, you are not completely hiding your traffic. You are choosing to let your VPN provider see your traffic, instead of your ISP (the VPN is your “ISP”).
The most critical information that usually leaks is the domain names of the sites you visit, even when using HTTPS. Your device may also do unencrypted HTTP connections, which are vulnerable to injections or malware.
That’s why it’s important to trust the VPN/Internet provider and use end-to-end encrypted protocols like TLS/HTTPS or SSH.
While TLS/HTTPS mitigates the security issue, you still have the privacy issue. To mitigate the privacy issue, you can use a two hop set up, with an entry node that relays to an exit node that in turn connects to your destination:
[client/source]===[entry node]===[exit node]---[target/destination]
That way the entry node cannot see your destination (because the traffic between you and the exit node is encrypted) and the exit node cannot see what the source is (because the traffic is coming from the entry node). This prevents source-target correlation.
Tor implements that, in what they call “onion routing”, given the layers of encryption. They add a third node in the middle called “Relay”, to protect against the case where the entry and exit nodes may collaborate. The EFF has a really helpful diagram showing what the different actors in the network can see when you have Tor and HTTPS enabled or disabled.
I recommend using the Tor Browser if you are concerned about privacy. They not only do Onion routing, but also limits the information your browser leaks. It’s possible that you may have issues, like slow speeds and lots of captchas, so you may want to restrict usage to your more sensitive activity. Also, Tor may be blocked, but it’s possible to use the Tor browser over an Outline connection.
It’s also possible to do Onion Routing with Outline, but it’s not user-friendly. We have a command-line tool that runs a local web proxy that you can use to configure your browser or operating system. The local proxy will relay the traffic according to a “transport” config, which can contain multiple Outline hops. You can find the config format and a onion routing example in the Outline SDK documentation. The command would look something like this:
go run github.com/Jigsaw-Code/outline-sdk/x/examples/http2transport@latest -transport "ss://[OUTLINE_KEY1]|ss://[OUTLINE_KEY2]" -localAddr localhost:8080