Как сделать IP маскарадинг на MacOS 10.14+?

Я ищу эквивалентную команду 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

Однако 'исходные ips' всех пакетов, которые были перенаправлены, все еще имеют исходный ip VPN (10.0.0.0/8 range-ip), что, конечно, приводит к поломке (т. е. возвращающиеся пакеты не могут найти дорогу назад...)

В результате я попытался nat Исходный IPS с помощью этого:

nat on en0 from any to any -> en0

Но это, похоже, не работает, исходные IP-адреса все еще сломаны, и не соответствуют исходному IP моего en0 интерфейс.

Как я могу убедиться, что исходные ips установлены правильно для этих перенаправленных пакетов?

0 ответов

- Mac OS' Pf не сделает это за вас. Вот почему:

Если вы посмотрите его руководство, вы обнаружите, что NAT происходит до фильтрации. Но правила NAT не поддерживают все разнообразие меток, как правила фильтрации. А именно, нет способа проверить владение сокетом при выполнении NAT. Вы можете ограничить применимость правил NAT, скажем, IP-адресами источника или назначения, но не владением.

Еще одна вещь, которую стоит упомянуть, это то, что во время обработки NAT Pf выполняет поиск обычного маршрута. Это означает, что у вас не будет nat on en0 работает вообще - в этот момент пакеты маршрутизируются в соответствии с таблицей маршрутизации ядра. В вашем случае они отправляются для отправки через интерфейс маршрута по умолчанию, который является интерфейсом VPN. И они будут использовать адрес интерфейса VPN в качестве исходного IP-адреса - что неудивительно для обычного поиска маршрутов, но, очевидно, не соответствует вашему плану.

Чтобы подвести итог противоречия, вкратце:

  • Если вы не делаете NAT, у вас неправильный IP-адрес источника, когда route-to применяется
  • Ваше правило NAT должно быть установлено на интерфейсе маршрута по умолчанию (VPN) при изменении исходного IP-адреса на IP не-VPN- интерфейса, например: nat on vpn0 … -> (en0)
  • Но, OTOH, у вас не может быть собственного NAT (по собственному праву), и если вы все равно делаете NAT, то трафик, который должен проходить через VPN, будет иметь неправильный IP-адрес источника.

PS Фактическое положение вещей в Mac OS Pf еще хуже. После того, как NAT завершен, сопоставление прав собственности не будет работать и в правилах фильтрации.

Другие вопросы по тегам