Quero encaminhar solicitações de 192.168.99.100:80
para 127.0.0.1:8000
. É assim que eu faria no 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
Como faço a mesma coisa no MacOS X? Eu tentei uma combinação de ipfw
comandos sem muito sucesso:
ipfw add fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80
(Sucesso para mim é apontar um navegador para http://192.168.99.100
e obter uma resposta de um servidor de desenvolvimento em execução localhost:8000
)
Então eu descobri uma maneira de fazer isso. Não tenho certeza se é a maneira preferida, mas funciona! No seu shell favorito:
(O alias para
lo0
parece ser a parte que faltava)Se você quiser que um domínio (falso) aponte para esse novo alias, certifique-se de que /etc/hosts contenha a linha:
Consegui fazer isso funcionar usando os comandos
ifconfig
epfctl
no Mac 10.10.2. Com a abordagem a seguir, estou mapeando com sucesso127.0.0.1:3000
paramydomain.com
localmente na minha máquina.Em sua linha de comando, digite os dois comandos a seguir para encaminhar conexões
127.0.0.1:3000
para10.0.0.1
:Em seguida, edite seu arquivo
/etc/hosts
ou/private/etc/hosts
e adicione a seguinte linha para mapear seu domínio para10.0.0.1
.Depois de salvar seu arquivo hosts, limpe seu DNS local:
Agora abra
mydomain.com
em um navegador e você verá o servidor hospedado em sua porta localhost (ou seja,127.0.0.1:3000
). Basicamente, esse processo mapeia um<ip>:<port>
para um novo<ip>
para que você possa mapear um host desse IP.Eu também tive que fazer uma coisa semelhante recentemente e, ao pesquisar, encontrei essa resposta. Infelizmente, a resposta do Nafe usa
ipfw
que agora está obsoleta e indisponível no OSX; e a resposta de Kevin Leary é de fato um pouco hackish. Então tive que fazer algo melhor (mais limpo) e resolvi compartilhar 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,pfctl
por si só é suficiente: para conseguir isso, opf.conf
arquivo em/etc/pf.conf
precisa ser modificado.Primeiro criamos (com sudo) um novo arquivo âncora (vamos chamá-lo de
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
. Uma vez que o novo arquivo âncora foi criado, ele precisa ser referenciado dentro dopf.conf
arquivo. Abra opf.conf
arquivo com sudo e adicionerdr-anchor "redirection"
após a última linha rdr-anchor (que érdr-anchor "com.apple/*"
) e adicioneload anchor "redirection" from "/etc/pf.anchors/redirection"
no final.Por fim, é assim que o arquivo pf.conf deve se parecer:
E é quase isso. Basta reiniciar
pfctl
emitindosudo pfctl -d
para desativá-lo primeiro e depoissudo 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 precisa ser feito: o daemon de inicialização para
pfctl
precisa ser atualizado (a essência referenciada menciona que o pf é ativado automaticamente na inicialização, no entanto, isso não parece ser o caso de olhar para o código). Abra (com sudo)System/Library/LaunchDaemons/com.apple.pfctl.plist
e procure por isso:e adicione a linha
<string>-e</string>
para que fique assim:Isso deve resolver.
Advertência : a Apple não permite mais alterar os arquivos demon de lançamento assim (não com sudo, nem chmod, nem qualquer outra coisa). A única maneira é mexer nas 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-ocsrutil disable
e reinicie no modo normal e, em seguida, faça as alterações no arquivo plist conforme discutido acima. Uma vez feito, volte ao modo de recuperação e reative a proteção (está em vigor por um bom motivo) emitindocsrutil enable
.Explicação: Pode-se verificar emitindo o
ifconfig
comando que127.0.0.1
já é o alias (padrão) para localhost lo0 - este fato está sendo usado para evitar a necessidade de adicionar um alias extra para localhost e simplesmente usar o endereço padrão nopf.conf
arquivo.ATUALIZAÇÃO: Infelizmente, parece que carregar o arquivo na inicialização não funciona. Ainda estou tentando obter ajuda para resolvê-lo. Até então, correr
sudo pfctl -f /etc/pf.conf
após a inicialização faz o truque.Isto funcionou bem para mim:
Adicione a seguinte linha ao arquivo de inicialização, conforme descrito aqui: http://xeiam.com/port-forwarding-80-to-8080-using-ipfw-on-mac-os-x/
add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in
A partir de 10.5, o OS X vem com um novo firewall orientado a aplicativos em vez de
ipfw
. Mas o ipfw ainda está instalado. Se você tiver problemas com sua sintaxe, confira frontends gráficos comoWaterRoof
ouFlying Buttress
.HTH, PE
ordem das regras é importante, certifique-se de que não há "negar tudo" antes de permitir as regras, ou algo assim.
Seu comando parece estar faltando um número de regra; tentar:
(se você não estiver executando como root, terá que prefixá-lo com sudo). Outra coisa a verificar é se o firewall está habilitado:
Se voltar com o valor 0 (desligado), ligue-o com:
... e, em seguida, providencie para que ele seja reativado quando o computador for reinicializado. A maneira "correta" de fazer isso é provavelmente criar um item iniciado ( Lingon torna isso bastante fácil). Ou apenas use uma das ferramentas GUI mencionadas pelo PEra e deixe que ele cuide dos detalhes.