2009-07-25 13 views
21

Questo deve funzionare solo su una singola sottorete e non è per uso dannoso.Spoofing dell'indirizzo IP di origine di una richiesta HTTP

Ho uno strumento di test del carico scritto in Python che fondamentalmente fa saltare le richieste HTTP a un URL. Devo eseguire test delle prestazioni su un servizio di bilanciamento del carico basato su IP, quindi le richieste devono provenire da un intervallo di IP. La maggior parte degli strumenti per le prestazioni commerciali fornisce questa funzionalità, ma io voglio crearla da sola.

Lo strumento utilizza urllib2 di Python per il trasporto. È possibile inviare richieste HTTP con indirizzi IP falsificati per i pacchetti che costituiscono la richiesta?

+0

hmm .. come una delle risposte seguenti dice .. come si verificherà un handshake TCP se l'IP di origine è stato falsificato? con che tipo di configurazione di rete utilizzeresti questa simulazione? –

risposta

5

Si desidera impostare l'indirizzo di origine utilizzato per la connessione. Googling "indirizzo sorgente urllib2" dà http://bugs.python.org/file9988/urllib2_util.py. Non l'ho provato

Il sistema su cui si sta eseguendo deve essere configurato con gli IP da cui si esegue il test.

+0

Questo è l'approccio giusto: dai alla tua casella di prova molti IP e fai in modo che l'app di test li attraversi mentre esegue le connessioni. – caf

5

Nota veloce, come ho appena appreso ieri:

Credo che tu abbia implicito lo sai già, ma tutte le risposte a una richiesta HTTP andare all'indirizzo IP che compare nell'intestazione. Pertanto, se si desidera visualizzare tali risposte, è necessario avere il controllo del router e impostarlo in modo tale che gli IP spoofati vengano tutti reinviati all'IP che si sta utilizzando per visualizzare le risposte.

43

Questo è un malinteso di HTTP. Il protocollo HTTP si basa su TCP. Il protocollo TCP si basa su un handshake a 3 vie per inizializzare le richieste.

alt text http://upload.wikimedia.org/wikipedia/commons/archive/c/c7/20051221162333!300px-Tcp-handshake.png

Inutile dire che, se si spoof il vostro indirizzo IP di origine, non si sarà mai superare la fase di sincronizzazione e nessuna informazione HTTP sarà inviato (il server non può inviarlo a un host legale).

Se è necessario testare un servizio di bilanciamento del carico IP, questo non è il modo per farlo.

+0

buon punto.nessun indizio su come si sarebbe verificato un handshake tcp se i pacchetti che componevano quei segmenti tcp avevano intestazioni ip false. essere fuori tema, ma come implementeresti una rete/programma per testare e IP LB? e come fanno gli strumenti come LoadRunner a fare questo? –

+8

Non ho idea di cosa sia LoadRunner, ma suppongo che utilizzino un NAT che richiede un accesso di basso livello ai pacchetti non elaborati che riscrive al volo i pacchetti di origine in arrivo e i pacchetti di destinazione in uscita. Per fare ciò, potrebbe essere necessario installare PCAP http://en.wikipedia.org/wiki/Pcap. Ma ti avverto, non è così facile come usare urllib2. In una nota a margine, è anche divertente vedere quante persone qui non hanno idea di cosa stiano parlando e sono stato downvoted due volte. – Unknown

+0

Immagino che molti programmatori non abbiano idea di come la rete funzioni a un livello inferiore, non ti preoccupare. – Gert

1

Si potrebbe semplicemente utilizzare l'aliasing IP su una macchina Linux e impostare tutti gli indirizzi IP che si desidera. Il problema è che non è possibile prevedere quale IP verrà stampato nell'intestazione IP a meno che non lo si imposti su un'altra rete e si imposti un percorso esplicito per quella rete. Ad esempio:

current client address on eth0 = 192.168.1.10/24 

server-side: 
ifconfig eth0:1 172.16.1.1 netmask 255.255.255.0 

client-side: 
ifconfig eth0:1 172.16.1.2 netmask 255.255.255.0 
route add -net 172.16.1.0/24 gw 172.16.1.1 metric 0 

Ripetere per tutte le sottoreti che si desidera. Riavvia apache per impostare i listener su tutte le nuove interfacce alias e sei a posto.

1

Suggerisco di vedere se è possibile configurare il bilanciamento del carico in modo che diventi la decisione basata sull'intestazione X-Forwarded-For, anziché sull'IP di origine del pacchetto contenente la richiesta HTTP. So che la maggior parte degli importanti bilanciatori di carico commerciali ha questa capacità.

Se non è possibile farlo, allora suggerisco che probabilmente è necessario configurare una macchina Linux con un mucchio di secondaria IP - non perdete la configurazione di route statiche sul LB, basta fare la vostra linux box il default gateway del dispositivo LB.

Problemi correlati