Macos NAT2: различия между версиями
Материал из noname.com.ua
Перейти к навигацииПерейти к поискуSirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
| Строка 34: | Строка 34: | ||
=Подключить anchor из <code>pf.conf</code>= |
=Подключить anchor из <code>pf.conf</code>= |
||
| − | /etc/pf.conf (добавьте строки, не ломая apple-якоря): |
+ | <code>/etc/pf.conf</code> (добавьте строки, не ломая apple-якоря): |
| + | <PRE> |
||
| − | |||
anchor "nat-utun" |
anchor "nat-utun" |
||
load anchor "nat-utun" from "/etc/pf.anchors/nat-utun" |
load anchor "nat-utun" from "/etc/pf.anchors/nat-utun" |
||
| + | </PRE> |
||
| − | Включите форвардинг разово |
+ | =Включите форвардинг разово= |
| + | до перезагрузки |
||
<PRE> |
<PRE> |
||
sudo sysctl -w net.inet.ip.forwarding=1 |
sudo sysctl -w net.inet.ip.forwarding=1 |
||
</PRE> |
</PRE> |
||
| + | =Полезно= |
||
| − | |||
проверка синтаксиса |
проверка синтаксиса |
||
| + | <PRE> |
||
sudo pfctl -nf /etc/pf.conf |
sudo pfctl -nf /etc/pf.conf |
||
| + | </PRE> |
||
загрузить правила |
загрузить правила |
||
| + | <PRE> |
||
sudo pfctl -f /etc/pf.conf |
sudo pfctl -f /etc/pf.conf |
||
| + | </PRE> |
||
| − | + | включить pf (если был выключен) |
|
| ⚫ | |||
| + | <PRE> |
||
| ⚫ | |||
| ⚫ | |||
| − | |||
| + | </PRE> |
||
| − | Что с изменениями адреса/интерфейса |
||
| ⚫ | |||
| − | |||
| + | </PRE> |
||
| − | Меняется IP на том же utun0 — ничего делать не нужно: -> (utun0) подхватит новый адрес автоматически. |
||
| + | sudo pfctl -sn |
||
| − | |||
| + | <PRE> |
||
| − | Меняется сам номер интерфейса (utun0 → utun2) — правила с $VPN_IF="utun0" уже не совпадут. Варианты: |
||
| ⚫ | |||
| − | |||
| + | <PRE> |
||
| − | Постараться закрепить один и тот же utun в вашем VPN-клиенте (часто получается). |
||
| + | sudo pfctl -s state -v |
||
| − | |||
| + | </PRE> |
||
| − | Лёгкий «апдейтер» интерфейса + перезагрузка pf на событие «VPN поднялся». Пример одноразовой команды, если нужно быстро переключиться: |
||
| − | |||
| − | VPN_IF=$(ifconfig -l | tr ' ' '\n' | awk '/^utun[0-9]+$/ {print; exit}') |
||
| − | sudo sed -i '' "s/^VPN_IF.*/VPN_IF = \"$VPN_IF\"/" /etc/pf.anchors/nat-utun |
||
| ⚫ | |||
| − | |||
| − | |||
| − | (Можно оформить это как скрипт «PostUp» вашего VPN-клиента.) |
||
| − | |||
| − | Частые грабли |
||
| − | |||
| − | Забытый () в -> (utun0) — именно тогда NAT «забывает» новый IP. |
||
| − | |||
| − | Нет net.inet.ip.forwarding=1 — клиенты из 192.168.22.0/24 не ходят «наружу». |
||
| − | |||
| − | Неправильно выбран LAN-интерфейс в pass in on … — форвардинг режется фильтром. |
||
| − | |||
| − | MDM/профили могут запрещать менять pf/форвардинг — тогда только через администратора. |
||
| − | |||
| − | Если скажете, какой у вас LAN-интерфейс (en0/en1/bridge0 и т.п.) и кто «вешает» VPN (WireGuard/OpenVPN/встроенный IKEv2), накину точный блок pass in/out и, при желании, минимальный launchd plist для автоприменения. |
||
Версия 12:49, 21 октября 2025
Mac OS NAT V2
Это порсто проверенный пример который работает, без особых подробностей
- pf нужно использовать динамическую подстановку адреса интерфейса — так NAT «подтянет» новый IP при переподключении VPN.
-> (utun0), а не -> utun0
- вынесите правила в отдельный anchor-файл и подключить его из
pf.conf
Отдельный файл с NAT
/etc/pf.anchors/nat-utun
# что транслируем - только адрес ноута
LAN_NET = "192.168.22.253/32"
VPN_IF = "utun0"
set skip on lo0 # не трогаем localhost
# NAT: адрес берётся динамически с интерфейса (в скобках!)
nat on $VPN_IF from $LAN_NET to any -> ($VPN_IF)
# Разрешим исходящий трафик из LAN в VPN
pass out on $VPN_IF inet proto { tcp udp icmp } from $LAN_NET to any keep state
# Если Mac роутит для вашей LAN: разрешите форвардинг с LAN-интерфейса (подставьте его имя)
# Например, если клиенты заходят через Wi-Fi интерфейс en0:
pass in on en0 inet from $LAN_NET to any keep state
pass out on $VPN_IF from $LAN_NET to any keep state
Скобки вокруг ($VPN_IF) — ключевое: pf будет автоматически использовать текущий адрес интерфейса, даже если он поменялся после переподключения VPN.
Подключить anchor из pf.conf
/etc/pf.conf (добавьте строки, не ломая apple-якоря):
anchor "nat-utun" load anchor "nat-utun" from "/etc/pf.anchors/nat-utun"
Включите форвардинг разово
до перезагрузки
sudo sysctl -w net.inet.ip.forwarding=1
Полезно
проверка синтаксиса
sudo pfctl -nf /etc/pf.conf
загрузить правила
sudo pfctl -f /etc/pf.conf
включить pf (если был выключен)
sudo pfctl -e
посмотреть NAT-правила
sudo pfctl -sn
посмотреть состояния/NAT <PRE> sudo pfctl -s state -v