В pf, почему IPv6 может быть указан как «протокол», а также как семейство адресов?

602
Stilez

В брандмауэре pf раздел man-страницы pf.conf указывает на то, что "protocol"это что-то из этого /etc/protocols, и что оно отличается от "address family"( "<af>"), которое является inet или inet6. /etc/protocolsв свою очередь, включает в себя «IPv6» в качестве протоколов, а в приложениях, основанных на BSD, таких как брандмауэр pfSense, IPv6 иногда указывается в качестве протокола в отличие от семейства IP (например, в определениях правил NAT).

Но IPv6 не является протоколом в том смысле, как это делают tcp / udp / icmp. Существует четкое логическое и функциональное различие между IPv4 / IPv6 как двумя семействами IP-адресов (базовый транспорт) и многими протоколами, транспортируемыми в IPv4 / IPv6.

(Если бы это было тогда
nat on em1 inet proto ipv6 from 1.2.3.4 to any -> 5.6.7.8 port 2000:2999и
block drop in inet proto ipv6 from 1.2.3.4 to any
было бы значимым и сопоставимым с
nat on em1 inet proto tcp from 1.2.3.4 to any -> 5.6.7.8 port 2000:2999и
block drop in inet proto tcp from 1.2.3.4 to any)

Когда IPv6 будет иметь смысл или использоваться в поле «протокол» в правиле PF, в отличие от указания его в качестве семейства адресов? (И может ли NAT почти всегда использоваться только для IPv4, иметь какое-либо отношение к нему?)

2

1 ответ на вопрос

2
grawity

IPv6 - это протокол в том смысле, что TCP / UDP / ICMP. Несмотря на то, что они работают на разных уровнях, ничто не мешает вам размещать IP поверх IP, чтобы получить простой VPN-подобный туннель. (Сравните это с IP внутри GRE внутри IP.) По этой причине и IPv4, и IPv6 имеют присвоения номеров протоколов - вложенный пакет IPv4 - это «протокол 4», IPv6 - «протокол 41».

Более конкретно, IPv6-over-IPv4 также известен как «6in4» или «proto41», общий механизм перехода, используемый для получения подключения IPv6 от поставщика туннелей через сеть только для IPv4. (Hurricane Electric очень популярен; также есть автоматическое «6to4», использующее реле anycast.)

pfSense имеет документацию для настройки такого туннеля - во FreeBSD это будет сделано с использованием интерфейса gif (4) ; в Linux, используя sit или ipip . Туннельный провайдер имеет идентичную (но зеркальную) конфигурацию, которая распаковывает внутренний IP-пакет и перенаправляет его в свою собственную сеть IPv6.

Это не самый идеальный туннельный метод по сравнению, например, с GRE, L2TP (только один туннель на внешнюю пару src / dst); или FOU, GUE (многие домашние маршрутизаторы не позволяют переадресацию портов на то, что не является TCP или UDP); или специальные протоколы VPN (без аутентификации, без шифрования). Это, однако, самый простой из возможных туннелей с минимальными издержками (всего 20 байтов).


Обязательная ссылка «Начало»: для IPv4 требуется минимальный MTU в 68 байтов, а для IPv6 - 1280 байтов. При значении Ethernet MTU по умолчанию, равном 1500, максимальное количество стеков туннелей IPv4 может составлять ~ 70, а также ~ 5 уровней для IPv6.

Если бы это было причиной, я бы ожидал увидеть его как «инкапсулированный IPv6», чтобы отличить его от основного транспорта. Это непохоже на компьютерные стандарты, чтобы создать неопределенность таким образом. Значит ли это, что фильтрующий inet proto ipv6 будет захватывать только IPv6, который был инкапсулирован в IPv4 каким-то образом? Stilez 7 лет назад 0
Что ж, он _обязательно_ идентифицирован как «инкапсулированный IPv6», основываясь на том факте, что `proto` всегда соответствует полю протокола (внешнего) IP-заголовка, а не эфирному типу заголовка Ethernet. Так что `pass и т. Д. Inet proto ipv6` - это то, что вы бы использовали, чтобы соответствовать только туннелям 6to4. grawity 7 лет назад 0