Consegui negar todas as conexões com redes externas, a menos que minha conexão OpenVPN esteja ativa usando o pf.conf. No entanto, perco a conectividade Wi-Fi se a conexão for interrompida fechando e abrindo a tampa do laptop ou alternando o Wi-Fi novamente.
- Estou no Mac OS 10.8.1.
- Eu me conecto à Web via Wi-Fi (de vários locais, incluindo Wi-Fi público).
- A conexão OpenVPN é configurada com viscosidade.
Eu tenho as seguintes regras de filtro de pacotes configuradas em /etc/pf.conf
# Deny all packets unless they pass through the OpenVPN connection
wifi=en1
vpn=tun0
block all
set skip on lo
pass on $wifi proto udp to [OpenVPN server IP address] port 443
pass on $vpn
Inicio o serviço de filtro de pacotes sudo pfctl -e
e carrego as novas regras sudo pfctl -f /etc/pf.conf
.
Também editei /System/Library/LaunchDaemons/com.apple.pfctl.plist
e alterei a linha <string>-f</string>
para ler, <string>-ef</string>
para que o filtro de pacotes seja iniciado na inicialização do sistema.
Tudo isso parece funcionar muito bem no começo: os aplicativos só podem se conectar à Web se a conexão OpenVPN estiver ativa; portanto, nunca estou vazando dados por uma conexão insegura.
Mas, se eu fechar e reabrir a tampa do laptop ou desligar e ligar o Wi-Fi novamente, a conexão Wi-Fi será perdida e vejo um ponto de exclamação no ícone Wi-Fi na barra de status. Clicar no ícone Wi-Fi mostra a mensagem "Alerta: sem conexão à Internet":
Para recuperar a conexão, preciso desconectar e reconectar o Wi-Fi, às vezes cinco ou seis vezes, antes que a mensagem "Alerta: sem conexão à Internet" desapareça e eu possa abrir a conexão VPN novamente. Outras vezes, o alerta de Wi-Fi desaparece por conta própria, o ponto de exclamação é apagado e eu consigo me conectar novamente. De qualquer forma, pode levar cinco minutos ou mais para se conectar novamente, o que pode ser frustrante.
A remoção da linha block all
resolve o problema (mas permite conexões não seguras), pelo que parece que estou bloqueando um serviço que a Apple precisa para recuperar e confirmar uma conexão Wi-Fi. Eu tentei:
- Ativando o icmp adicionando
pass on $wifi proto icmp all
ao pf.conf - Habilitando a resolução DNS adicionando
pass on $wifi proto udp from $wifi to any port 53
- Tentando aprender mais registrando pacotes bloqueados (alterando
block all
parablock log all
), mas o log parece estar desativado no OS X, porque fazersudo tcpdump -n -e -ttt -i pflog0
para ver o log resulta em "tcpdump: pflog0: esse dispositivo não existe".
Nada disso ajuda a restabelecer uma conexão Wi-Fi mais rapidamente.
O que mais posso fazer para determinar qual serviço precisa estar disponível para recuperar a conectividade Wi-Fi ou que regra devo adicionar ao pf.conf para tornar as reconexões Wi-Fi mais confiáveis?
fonte
Respostas:
Ao monitorar as conexões de rede usando o Little Snitch, descobri que a Apple usa o aplicativo mDNSResponder em segundo plano para verificar se a conexão Wi-Fi está disponível. O mDNSResponder envia pacotes UDP aos servidores de nomes para verificar a conectividade e resolver nomes de host para IPs.
Alterar a regra UDP que eu tinha anteriormente para permitir todos os pacotes UDP via Wi-Fi permite que o mDNSResponder se conecte, o que significa que o Wi-Fi agora se reconecta pela primeira vez após uma desconexão. Caso isso ajude outras pessoas no futuro, meu pf.conf final, incluindo as regras padrão da Apple para o Mountain Lion, fica assim:
Isso significa que agora os dados podem ser vazados pelo Wi-Fi pelo pequeno número de aplicativos que usam o protocolo UDP, infelizmente, como o ntpd (para sincronização de horário) e o mDNSResponder. Mas isso ainda parece melhor do que permitir que os dados viajem desprotegidos pelo TCP, que é o que a maioria dos aplicativos usa. Se alguém tiver alguma sugestão para melhorar essa configuração, comentários ou respostas adicionais serão bem-vindos.
fonte
Você não precisa permitir todos os UDP. O 'm' no mDNS significa 'multicast' e usa um endereço IP de destino multicast específico chamado "endereço local de multicast do link" e um
UDP
número de porta5353
.Isso significa que, na sua solução acima, você está desnecessariamente permitindo que o tráfego em todas as portas 65535 UDP para todos os endereços IP roteáveis de 3,7 bilhões de milhões no mundo ignore sua VPN. Você ficaria surpreso com o número de aplicativos que usam o UDP, portanto, você está derrotando significativamente o objetivo da sua ideia original de impedir o tráfego de saída quando a VPN está inoperante.
Por que não usar esta regra:
pass on $wifi proto udp to 224.0.0.251 port 5353
Uma regra prática muito importante na configuração do firewall - ao fazer exceções no firewall, tente sempre usar a regra mais específica possível. Às vezes, a especificidade ocorre às custas da conveniência e da facilidade de uso, ou seja, você pode descobrir que existe algum outro protocolo local de link que precisa ser liberado e adicionar mais uma regra específica.
Se você alternar na regra acima e descobrir que o problema original do wifi retorna, seu PF pode estar bloqueando o DHCP, o protocolo usado para configurar automaticamente os endereços IP dos seus dispositivos de rede. (em uma rede doméstica, normalmente o seu roteador de banda larga seria o servidor DHCP). A regra que você precisaria para permitir o DHCP seria:
pass on $wifi proto udp from 0.0.0.0 port 68 to 255.255.255.255 port 67
* Nota: pode ser necessário substituir
0.0.0.0
paraany
. ODHCPREQUEST
pacote que o seu computador envia pela primeira vez tem um endereço de origem0.0.0.0
porque, nessa fase, o computador ainda não tem um endereço IP.Para ser sincero, eu me inclinaria mais para usar
any
. Outra opção é extrair qualquer especificação de fonte, ou sejapass on $wifi proto udp to 255.255.255.255 port 67
, mas isso significa que perdemos a parte da regra da porta de origem, e ser o mais específico possível é sempre a opção mais segura.Espero que ajude. Aqui estão alguns links úteis:
mDNS: http://en.wikipedia.org/wiki/Multicast_DNS#Packet_structure
DHSP: http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol#DHCP_discovery
fonte
Isso me deu informações suficientes para dar o grande salto e usar o pf.conf. Aqui está o que eu uso no meu 10.8 para reconectá-lo após a queda da conexão VPN:
(Eu só uso ethernet, mas você pode alterar $ lan por $ wifi e deve funcionar)
fonte
Com o objetivo de criar as regras de PF de uma maneira "fácil", identificando as interfaces ativas existentes, incluindo as interfaces atuais (vpn), este pequeno programa de interrupção pode ser usado,
Ainda está em andamento, mas pode ser um bom começo para identificar IP externo e interfaces ativas, a fim de criar corretamente as regras de firewall.
exemplo ou saída usando a
-i
opção (info):Passando o ip do servidor
-ip
:Está longe de ser perfeito, mas o trabalho está em andamento. Mais informações / código podem ser encontrados aqui: https://github.com/vpn-kill-switch/killswitch
fonte
- Como adição -
Você pode adicionar esta linha:
para permitir que o mDNS opere no ipv6
fonte