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