Para fazer o que você está querendo, eu recomendo sshuttle .
Você usa assim:
./sshuttle -r username@sshserver 0.0.0.0/0 -vv
Ele irá tunelar todo o seu tráfego TCP automaticamente para você. Você pode adicionar o argumento --dns
para encapsular seu tráfego DNS também. O servidor remoto só precisa ter o Python instalado.
Se você quiser apenas tunelar programas específicos, eu recomendaria proxies .
Uma vez instalado, inicie seu proxy de ssh socks assim:
ssh -fND 127.0.0.1:<local port> username@sshserver
Isso iniciará a exibição de um proxy "SOCKS" em < porta local >.
Em seguida, edite /etc/proxychains.conf para apontar para a mesma porta que a < porta local >.
Por fim, inicie o seu programa que você deseja que seja assim:
proxychains <program name>
Deve funcionar. No entanto, alguns programas terão problemas para trabalhar com cadeias de proxy. Lembre-se também que, com o Firefox, você precisa alterar itens adicionais em about: config para forçá-lo a fazer pesquisas de DNS por meio do proxy, em vez de ignorá-lo.
Como nota adicional, em navegadores da web. Se eles suportarem proxies de meias, você não precisa fazer nada adicional para fazê-los usar o túnel ssh mencionado acima, basta inserir 127.0.0.1 para o servidor proxy SOCKS e o < local port > para a porta do proxy.
EDIT 3/29/16
Como este post ainda está vendo alguns upvotes, pensei em atualizá-lo. Proxychains ainda está na maioria dos repositórios Linux e ainda funciona no Linux. No entanto, o projeto é efetivamente abandonado e não funciona no OSX. Para Linux ou OSX, eu recomendo altamente a atualização para uma bifurcação ainda mantida: proxychains-ng: link
Além de trabalhar tanto no Linux quanto no OSX, é fácil compilar e também oferece suporte muito melhor para o tunelamento de DNS.
Eu também devo mencionar outra opção, que é redsocks. Ele funciona de maneira semelhante ao proxychains (-ng) e também é provável que você esteja em seu repo: link