Как выполнить IP-маскировку на MacOS 10.14+?

Как выполнить 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.1ip моего шлюза, и он, похоже, направляет все пакеты из приложений в skipvpnгруппе на en0интерфейс (а не в туннель). Я проверяю это с помощьюtcpdump

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

В результате я попробовал получить natIP-адрес источника, используя это:

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 сопоставление прав собственности также не будет работать в правилах фильтрации.

Связанный контент