Existe-t-il un proxy HTTP générique en ligne de commande (comme Squid)?

9

Je peux facilement utiliser Netcat (ou Socat) pour capturer le trafic entre mon navigateur et un hôte spécifique: port.

Mais pour Linux, existe-t-il un équivalent en ligne de commande d'un proxy HTTP de type Squid que je peux utiliser pour capturer le trafic entre mon client HTTP (navigateur ou programme de ligne de commande) et tout hôte arbitraire: port?

Harry
la source
Connexe: Linux, simple proxy http
Piotr Dobrogost

Réponses:

8

Perl et Python (et probablement Ruby également) ont des kits simples que vous pouvez utiliser pour créer rapidement des proxys HTTP simples.

En Perl, utilisez HTTP :: Proxy . Voici l'exemple de 3 lignes de la documentation. Ajoutez des filtres pour filtrer, consigner ou réécrire les demandes ou les réponses; voir la documentation pour des exemples.

use HTTP::Proxy;
my $proxy = HTTP::Proxy->new( port => 3128 );
$proxy->start;

En Python, utilisez SimpleHTTPServer . Voici un exemple de code légèrement adapté d' effbot . Adaptez la do_GETméthode (ou autres) pour filtrer, consigner ou réécrire les demandes ou les réponses.

import SocketServer
import SimpleHTTPServer
import urllib
class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        self.copyfile(urllib.urlopen(self.path), self.wfile)
httpd = SocketServer.ForkingTCPServer(('', 3128), Proxy)
httpd.serve_forever()
Gilles 'SO- arrête d'être méchant'
la source
Je pense que c'est exactement le type de solution que je cherchais. Merci.
Harry
Celui de Python a fonctionné pour moi pour les requêtes HTTP mais il ne semble pas supporter les requêtes HTTPS.
Russell Silva
@RussellSilva Essayez piware.de/2011/01/creating-an-https-server-in-python ou gist.github.com/dergachev/7028596
Gilles 'SO- arrête d'être méchant'
6

Ce n'est peut-être pas la meilleure solution, mais si vous utilisez un proxy, il aura un spécifique, de host:portsorte que la solution netcat fonctionnera toujours, bien que vous deviez choisir les métadonnées du proxy pour le comprendre.

La façon la plus simple de le faire pourrait être d'utiliser un proxy d'anonymisation aléatoire et de canaliser tout le trafic netcat. (C'est-à-dire, définissez le proxy de votre navigateur sur localhost:port, puis transférez les données vers le vrai proxy.)

Si vous souhaitez avoir un proxy local, un proxy SOCKS5 avec ssh -D <port> localhostest probablement votre option la plus simple. De toute évidence, vous devez dire à votre navigateur d'utiliser un proxy "socks" plutôt qu'un proxy "http".

Donc, quelque chose comme ça (en supposant que votre machine locale accepte les connexions ssh entrantes):

ssh -fN -D 8000 localhost
nc -l 8080 | tee capturefile | nc localhost 8000

Naturellement, cela ne fonctionnera que pour une seule tentative de connexion au navigateur, puis quittera, et je n'ai pas tenté de transmettre les données de retour au navigateur, vous aurez donc besoin de votre netcatsolution complète .

ams
la source
Merci. Avez-vous des suggestions de noms pour les proxys d'anonymisation pour Linux? Je préférerais ceux qui ne sont pas aussi lourds que Squid (en termes de taille, de mémoire, de vitesse de démarrage), peuvent être démarrés par un non- rootutilisateur, etc.
Harry
De plus, je n'ai pas suivi votre exemple de proxy SOCKS5. Pourriez-vous expliquer ce qui se passe avec les 2 invocations ci-dessus? Je sais, par exemple, que ssh -fN -D ...démarre un proxy SOCKS5 sur le localhostport 8000, mais que fait nc -l ...-il? Et, vers quel port dois-je faire pointer mon navigateur vers: 8000ou 8080?
Harry
2
@harry pour un proxy d'anomyzation jetez un œil à privoxy
Ulrich Dangel
1
Quand je dis «proxy d'anonymisation», je ne veux pas dire quelque chose que vous configurez vous-même: je veux dire un proxy existant sur le net. @UlrichDangel suggère privoxy et je suis sûr qu'il y en a aussi d'autres.
Ams
Les nccommandes acceptent tout le trafic provenant du port 8080 et le transmettent à 8000. Je n'ai pas fourni de netcatsolution complète car votre message suggérait que vous saviez déjà comment faire cette partie.
Ams