Tethering
What?
Let's say your mobile operator charges extra for, or caps, your wifi-sharing tethering data. That doesn't seem fair, now does it? Doesn't cost them any more just because the data's going to/from a laptop, so why should it cost you? Where there is a will, there is a way.
How?
If you can send all your tether data through an app, then it's not tethering data any more, is it? No. No it is not.
So a VPN, right?
If you run your own VPN service and you can find a phone VPN app that lets you connect to it from wifi tethered devices, then yeah, do that. Otherwise, don't - commercial VPN providers are sketchy as fuck.
SSH
As usual, SSH to the rescue. You're gonna need a machine you can ssh to from the internet, an android mobile, and a copy of JuiceSSH (other ssh clients may also work, but Juice is excellent). iOS mobiles ain't gonna work for this - Apple decided a long time ago that long-running backgrounded network apps aren't allowed. Why? Because battery life and fuck you, that's why.
Setup
Nothing in particular on the phone or the SSH host - just set up a SOCKS port-forward in JuiceSSH, point it at your SSH machine and you're laughing. The SOCKS proxy will be listening on whatever port you specify (8080 is traditional), and will be reachable from wifi-tethered devices. The sshd defaults on Fedora, Debian, Ubuntu et al are fine. The setup on the tethered laptop's a bit more particular though…
Laptop
Two options on OSX to stop stuff talking directly to the internet and racking up your tethering bill - Trip Mode, or some manual setup.
Trip Mode 2
Trip Mode 2 works as a selective app firewall - it'll deny network access to apps until you give them access through a menubar icon. Lovely stuff. Costs a few quid though.
Manual network setup
To avoid sending any data through the phone that isn't going through the proxy, you can hobble the network a bit. This is on OSX, but similar should work elsewhere too.
Get IP adresses
Connect to the phone wifi sharing, and run 'ifconfig' and 'netstat -rn' to get your IP and default route. The wifi sharing network range seems to be completely stable on android, so we can just set a static IP below, and the phone (the router) is always on the .1 address. Now disconnect.
Create a new Location
Create a new Location in System Preferences -> Network -> Location -> Edit Locations Switch off DHCP, and set IPv6 to link-local only. Set the IP to whatever you got when you connected normally; subnet mask to 255.255.255.0; and most importantly, leave the default route blank. Leave DNS blank as well - we don't need it.
Browse
Chrome and Safari use the system-set proxies, and that doesn't work - DNS has nowhere to go with the manual network setup, so the whole thing breaks, and leaking DNS queries is probably not a good idea if you're using Trip Mode. Firefox will happily use the SOCKS proxy for DNS, though, so that's what we're going to use. In Firefox -> Preferences -> Network set the SOCKS proxy to the default route IP you got above, port 8080, SOCKS v5, and select 'Proxy DNS when using SOCKS v5'.
SSH
You can SSH through your tether proxy with:
ssh -o ProxyCommand='nc -x 192.168.xxx.1:8080 %h %p' ssh.target.host
Other apps
Probably not gonna work. Soz.
Relax
That should be about it. When you want to browse tethered, fire up wifi sharing on the phone, start the port forward on JuiceSSH, and set the Location on the laptop to the one you set up above. In OSX, you'll get a '!' warning on the wifi icon, because it'll think your network's broken (which it kind of is with an unset default route), but that's OK. To unset the tethered config, just set your Location back to Default.