Traffico IP di path basato sul process su diversi routes / interface predefiniti

Sto cercando di determinare se è ansible passare in modo selettivo i pacchetti IP da un process o da un gruppo di processi attraverso un'interface specifica mentre tutti gli altri pacchetti sono instradati attraverso un'altra interface. Vale a dire, voglio che tutto il traffico da /usr/bin/testapp sia instradato attraverso eth1 mentre tutti gli altri pacchetti passano attraverso eth0 . I pacchetti in questo caso possono essere TCP, UDP, ICMP, ecc. E possono essere configurati dagli utenti finali per utilizzare diverse porte.

Poiché non sono in grado di forzare facilmente il process in questione per legarsi ad una specifica interface, cerco di get lo stesso risultato tramite il routing. È ansible?

— edit —

Attraverso un utile suggerimento qui e in molti altri luoghi, è quello di contrassegnare i pacchetti basati su UID; questo non è proprio l'objective. L'objective è quello di contrassegnare / filtrare / percorrere in base al process indipendentemente dall'utente . Vale a dire, se alice , bob e charlie eseguono la propria istanza di /usr/bin/testapp ; tutti i pacchetti di tutti e tre i casi dovrebbero passare attraverso eth1 mentre tutti gli altri pacchetti dal sistema dovrebbero passare attraverso eth0 .

Si noti che la marcatura per port di origine / destinazione, nome utente / UID, ecc. Non è sufficiente poiché diversi utenti possono eseguire testapp e possono impostare diverse porte nel proprio ~/.config/testapp.conf o qualsiasi altra cosa. La domanda è di filtrare per process.

Un'opzione disponibile, anche se non so quanto sia utile, è utilizzare un wrapper basato su /bin/(ba|z)?sh Sh attorno al binario nativo.

— edit —

Mi riferisco al routing su un sistema che esegue un moderno kernel Linux, ad esempio 4.0 o meglio. Se ci sono dependencies software oltre iproute2 , nftables , conntrack e strumenti simili, sono disposto a esplorare soluzioni open source, anche se gli strumenti di base sono preferibili.

4 Solutions collect form web for “Traffico IP di path basato sul process su diversi routes / interface predefiniti”

Il tuo routing dei pacchetti tramite eth1 o eth0. le tabelle mangle dovrebbero risolvere questo problema. Per fare questo, ho dovuto contrassegnare i pacchetti e impostare regole per gestirlo. Innanzitutto, aggiungere una regola che rende i pacchetti del path del kernel contrassegnati da 2 a tabella

 ip rule add fwmark 2 table 3 

Aggiungere un path per redirect il traffico su un'altra interface, supponendo che il gateway sia 10.0.0.1:

 ip route add default via 10.0.0.1 table 3 

Sciacquare la tua cache di routing.

 ip route flush cache 

Adesso, impostare una regola firewall per contrassegnare i pacchetti designati:

 iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2 

Infine, rilassate la validation della sorgente di path inverso. Alcuni suggeriscono di impostarlo su 0, ma 2 sembra una scelta migliore in base a https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt . Se salti questo, riceverai pacchetti (questo può essere confermato usando tcpdump -i tap0 -n ), ma i pacchetti non vengono accettati. Il command per modificare l'impostazione in modo che i pacchetti siano accettati:

 sysctl -w net.ipv4.conf.tap0.rp_filter=2 

Riferimento: http://serverfault.com/questions/345111/iptables-target-to-route-packet-to-specific-interface

È ansible eseguire il process con un utente specifico e corrispondere ai pacchetti con l'estensione del owner di iptable. Una volta abbinata, puoi contrassegnarla e utilizzarla con un'altra tabella di routing, utilizzare POSTROUTING o qualunque soluzione che ti piacerebbe.

Questo post spiega meglio la corrispondenza dei pacchetti con il owner .

Purtroppo la manpage delle estensioni di iptables ( http://ipset.netfilter.org/iptables-extensions.man.html ) non afferma nessun module per completare i tuoi requisiti.

Vorrei suggerire lo stesso di Mauricio López .

Puoi setuid o setgid l'applicazione di destinazione in un determinato utente o gruppo, in modo che, indipendentemente da chi ha iniziato l'applicazione, verrà eseguito come utente o gruppo specifico:

 adduser specialrouteuser chown specialrouteuser: /usr/bin/testapp chmod +s /usr/bin/testapp 

quindi utilizzare l'estensione owner iptables per corrispondere a quella specifica UID o GID.

Questo potrebbe naturalmente aggiungere altri problemi o problemi di sicurezza.

Beh, dato che ci hai detto:

Poiché non sono in grado di forzare facilmente il process in questione per legarsi ad una specifica interface, cerco di get lo stesso risultato tramite il routing. È ansible?

possiamo cominciare ad aiutarti da questo punto. Una volta in una chiamata del sistema di jail FreeBSD è apparsa con lo scopo di limitare un process, o un gruppo di processi, ad una certa sottosezione sulle risorse di sistema. In particolare, si potrebbe specificare un indirizzo IP che i processi "isolati" avrebbero utilizzato per la loro attività di networking. Questo è stato così utile che ho davvero perso questa funzionalità in Linux molto. Ma Linux ha alcuni modi per get risultati simili:

  • OpenVZ
  • LXC

o, la maggior parte dei pesi leggeri si limiterebbero manualmente a spazi di nomi: https://unix.stackexchange.com/questions/155446/linux-is-there-handy-way-to-exec-a-program-binding-it-to- ip-indirizzo-di-scelta

Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.