
Estou procurando o comando Macos equivalente ao Linux:
sudo iptables -t nat -A POSTROUTING -o en0 -j MASQUERADE
Quero fazer isso porque tenho uma VPN que tem a rota padrão, mas gostaria que determinados aplicativos passassem pelo uplink físico em vez da VPN.
Usando pfctl
eu fiz o seguinte:
pass out route-to (en0 192.168.4.1) group skipvpn flags any
Onde 192.168.4.1
está o IP do meu gateway e parece rotear todos os pacotes dos aplicativos do skipvpn
grupo para a en0
interface (em vez do túnel). Eu verifico isso usandotcpdump
No entanto, os 'ips de origem' de todos os pacotes que foram redirecionados ainda têm o IP de origem da VPN (um 10.0.0.0/8
range-ip), fazendo com que as coisas quebrem, é claro (ou seja, os pacotes que retornam nunca conseguem encontrar o caminho de volta.)
Como resultado, tentei nat
os ips de origem usando isto:
nat on en0 from any to any -> en0
Mas isso fazNÃOparecem funcionar, os IPs de origem ainda estão quebrados e não correspondem ao IP de origem da minha en0
interface.
Como posso garantir que os IPs de origem estejam configurados corretamente para esses pacotes redirecionados?
Responder1
- O Pf do Mac OS não fará isso por você. Aqui está o porquê:
Se você desse uma olhada no manual, descobriria queNAT está acontecendoantesfiltragem. Mas as regras NAT não suportam toda a variedade de marcas como as regras de filtragem. Ou seja, não há como verificar a propriedade do soquete ao fazer o NAT. Você pode restringir a aplicabilidade das regras NAT com, digamos, IPs de origem ou destino, mas não com propriedade.
Outra coisa a mencionar édurante o processamento NAT Pf está fazendo busca de rota normal. Isso significa que você não terá nenhum trabalho — os pacotes são roteados de acordo com a tabela de roteamento do kernel naquele momento. No seu caso, eles são despachados para serem enviados através da interface da rota padrão, que é a interface VPN. E eles usariam o endereço da interface VPN como seus IPs de origem - o que não é surpreendente para pesquisas normais de rotas, mas obviamente não está de acordo com o seu plano.nat on en0
Para resumir as contradições, brevemente:
- Se você não fizer o NAT, você terá o IP de origem errado quando
route-to
for aplicado - Sua regra NAT deve ser definida na interface de rota padrão (VPN) ao alterar o IP de origem para IP denão VPNinterface, como:
nat on vpn0 … -> (en0)
- Mas OTOH você não pode ter NAT personalizado (por propriedade) e se você fizer NAT de qualquer maneira, o tráfego que deveria passar via VPN teria o IP de origem errado.
PS O estado real das coisas no Pf do Mac OS épior ainda. Depois que o NAT for concluído, a correspondência de propriedade também não funcionará nas regras de filtragem.