Anch'io ho dovuto fare una cosa simile di recente, e nella ricerca è arrivata questa risposta. Sfortunatamente, la risposta di Nafe utilizza ipfw
che 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 ifconfig
non è davvero necessario, pfctl
da solo è sufficiente: per raggiungere questo obiettivo il pf.conf
file /etc/pf.conf
deve 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.conf
file. Apri il pf.conf
file 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 pfctl
emettendo sudo pfctl -d
per disabilitarlo prima e poi sudo pfctl -fe /etc/pf.conf
per riavviarlo.
Ora, se è necessario che ciò avvenga automaticamente dopo ogni riavvio, è necessario eseguire un altro pezzettino di lavoro: il daemon di avvio per pfctl
deve 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.plist
e 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 disable
e 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 ifconfig
comando 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.conf
file.
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.conf
dopo l'avvio fa il trucco.