equivalente iptables per mac os x


56

Voglio inoltrare richieste da 192.168.99.100:80a 127.0.0.1:8000. Ecco come lo farei in Linux usando iptables:

iptables -t nat -A OUTPUT -p tcp --dport 80 -d 192.168.99.100 -j DNAT --to-destination 127.0.0.1:8000

Come faccio la stessa cosa in MacOS X? Ho provato una combinazione di ipfwcomandi senza molto successo:

ipfw add fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(Il successo per me è puntare verso un browser http://192.168.99.100e ottenere una risposta da un server di sviluppo su cui sono in esecuzione localhost:8000)


Stiamo parlando di client o server OSX?
Scott Pack

1
È il leopardo delle nevi.
nafe

C'è qualche motivo per cui non puoi semplicemente configurare il tuo server web per l'ascolto anche su 192.168.99.100:80?
Zoredache,

1
@Zoredache L'ascolto sulla porta 80 richiede sudo e alcuni server web non rilasciano i privilegi abbastanza velocemente per eseguirli in sicurezza con sudo.
Navin,

Risposte:


33

Quindi ho scoperto un modo per farlo. Non sono sicuro che sia il modo preferito ma funziona! Nella tua shell preferita:

sudo ifconfig lo0 10.0.0.1 alias
sudo ipfw add fwd 127.0.0.1,9090 tcp from me to 10.0.0.1 dst-port 80

(L'alias lo0sembra essere la parte mancante)

Se desideri che un dominio (falso) punti a questo nuovo alias, assicurati che / etc / hosts contenga la riga:

10.0.0.1 www.your-domain.com

4
ipfw non funzionerà su Yosemite (MAC) e sembra un po 'deprecato
Vadorequest,

25

Sono stato in grado di farlo funzionare utilizzando i comandi ifconfige pfctlsu Mac 10.10.2. Con il seguente approccio sto mappando con successo 127.0.0.1:3000a mydomain.comlocalmente sul mio computer.

Nella riga di comando inserisci i seguenti due comandi per inoltrare le connessioni 127.0.0.1:3000a 10.0.0.1:

sudo ifconfig lo0 10.0.0.1 alias
echo "rdr pass on lo0 inet proto tcp from any to 10.0.0.1 port 80 -> 127.0.0.1 port 3000" | sudo pfctl -ef -

Quindi modifica il tuo /etc/hostso il /private/etc/hostsfile e aggiungi la seguente riga per mappare il tuo dominio 10.0.0.1.

10.0.0.1 mydomain.com

Dopo aver salvato il file hosts scarica il DNS locale:

sudo discoveryutil udnsflushcaches

Ora apri mydomain.comin un browser e vedrai il server ospitato sulla tua porta localhost (es 127.0.0.1:3000.). Fondamentalmente questo processo esegue il mapping <ip>:<port>a un nuovo in <ip>modo da poter quindi mappare un host su quell'IP.


1
Solo un po 'confuso, ma ottiene il lavoro fatto. Bello spettacolo.
Joey Carson,

6
Grazie. Come annulleresti l'alias e l'inoltro?
Carlos Nuñez,

1
Ciao sudo discoveryutil udnsflushcachesmi dà command not foundma corrisponde ancora correttamente alla voce. Ma come posso mappare una seconda porta? Ho provato a fare i passaggi 1 + 2 con id: 10.0.0.2e un'altra porta, ma richiede sempre solo l'ultima connessione. Quindi se lo faccio per ultimo 10.0.0.1e port 3000in avanti 3000, se lo faccio per ultimo 10.0.0.2e lo porto 4000in avanti 4000. Nel mio /private/etc/hostsho scritto entrambe le voci con l'id (secondo) diverso.
Andi Giga,

Funziona, ma ho bisogno di nuovo quando riavvio OSX .... Qualcosa per salvarlo definitivamente?
Kasper,

1
Si prega di aggiornare consudo dscacheutil -flushcache
Northtree

5

Anch'io ho dovuto fare una cosa simile di recente, e nella ricerca è arrivata questa risposta. Sfortunatamente, la risposta di Nafe utilizza ipfwche ora è obsoleta e non disponibile in OSX; e la risposta di Kevin Leary è davvero un po 'hacker. Quindi ho dovuto fare qualcosa di meglio (più pulito) e ho deciso di condividerlo qui per i posteri. Questa risposta si basa in gran parte sull'approccio citato in questa sintesi .

Come menziona OP, puntare un browser su 192.168.99.100 dovrebbe ottenere una risposta da un server su localhost: 8000. Aggiungere un alias a ifconfignon è davvero necessario, pfctlda solo è sufficiente: per raggiungere questo obiettivo il pf.conffile /etc/pf.confdeve essere modificato.

Per prima cosa creiamo (con sudo) un nuovo file di ancoraggio (chiamiamolo redirection) a: /etc/pf.anchors/redirection. Questo è fondamentalmente un normale file di testo e contiene la seguente riga (proprio come nella risposta di Kevin Leary): rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000. Una volta creato il nuovo file di ancoraggio, è necessario fare riferimento a esso all'interno del pf.conffile. Apri il pf.conffile con sudo e aggiungi rdr-anchor "redirection"dopo l'ultima rdr-anchor line (che è rdr-anchor "com.apple/*") e aggiungi load anchor "redirection" from "/etc/pf.anchors/redirection"alla fine.

In definitiva, ecco come dovrebbe apparire il file pf.conf:

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr-anchor "redirection"  #added for redirection/port forwarding
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "pow" from "/etc/pf.anchors/redirection"  #added for redirection/port forwarding

E questo è quasi. Basta riavviare pfctlemettendo sudo pfctl -dper disabilitarlo prima e poi sudo pfctl -fe /etc/pf.confper riavviarlo.

Ora, se è necessario che ciò avvenga automaticamente dopo ogni riavvio, è necessario eseguire un altro pezzettino di lavoro: il daemon di avvio per pfctldeve essere aggiornato (l'essenza di riferimento menziona che pf è abilitato automaticamente all'avvio, tuttavia questo non sembra essere il caso guardando il codice). Apri (con sudo) System/Library/LaunchDaemons/com.apple.pfctl.pliste cerca questo:

<array>
          <string>pfctl</string>
          <string>-f</string>
          <string>/etc/pf.conf</string>
</array>

e aggiungi la linea <string>-e</string>per renderla alla fine così:

<array>
         <string>pfctl</string>
         <string>-e</string>
         <string>-f</string>
         <string>/etc/pf.conf</string>
</array>

Questo dovrebbe farlo.

Avvertenza : Apple non consente più di modificare i file di demone di lancio in questo modo (non con sudo, né chmod, né altro). L' unico modo è armeggiare con le impostazioni di Protezione integrità del sistema : avviare in modalità di ripristino e avviare il terminale. Controllare lo stato SIP con csrutil status, in genere dovrebbe essere abilitato. Disabilitarlo con csrutil disablee riavviare in modalità normale, quindi apportare le modifiche al file plist come discusso sopra. Una volta fatto, torna alla modalità di ripristino e riattiva la protezione (è attiva per una buona ragione) emettendo csrutil enable.

Spiegazione: È possibile verificare emettendo il ifconfigcomando che 127.0.0.1è già l'alias (predefinito) per localhost lo0 - questo fatto viene utilizzato per evitare di dover aggiungere un alias aggiuntivo per localhost e utilizzare semplicemente l'indirizzo predefinito nel pf.conffile.

AGGIORNAMENTO: Sfortunatamente, sembra che il caricamento del file all'avvio non funzioni. Sto ancora cercando di ottenere aiuto per risolverlo. Fino ad allora, correre sudo pfctl -f /etc/pf.confdopo l'avvio fa il trucco.


Grazie per questo, questo ha funzionato per me in OS X Sierra. È molto importante, tuttavia, che il file di reindirizzamento termini con una nuova riga.
kadrian,

Non sembra sicuro sovrascrivere i file di sistema come System/Library/LaunchDaemons/com.apple.pfctl.plist; questo probabilmente non sopravviverebbe a un aggiornamento del sistema operativo?
Tom,


1

Dalla 10.5 in poi, OS X viene fornito con un nuovo firewall orientato all'applicazione anziché ipfw. Ma ipfw è ancora installato. Se hai problemi con la sua sintassi, controlla frontend grafici come WaterRoofo Flying Buttress.

HTH, PEra


1

l'ordine delle regole è importante, assicurati che non ci sia "nega tutto" prima di consentire le regole o qualcosa del genere.


Grazie per il consiglio ma non credo di avere quel particolare problema (l'elenco ipfw mostra solo la mia regola e 65535 allow ip from any to any).
nafe

1

Il tuo comando sembra mancare un numero di regola; provare:

ipfw add 100 fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(se non si esegue come root, è necessario prefissarlo con sudo). Un'altra cosa da verificare è che il firewall sia abilitato:

sysctl net.inet.ip.fw.enable

Se ritorna con il valore 0 (off), accenderlo con:

sysctl -w sysctl net.inet.ip.fw.enable=1

... e quindi predisporre la riabilitazione al riavvio del computer. Il modo "corretto" per farlo è probabilmente quello di creare un oggetto lanciato ( Lingon lo rende abbastanza facile). O semplicemente usa uno degli strumenti della GUI menzionati da PEra e lascia che si occupi dei dettagli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.