Forzare il traffico IP locale ad un'interface esterna

Ho una macchina con diverse interfacce che posso configurare come voglio, per esempio:

  • eth1: 192.168.1.1
  • eth2: 192.168.2.2

Vorrei inoltrare tutto il traffico inviato a uno di questi indirizzi locali attraverso l'altra interface. Ad esempio, tutte le richieste a un server iperf, ftp, http a 192.168.1.1 non devono essere instradate internamente, ma inoltrate tramite eth2 (e la networking esterna si occuperà di re-routing del pacchetto in eth1).

  • La seconda configuration della scheda di networking non funziona
  • Conte il numero di CPU consentite in un contenitore Docker
  • Possibile l'authentication di Samba tramite Kerberos ma senza l'accesso al dominio?
  • Come modificare l'ordine di avvio / avvio dei servizi Linux?
  • L'ext4 è pronto per un utilizzo produttivo?
  • Posso aumentare il numero di inode in Linux?
  • Ho provato e guardato diversi comandi, come iptables, ip route, ecc … ma niente ha funzionato.

    Il comportmento più vicino che potevo get è stato fatto con:

    ip route change to 192.168.1.1/24 dev eth2 

    che inviano tutti 192.168.1.x su eth2, ad exception di 192.168.1.1, che è ancora indirizzato internamente. Potrei essere in grado di effettuare l'inoltro di NAT di tutto il traffico diretto alla falsificazione 192.168.1.2 su eth1, rivolto a 192.168.1.1 internamente? Sto realmente lottando con iptables, ma è troppo difficile per me.

    L'objective di questa configuration è quello di eseguire test di driver di interface senza utilizzare due PC.

    Sto usando Linux, ma se sai come farlo con Windows, lo comprerò!

    Edit:

    La networking esterna è solo un cavo crossover tra eth1 e eth2. Diciamo che ho un server http sulla mia macchina. Ora voglio accedere a questo server dalla stessa macchina, ma voglio forzare il traffico TCP / IP per passare attraverso questo cavo eth1 / eth2. Come devo configurare le interfacce per questo?

    9 Solutions collect form web for “Forzare il traffico IP locale ad un'interface esterna”

    Ho ampliato la risposta di caladona poiché non ho potuto vedere i pacchetti di risposta. Per questo esempio:

    1. Sul mio PC locale ho NIC in diverse sottoreti, 192.168.1 / 24 , 192.168.2 / 24
    2. C'è un router esterno / PC che ha accesso a entrambe le sottoreti.
    3. Voglio submit il traffico bi-direzionale sulle NIC sul PC locale.
    4. La configuration richiede due indirizzi IP non utilizzati per ciascuna substring.

    I routes iptable per PC locali sono impostati sul traffico in output SNAT e DNAT verso l'IP 'falso'.

     iptables -t nat -A POSTROUTING -d 192.168.1.100 -s 192.168.2.0/24 -j SNAT --to-source 192.168.2.100 iptables -t nat -A PREROUTING -d 192.168.1.100 -i eth0 -j DNAT --to-destination 192.168.1.1 iptables -t nat -A POSTROUTING -d 192.168.2.100 -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.100 iptables -t nat -A PREROUTING -d 192.168.2.100 -i eth1 -j DNAT --to-destination 192.168.2.1 

    Le regole fanno quanto segue:

    1. Riscrivere 192.168.2.1 source a 192.168.2.100 sui pacchetti in output
    2. Riscrivere 192.168.1.100 destinazione a 192.168.1.1 sui pacchetti in arrivo
    3. Rinomina 192.168.1.1 fonte a 192.168.1.100 sui pacchetti in output
    4. Riscrivi la destinazione 192.168.2.100 a 192.168.2.1 sui pacchetti in arrivo

    Riassumendo, il sistema locale ora può parlare con una macchina "virtuale" con gli indirizzi 192.168.1.100 e 192.168.2.100.

    Quindi wherete forzare il vostro PC locale per utilizzare il router esterno per raggiungere il tuo IP falso. Lo fa per creare un path diretto verso l'IP attraverso il router. Si desidera assicurarsi di forzare i pacchetti sull'altro della substring di destinazione.

     ip route 192.168.1.100 via $ROUTER_2_SUBNET_IP ip route 192.168.2.100 via $ROUTER_1_SUBNET_IP 

    Infine per fare tutto questo, il router esterno deve sapere come raggiungere i IP falsi sul tuo PC locale. È ansible eseguire operazioni di taglio triggersndo gli ARP proxy triggersti ​​per il sistema.

     echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/proxy_arp echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward 

    Con questa configuration puoi ora trattare i IP falsi come vero e proprio sistema sul tuo PC locale. Invio di dati alla substring .1 subirà i pacchetti dall'interface .2. Invio di dati alla substring .2 subirà i pacchetti dall'interface .1.

     ping 192.168.1.100 ping 192.168.2.100 

    Ho usato con successo il seguente su Linux per provare il throughput su una nuova scheda dual-port 10Gbps in modalità "loopback", cioè una port collegata direttamente nell'altro. Questo è solo un po 'di voodoo solo per forzare i pacchetti fuori dal filo, ma se no, Linux solo cortocircuora il traffico attraverso il kernel (da qui la domanda dell'OP). Nella risposta di Casey sopra, non sono sicuro se fosse veramente necessario disporre di un router esterno o non superiore, ma il seguente è completamente autonomo. Le due interfacce sono eth2 e eth3.

    Fornire IP alle interfacce e metterle su reti separate:

     ifconfig eth2 10.50.0.1/24 ifconfig eth3 10.50.1.1/24 

    Successivamente creeremo un doppio scenario NAT: due nuove reti ruvide utilizzate per raggiungere l'altra. Sulla via d'output, fonte NAT alla tua networking falsa. Nel modo in, correggere la destinazione. E viceversa per l'altra networking:

     # nat source IP 10.50.0.1 -> 10.60.0.1 when going to 10.60.1.1 iptables -t nat -A POSTROUTING -s 10.50.0.1 -d 10.60.1.1 -j SNAT --to-source 10.60.0.1 # nat inbound 10.60.0.1 -> 10.50.0.1 iptables -t nat -A PREROUTING -d 10.60.0.1 -j DNAT --to-destination 10.50.0.1 # nat source IP 10.50.1.1 -> 10.60.1.1 when going to 10.60.0.1 iptables -t nat -A POSTROUTING -s 10.50.1.1 -d 10.60.0.1 -j SNAT --to-source 10.60.1.1 # nat inbound 10.60.1.1 -> 10.50.1.1 iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1 

    Ora informi il sistema come arrivare a ciascuna networking falsa e prepopulate le voci di arp (assicuratevi di sostituire i tuoi indirizzi MAC, non utilizzare la mia):

     ip route add 10.60.1.1 dev eth2 arp -i eth2 -s 10.60.1.1 00:1B:21:C1:F6:0F # eth3's mac address ip route add 10.60.0.1 dev eth3 arp -i eth3 -s 10.60.0.1 00:1B:21:C1:F6:0E # eth2's mac address 

    Questo stupisce Linux abbastanza per mettere in pratica pacchetti sul filo. Per esempio:

     ping 10.60.1.1 

    spegne eth2, l'origine IP 10.50.0.1 viene NATted a 10.60.0.1 e, entrando in eth3, la destinazione 10.60.1.1 viene NATted a 10.50.1.1. E la risposta prende un viaggio simile.

    Ora usi iperf per testare il throughput. Assicurati i IP corretti e assicurati quale IP stai contattando (indirizzo falso dell'altro capo):

     # server ./iperf -B 10.50.1.1 -s # client: your destination is the other end's fake address ./iperf -B 10.50.0.1 -c 10.60.1.1 -t 60 -i 10 

    Assicurarsi che il traffico sta veramente andando al filo:

     tcpdump -nn -i eth2 -c 500 

    È inoltre ansible guardare / proc / interrupt solo per essere assolutamente sicuri che la scheda viene utilizzata:

     while true ; do egrep 'eth2|eth3' /proc/interrupts ; sleep 1 ; done 

    Comunque, ho trovato questo post alla ricerca di come farlo, grazie per i ragazzi di Q & A e spero che questo aiuti chiunque altro a trovare questo post in futuro.

    Ok, ho finalmente riuscito a configurare il mio config.

    L'idea è quella di utilizzare un altro indirizzo falso per forzare il path di questo indirizzo falso all'interface 2, quindi tradurre l'indirizzo falso con l'indirizzo reale 2 con NAT / iptables.

    Il mio set è realmente costituito da un router che posso telnet tra IF1 (interface 1) e IF2

    Nel mio set up, FAKE_ADDR e IF1_ADDR sono nella stessa substring.

     ifconfig $IF1 $IF1_ADDR netmask 255.255.255.0 ifconfig $IF2 $IF2_ADDR netmask 255.255.255.0 iptables -t nat -A PREROUTING -d $FAKE_ADDR -i $IF2 -j DNAT --to-destination $IF2_ADDR iptables -t nat -A POSTROUTING -s $IF2_ADDR -d $IF1_ADDR/24 -j SNAT --to-source $FAKE_ADDR route add $FAKE_ADDR gw $ROUTER_ADDR 

    E sul router:

     route add $FAKE_ADDR gw $IF2_ADDR 

    Se invio qualcosa a FAKE_ADDR, pkt viene inoltrato tramite IF1 al router, inoltrato nuovamente a IF2, quindi FAKE_IP viene sostituito da IF2_ADDR. Il pacchetto viene elaborato dal server, il risultato viene inviato a IF1_ADDR, da IF2_ADDR sostituito da FAKE_ADDR.

    Può essere ansible utilizzare una configuration più semplice con un solo cavo crossover, ma come ho fatto non ho preferito dare la mia soluzione di lavoro.

    Sembra che tu voglia trasformare la tua casella di linux in una casella di tipo router / bridge / gateway / firewall. Le seguenti risorse potrebbero essere ciò che cerchi:

    Il Linux Router Project

    Elenco delle distribuzioni di router o firewall

    Linux LiveCD Router

    Linux Journal – Il router Linux

    Aggiornamento basato su ulteriori informazioni:

    Non credo che tu sia in grado di fare quello che vuoi. Il sistema operativo continuerà a esaminare la tabella di routing interna e "vedere" entrambi gli indirizzi IP localmente. Esso quindi percorrerà il traffico all'interno del sistema operativo e non lo metterà mai sul filo. Avnetworking bisogno di una seconda macchina o due macchine virtuali ( vedi Xen ).

    Un sacco di cose da percorrere qui, quindi non posso assolutamente garantire la mia precisione, ma la domanda originale sembra essere alla ricerca di ciò che è conosciuto come tecnica "submit a sé" . La ricerca collegata mostra quello che penso sia la miglior patch del kernel mantenuto come link principale + discussioni e patch con altri approcci su varie mailing list, in particolare. LKML.

    Penso che si dovrebbe anche guardare i nomi di nomi di networking , fatto con "ip netns" di iproute2 . Ciò richiede anche un'interface aggiuntiva e una magia di routing, quindi potrebbe non essere anche less complessa del massiccio iptables hoopla nelle altre risposte.

    Commenti sicuramente benvenuti se qualcuno ha trovato qualcosa di utile con questi – come, quello che, where la tua implementazione.

    Controlla questo articolo. Qui vengono menzionati i passaggi dettagliati per consentire l'accesso a un virtualbox vm utilizzando l'inoltro NAT.

    http://jackal777.wordpress.com/2012/02/13/virtualbox-host-only-networking-nat-for-internet-access/

    Come sempre – sono un po 'in ritardo – ma al giorno d'oggi si potrebbero utilizzare spazi di nomi di networking per isolare le interfacce e impedire qualsiasi inoltro locale (e fiddling con iptables :)).

    Crea spazi di nomi (tutti con le autorizzazioni necessarie, ad esempio come root):

     ip netns add ns_server ip netns add ns_client 

    Si noti che lo stato / la configuration delle interfacce deve ora essere acceduto nel context dello spazio dei nomi assegnato, quindi non verranno visualizzati se si esegue un collegamento ip nudo poiché viene eseguito nel context dello spazio dei nomi predefinito. L'esecuzione di un command all'interno di uno spazio dei nomi può essere eseguita usando

     ip netns exec <namespace-name> <command> 

    come prefisso.

    Ora assegnare spazi di nomi alle interfacce, applicare la configuration e impostare le interfacce:

     ip link set eth1 netns ns_server ip netns exec ns_server ip addr add dev eth1 192.168.1.1/24 ip netns exec ns_server ip link set dev eth1 up ip link set eth2 netns ns_client ip netns exec ns_client ip addr add dev eth2 192.168.1.2/24 ip netns exec ns_client ip link set dev eth2 up 

    Ora è ansible eseguire le applicazioni all'interno dello spazio dei nomi – per l'esecuzione del server iperf

     ip netns exec ns_server iperf -s -B 192.168.1.1 

    e il cliente:

     ip netns exec ns_client iperf -c 192.168.1.1 -B 192.168.1.2 

    Il traffico verrà ora inviato tramite le interfacce fisiche poiché l'integer networktack, l'interface, il routing … vengono isolati dagli spazi dei nomi in modo che il kernel non sia in grado di corrispondere gli indirizzi utilizzati nel traffico con le interfacce locali (disponibili).

    Se hai finito con i tuoi esperimenti, elimini semplicemente gli spazi dei nomi:

     ip netns del <namespace-name> 

    Le interfacce verranno riconfigurate allo spazio dei nomi predefinito e tutte le configurazioni eseguite all'interno dello spazio dei nomi scompaiono (ad esempio, non è necessario eliminare gli indirizzi IP assegnati).

    La risposta fornita da Thomas Tannhäuser è stata esatta!

    Avevo una situazione simile: una singola macchina con due interfacce. Il mio piano era usare un'interface come server (ricevitore) e l'altro come client (mittente). Ogni interface sarebbe stata collegata al router e iperf guiderebbe il traffico attraverso il router per misurare il throughput, il PPS, il ritardo, ecc.

    Purtroppo l'approccio iptables non era intuitivo e pieno di problemi. Dopo alcune ore frustranti ho abbandonato questo piano d'attacco. Ispirato al suggerimento di Thomas, ho fatto un po 'di compiti a casa su Linux Namespace IP e ho cominciato a apprezzare la semplicità e l'eleganza di questa soluzione.

    Di seguito è riportto un elenco dei comandi esatti che ho usato per configurare la mia Fedora FC26 per servire in questa capacità. Le due interfacce sono enp1s0 e enp3s0. Il router ha due interfacce con gli indirizzi 192.168.2.112 e 172.16.16.2. Ogni connettore FC26 ENET è collegato direttamente alla corrispondente interface del router.

     # How to configure the IP Namespaces ip netns add iperf-server ip netns add iperf-client ip link set enp1s0 netns iperf-server ip link set enp3s0 netns iperf-client ip netns exec iperf-server ip addr add dev enp1s0 192.168.2.139/20 ip netns exec iperf-client ip addr add dev enp3s0 172.16.16.2/24 ip netns exec iperf-client ip link set dev enp3s0 up ip netns exec iperf-server ip link set dev enp1s0 up ip netns exec iperf-server route add default gw 192.168.2.112 ip netns exec iperf-client route add default gw 172.16.16.1 # Test the interfaces and network using ping ip netns exec iperf-client ping -c1 172.16.16.1 ip netns exec iperf-server ping -c1 192.168.2.112 ip netns exec iperf-server ping -c1 172.16.16.2 ip netns exec iperf-client ping -c1 192.168.2.139 # Start Iperf Server for UDP test ip netns exec iperf-server iperf -u -s # Run Client against Iperf server for UDP test ip netns exec iperf-client iperf -u -c 192.168.2.139 

    ecco come ho fatto funzionare per IPV6

    ips statici assegnati

     /sbin/ifconfig eth1 inet6 add 2001:db8::1/127 /sbin/ifconfig eth3 inet6 add 2001:db8::2/127 

    impostare solo routes host per indirizzi "FAKE"

     ip -6 route add 2001:db8::2/128 dev eth1 metric 1 ip -6 route add 2001:db8::1/128 dev eth3 metric 1 

    ha popolato il tavolo del Vicino … come l'ARP

     ip -6 neighbor add 2001:db8::1 lladdr 90:e2:ba:0d:75:e8 dev eth3 # eth1's mac address ip -6 neighbor add 2001:db8::2 lladdr 90:e2:ba:0d:75:e9 dev eth1 # eth3's mac address 

    ha aggiunto le voci ip6tables

     ip6tables -t nat -A POSTROUTING -s 2001:db8::1 -d 2013::2 -j SNAT --to-source 2001:db8::1 ip6tables -t nat -A PREROUTING -d 2001:db8::1 -j DNAT --to-destination 2001:db8::1 ip6tables -t nat -A POSTROUTING -s 2001:db8::2 -d 2013::1 -j SNAT --to-source 2001:db8::2 ip6tables -t nat -A PREROUTING -d 2001:db8::2 -j DNAT --to-destination 2001:db8::2 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.