Eu também tive que fazer uma coisa semelhante recentemente, e na busca encontrei esta resposta. Infelizmente, a resposta dos usos do Nafe, ipfw
que agora está obsoleta e indisponível no OSX; e a resposta de Kevin Leary é realmente um pouco tola. Então eu tive que fazer algo melhor (mais limpo) e decidi compartilhá-lo aqui para a posteridade. Esta resposta é amplamente baseada na abordagem mencionada nesta essência .
Como o OP menciona, apontar um navegador para 192.168.99.100 deve obter uma resposta de um servidor em localhost: 8000. Adicionar um alias a ifconfig
não é realmente necessário, por pfctl
si só é suficiente: para conseguir isso, o pf.conf
arquivo /etc/pf.conf
precisa ser modificado.
Primeiro criamos (com sudo) um novo arquivo de âncora (vamos chamá-lo redirection
) em: /etc/pf.anchors/redirection
. Este é basicamente um arquivo de texto regular e contém a seguinte linha (assim como na resposta de Kevin Leary): rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000
. Depois que o novo arquivo âncora for criado, ele precisará ser referenciado dentro do pf.conf
arquivo. Abra o pf.conf
arquivo com sudo e adicione rdr-anchor "redirection"
após a última linha rdr-anchor (que é rdr-anchor "com.apple/*"
) e adicione load anchor "redirection" from "/etc/pf.anchors/redirection"
no final.
Por fim, é assim que o arquivo pf.conf deve se parecer:
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 é quase isso. Basta reiniciar pfctl
emitindo sudo pfctl -d
para desativá-lo primeiro e depois sudo pfctl -fe /etc/pf.conf
iniciá-lo novamente.
Agora, se você precisar que isso aconteça automaticamente após cada reinicialização, outro pequeno trabalho precisará ser feito: o daemon de inicialização pfctl
precisa ser atualizado (a essência referenciada menciona que o pf é ativado automaticamente na inicialização, no entanto, isso não parece ser caso de olhar para o código). Abra (com sudo) System/Library/LaunchDaemons/com.apple.pfctl.plist
e procure o seguinte:
<array>
<string>pfctl</string>
<string>-f</string>
<string>/etc/pf.conf</string>
</array>
e adicione a linha <string>-e</string>
para torná-lo assim:
<array>
<string>pfctl</string>
<string>-e</string>
<string>-f</string>
<string>/etc/pf.conf</string>
</array>
Isso deve resolver.
Advertência : A Apple não permite mais alterar os arquivos demon de inicialização assim (não com sudo, nem chmod, nem qualquer outra coisa). A única maneira é mexer com as configurações da Proteção de integridade do sistema : inicialize no modo de recuperação e inicie o terminal. Verifique o status do SIP com csrutil status
, geralmente ele deve estar ativado. Desative-o csrutil disable
e reinicie-o no modo normal e faça as alterações no arquivo plist conforme discutido acima. Depois de concluído, volte ao modo de recuperação e reative a proteção (está em vigor por um bom motivo) emitindo csrutil enable
.
Explicação: Pode-se verificar emitindo o ifconfig
comando que 127.0.0.1
já é o alias (padrão) para localhost lo0 - esse fato está sendo usado para evitar a necessidade de adicionar um alias extra para localhost e simplesmente usar o endereço padrão no pf.conf
arquivo.
ATUALIZAÇÃO: Infelizmente, parece que carregar o arquivo na inicialização não funciona. Ainda estou tentando obter ajuda para classificá-lo. Até lá, correr sudo pfctl -f /etc/pf.conf
depois de iniciar faz o truque.