Macos NAT2: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
| (не показано 5 промежуточных версий этого же участника) | |||
| Строка 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. Для них существуют разные «точки вставки»: |
||
| + | |||
| ⚫ | |||
| + | 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> |
||
| + | |||
| + | =RDR= |
||
| + | rdr = redirect — это перенаправление адреса/порта (по сути DNAT/порт-форвардинг). |
||
| + | <BR> |
||
| + | Применяется обычно на входящем интерфейсе: «если пришло на такой адрес/порт — отправь на другой адрес/порт». |
||
| + | |||
| + | Примеры: |
||
| + | |||
| + | * Проброс внешнего 2222 на локальный SSH: |
||
| + | <PRE> |
||
| + | rdr on $EXT_IF proto tcp from any to ($EXT_IF) port 2222 -> 127.0.0.1 port 22 |
||
| + | </PRE> |
||
| + | |||
| + | * Порт-форвард с интерфейса LAN на внутренний хост: |
||
| + | <PRE> |
||
| + | rdr on en0 proto tcp from any to 192.168.22.1 port 8443 -> 192.168.22.10 port 443 |
||
| + | </PRE> |
||
| + | |||
| + | Важно: rdr не автоматически разрешает трафик. Нужен соответствующий pass |
||
| + | |||
| + | ==Отличия nat vs rdr== |
||
| + | |||
| + | * NAT: меняет исходный адрес при исходящем трафике (SNAT/маскарадинг), напр. nat on $VPN_IF ... -> ($VPN_IF). |
||
| + | * RDR: меняет целевой адрес/порт при входящем трафике (DNAT/порт-форвард), напр. rdr on $EXT_IF ... -> 192.168.22.10 port 22. |
||
=Отдельный файл с NAT= |
=Отдельный файл с NAT= |
||
| Строка 36: | Строка 80: | ||
<code>/etc/pf.conf</code> (добавьте строки, не ломая apple-якоря): |
<code>/etc/pf.conf</code> (добавьте строки, не ломая apple-якоря): |
||
<PRE> |
<PRE> |
||
| − | anchor "nat-utun" |
+ | anchor "nat-utun-cato" |
| − | load anchor "nat-utun" from "/etc/pf.anchors/nat-utun" |
+ | load anchor "nat-utun-cato" from "/etc/pf.anchors/nat-utun-cato" |
</PRE> |
</PRE> |
||
| Строка 47: | Строка 91: | ||
=Полезно= |
=Полезно= |
||
| + | |||
| + | Стаус глобально |
||
| + | <PRE> |
||
| ⚫ | |||
| + | </PRE> |
||
| + | |||
| ⚫ | |||
| + | <PRE> |
||
| + | sudo pfctl -e |
||
| + | </PRE> |
||
| + | |||
проверка синтаксиса |
проверка синтаксиса |
||
<PRE> |
<PRE> |
||
sudo pfctl -nf /etc/pf.conf |
sudo pfctl -nf /etc/pf.conf |
||
</PRE> |
</PRE> |
||
| + | |||
загрузить правила |
загрузить правила |
||
<PRE> |
<PRE> |
||
sudo pfctl -f /etc/pf.conf |
sudo pfctl -f /etc/pf.conf |
||
</PRE> |
</PRE> |
||
| + | Лучше с отладкой |
||
| ⚫ | |||
<PRE> |
<PRE> |
||
| − | + | pfctl -v -f /etc/pf.conf |
|
</PRE> |
</PRE> |
||
| + | |||
| + | |||
посмотреть NAT-правила |
посмотреть NAT-правила |
||
| ⚫ | |||
| ⚫ | |||
<PRE> |
<PRE> |
||
| + | sudo pfctl -sn |
||
| + | </PRE> |
||
| + | |||
посмотреть состояния/NAT |
посмотреть состояния/NAT |
||
<PRE> |
<PRE> |
||
sudo pfctl -s state -v |
sudo pfctl -s state -v |
||
</PRE> |
</PRE> |
||
| + | |||
| + | # Все фильтрующие правила (pass/block) из всех якорей |
||
| + | sudo pfctl -sr -a '*' |
||
| + | |||
| + | # Все NAT и RDR из всех якорей |
||
| + | sudo pfctl -sn -a '*' |
||
| + | |||
| + | # Более подробный вывод (интерфейсы, счётчики, метки) |
||
| + | sudo pfctl -v -sr -a '*' |
||
| + | sudo pfctl -v -sn -a '*' |
||
| + | |||
| + | # Показать список загруженных якорей (навигация) |
||
| + | sudo pfctl -s anchors |
||
| + | |||
| + | # Показать только Apple-правила (пример) |
||
| + | sudo pfctl -sr -a 'com.apple/*' |
||
| + | sudo pfctl -sn -a 'com.apple/*' |
||
| + | Замечания: |
||
| + | |||
| + | «Совсем без привязки к якорям» как плоский единый список у pfctl нет — но -a '*' по сути раскрывает всё дерево. |
||
| + | |||
| + | -sr — фильтр (rules), -sn — NAT/RDR. Для полного обзора запустите оба. |
||
| + | |||
| + | Сообщение про ALTQ можно игнорировать на macOS (ALTQ не используется). |
||
Текущая версия на 13:16, 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"
RDR
rdr = redirect — это перенаправление адреса/порта (по сути DNAT/порт-форвардинг).
Применяется обычно на входящем интерфейсе: «если пришло на такой адрес/порт — отправь на другой адрес/порт».
Примеры:
- Проброс внешнего 2222 на локальный SSH:
rdr on $EXT_IF proto tcp from any to ($EXT_IF) port 2222 -> 127.0.0.1 port 22
- Порт-форвард с интерфейса LAN на внутренний хост:
rdr on en0 proto tcp from any to 192.168.22.1 port 8443 -> 192.168.22.10 port 443
Важно: rdr не автоматически разрешает трафик. Нужен соответствующий pass
Отличия nat vs rdr
- NAT: меняет исходный адрес при исходящем трафике (SNAT/маскарадинг), напр. nat on $VPN_IF ... -> ($VPN_IF).
- RDR: меняет целевой адрес/порт при входящем трафике (DNAT/порт-форвард), напр. rdr on $EXT_IF ... -> 192.168.22.10 port 22.
Отдельный файл с 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 -si
включить pf (если был выключен)
sudo pfctl -e
проверка синтаксиса
sudo pfctl -nf /etc/pf.conf
загрузить правила
sudo pfctl -f /etc/pf.conf
Лучше с отладкой
pfctl -v -f /etc/pf.conf
посмотреть NAT-правила
sudo pfctl -sn
посмотреть состояния/NAT
sudo pfctl -s state -v
- Все фильтрующие правила (pass/block) из всех якорей
sudo pfctl -sr -a '*'
- Все NAT и RDR из всех якорей
sudo pfctl -sn -a '*'
- Более подробный вывод (интерфейсы, счётчики, метки)
sudo pfctl -v -sr -a '*' sudo pfctl -v -sn -a '*'
- Показать список загруженных якорей (навигация)
sudo pfctl -s anchors
- Показать только Apple-правила (пример)
sudo pfctl -sr -a 'com.apple/*' sudo pfctl -sn -a 'com.apple/*' Замечания:
«Совсем без привязки к якорям» как плоский единый список у pfctl нет — но -a '*' по сути раскрывает всё дерево.
-sr — фильтр (rules), -sn — NAT/RDR. Для полного обзора запустите оба.
Сообщение про ALTQ можно игнорировать на macOS (ALTQ не используется).