iptables equivalente para mac os x

53

Desejo encaminhar solicitações de 192.168.99.100:80 para 127.0.0.1:8000 . É assim que eu faço 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 comandos ipfw sem muito sucesso:

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

(O sucesso para mim está apontando um navegador em http://192.168.99.100 e obtendo uma resposta de um servidor de desenvolvimento que estou executando em localhost:8000 )

    
por nafe 13.01.2010 / 20:46

7 respostas

32

Então eu descobri uma maneira de fazer isso. Eu não tenho certeza se é o caminho preferido, mas funciona! Na sua concha favorita:

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

(O alias para lo0 parece ser a parte que falta)

Se você quiser que um domínio (falso) aponte para esse novo alias, verifique se / etc / hosts contém a linha:

10.0.0.1 www.your-domain.com
    
por 24.01.2010 / 00:34
22

Consegui fazer isso funcionar usando os comandos ifconfig e pfctl no Mac 10.10.2. Com a abordagem a seguir, estou mapeando com êxito 127.0.0.1:3000 para mydomain.com localmente em minha máquina.

Na sua linha de comando, insira os dois comandos a seguir para encaminhar conexões para 127.0.0.1:3000 to 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 -

Em seguida, edite seu arquivo /etc/hosts ou /private/etc/hosts e adicione a seguinte linha para mapear seu domínio para 10.0.0.1 .

10.0.0.1 mydomain.com

Depois de salvar seu arquivo de hosts, esvazie seu DNS local:

sudo discoveryutil udnsflushcaches

Agora abra mydomain.com em um navegador e você verá o servidor hospedado em sua porta de host local (por exemplo, 127.0.0.1:3000 ). Basicamente, esse processo mapeia um <ip>:<port> para um novo <ip> , para que você possa mapear um host com IP.

    
por 06.03.2015 / 17:24
3

Isso funcionou bem para mim:

  • Ativar firewall por meio das Preferências do sistema
  • Crie o arquivo de inicialização do ipfw conforme descrito aqui: link
  • Adicione a seguinte linha ao arquivo de inicialização, conforme descrito aqui: link

    add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in

por 05.08.2013 / 17:50
3

Eu também tive que fazer uma coisa semelhante recentemente e, na busca, encontrei essa resposta. Infelizmente, a resposta do Nafe usa ipfw , que agora está obsoleto e indisponível no OSX; e a resposta de Kevin Leary é realmente um pouco hackish. 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 em esta questão .

Como OP menciona, apontar um navegador para 192.168.99.100 deve receber uma resposta de um servidor em localhost: 8000. Adicionar um alias a ifconfig não é realmente necessário, pfctl sozinho é suficiente: para conseguir isso, o arquivo pf.conf em /etc/pf.conf precisa ser modificado.

Primeiro, criamos (com sudo) um novo arquivo â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 precisa ser referenciado no arquivo pf.conf . Abra o arquivo pf.conf 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 ficar:

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, em seguida, sudo pfctl -fe /etc/pf.conf para 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 mencionada menciona que 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:

<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 ser feito.

Advertência : A Apple não permite mais alterar os arquivos de defesa do demônio da mesma forma (não com sudo, nem chmod, nem qualquer outra coisa). A maneira somente é mexer no sistema Configurações de proteção de integridade : inicialize no modo de recuperação e inicie o terminal. Verifique o status do SIP com csrutil status , ele geralmente deve estar ativado. Desative-o com csrutil disable e reinicialize no modo normal e faça as alterações no arquivo plist conforme discutido acima. Uma vez feito isso, volte ao modo de recuperação e reative a proteção (ela está em vigor por um bom motivo) emitindo csrutil enable .

Explicação: Pode-se verificar emitindo o comando ifconfig que 127.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 basta usar o endereço padrão no arquivo pf.conf .

UPDATE: Infelizmente, parece que carregar o arquivo na inicialização não funciona. Ainda estou tentando obter ajuda para resolver o problema. Até lá, executar sudo pfctl -f /etc/pf.conf após o início é o truque.

    
por 02.07.2016 / 17:03
1

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 como WaterRoof ou Flying Buttress .

HTH, PEra

    
por 13.01.2010 / 21:10
1

A ordem das regras é importante, certifique-se de que não haja "negar tudo" antes das regras de permissão ou algo assim.

    
por 13.01.2010 / 22:06
1

Seu comando parece estar perdendo um número de regra; tente:

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

(se você não estiver rodando como root, você terá que prefixar com sudo). Outra coisa a verificar é que o firewall está ativado:

sysctl net.inet.ip.fw.enable

Se voltar com o valor 0 (desligado), ligue-o com:

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

... e depois providencie para que seja reativado quando o computador for reinicializado. A maneira "correta" de fazer isso é provavelmente criar um item launchd ( Lingon torna isso bastante fácil). Ou apenas use uma das ferramentas GUI mencionadas por PEra e deixe que ela cuide dos detalhes.

    
por 14.01.2010 / 07:45