Macos NAT2: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 7: Строка 7:
 
** <code>-> (utun0), а не -> utun0 </code>
 
** <code>-> (utun0), а не -> utun0 </code>
 
* вынесите правила в отдельный anchor-файл и подключить его из <code>pf.conf</code>
 
* вынесите правила в отдельный anchor-файл и подключить его из <code>pf.conf</code>
  +
  +
=Что такое «якорь» (anchor) в pf?=
  +
  +
Это контейнер/группа правил внутри дерева pf.
  +
Нужен, чтобы модульно подключать свои правила, не правя системный /etc/pf.conf.
  +
  +
В macOS есть три дерева: фильтры, NAT и RDR. Для них существуют разные «точки вставки»:
  +
  +
<PRE>
  +
anchor "name/*" — для фильтров (pass/block).
  +
nat-anchor "name/*" — для NAT.
  +
rdr-anchor "name/*" — для RDR (перенаправления/порт-форварда).
  +
</PRE>
  +
Обычно в /etc/pf.conf объявляют точки вставки и подключают файл:
  +
<PRE>
  +
anchor "nat-utun-cato/*"
  +
nat-anchor "nat-utun-cato/*"
  +
rdr-anchor "nat-utun-cato/*"
  +
load anchor "nat-utun-cato" from "/etc/pf.anchors/nat-utun-cato"
  +
</PRE>
   
 
=Отдельный файл с NAT=
 
=Отдельный файл с NAT=

Версия 13:11, 21 октября 2025


Mac OS NAT V2

Это порсто проверенный пример который работает, без особых подробностей

  • pf нужно использовать динамическую подстановку адреса интерфейса — так NAT «подтянет» новый IP при переподключении VPN.
    • -> (utun0), а не -> utun0
  • вынесите правила в отдельный anchor-файл и подключить его из pf.conf

Что такое «якорь» (anchor) в pf?

Это контейнер/группа правил внутри дерева pf. Нужен, чтобы модульно подключать свои правила, не правя системный /etc/pf.conf.

В macOS есть три дерева: фильтры, NAT и RDR. Для них существуют разные «точки вставки»:

anchor "name/*" — для фильтров (pass/block).
nat-anchor "name/*" — для NAT.
rdr-anchor "name/*" — для RDR (перенаправления/порт-форварда).

Обычно в /etc/pf.conf объявляют точки вставки и подключают файл:

anchor "nat-utun-cato/*"
nat-anchor "nat-utun-cato/*"
rdr-anchor "nat-utun-cato/*"
load anchor "nat-utun-cato" from "/etc/pf.anchors/nat-utun-cato"

Отдельный файл с 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-cato"
load anchor "nat-utun-cato" from "/etc/pf.anchors/nat-utun-cato"

Включите форвардинг разово

до перезагрузки

sudo sysctl -w net.inet.ip.forwarding=1

Полезно

проверка синтаксиса

sudo pfctl -nf /etc/pf.conf

загрузить правила

sudo pfctl -f  /etc/pf.conf

Лучше с отладкой

pfctl -v -f /etc/pf.conf  

включить pf (если был выключен)

sudo pfctl -e

посмотреть NAT-правила

sudo pfctl -sn

посмотреть состояния/NAT

sudo pfctl -s state -v