
Я ищу эквивалентную команду Macos для Linux:
sudo iptables -t nat -A POSTROUTING -o en0 -j MASQUERADE
Причина, по которой я хочу это сделать, заключается в том, что у меня есть VPN с маршрутом по умолчанию, но я хотел бы, чтобы некоторые приложения работали по физическому каналу связи, а не через VPN.
Используя pfctl
я сделал следующее:
pass out route-to (en0 192.168.4.1) group skipvpn flags any
Где 192.168.4.1
ip моего шлюза, и он, похоже, направляет все пакеты из приложений в skipvpn
группе на en0
интерфейс (а не в туннель). Я проверяю это с помощьюtcpdump
Однако «исходные IP-адреса» всех перенаправленных пакетов по-прежнему имеют исходный IP-адрес VPN ( 10.0.0.0/8
диапазон IP-адресов), что, конечно же, приводит к сбоям (т. е. возвращающиеся пакеты никогда не смогут найти дорогу обратно).
В результате я попробовал получить nat
IP-адрес источника, используя это:
nat on en0 from any to any -> en0
Но это делаетНЕТпохоже, работает, но исходные IP-адреса по-прежнему не работают и не соответствуют исходному IP-адресу моего en0
интерфейса.
Как убедиться, что исходные IP-адреса для этих перенаправленных пакетов установлены правильно?
решение1
— Mac OS' Pf не сделает этого за вас. Вот почему:
Если бы вы взглянули на его руководство, вы бы обнаружили, чтоNAT происходитдофильтрация. Но правила NAT не поддерживают все разнообразие признаков, как правила фильтрации. А именно, нет способа проверить принадлежность сокета при выполнении NAT. Вы можете ограничить применимость правил NAT, скажем, исходными или целевыми IP-адресами, но не принадлежностью.
Еще одна вещь, которую следует упомянуть, этово время обработки NAT Pf выполняет обычный поиск маршрута. Это значит, что у вас вообще ничего не получится — пакеты маршрутизируются в соответствии с таблицей маршрутизации ядра в этот момент. В вашем случае они направляются для отправки через интерфейс маршрута по умолчанию, который является интерфейсом VPN. И они будут использовать адрес интерфейса VPN в качестве своих исходных IP-адресов — что неудивительно для обычного поиска маршрутов, но, очевидно, не соответствует вашему плану.nat on en0
Кратко обобщим противоречия:
- Если вы не используете NAT, у вас будет неправильный исходный IP при
route-to
применении - Ваше правило NAT должно быть установлено на интерфейсе маршрутизации по умолчанию (VPN) при изменении исходного IP на IPне-VPNинтерфейс, например:
nat on vpn0 … -> (en0)
- Но с другой стороны, вы не можете иметь настраиваемый NAT (по владельцу), и если вы все равно используете NAT, то трафик, который должен проходить через VPN, будет иметь неправильный исходный IP-адрес.
P.S. Фактическое положение дел в Pf Mac OS таково:еще хуже. После завершения NAT сопоставление прав собственности также не будет работать в правилах фильтрации.