7

Предположим, у меня есть эта конфигурация на IPv4 прямо сейчас:

Мой маршрутизатор (коробка Linux) подключен к Интернету по eth0, а моя локальная сеть по eth1. Я хочу перенаправить порт 80 на 10.1.2.3. Вот как я сейчас это сделаю:

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to 10.1.2.3 iptables -A FORWARD -m conntrack --ctstate DNAT -j ACCEPT

Теперь я хочу сделать аналог на IPv6. Предположим, у меня та же конфигурация, что и раньше, с этими изменениями:

Мой провайдер предоставляет маршрутизатору диапазон 2001:db8:aaaa::/64 через делегирование префикса. Мой маршрутизатор берет 2001:db8:aaaa::1 для себя на eth1 и передает 2001:db8:aaaa::123 хосту, на котором я хочу открыть порт 80.

NAT больше не нужен в случае IPv6, поэтому все, что мне нужно, это правило брандмауэра, чтобы разрешить трафик. Вот правило, которое я могу придумать, чтобы сделать это:

ip6tables -A FORWARD -i eth0 -d 2001:db8:aaaa::123 -p tcp -m tcp --dport 80 -j ACCEPT

Проблема, с которой я столкнулся, заключается в том, что мне пришлось жестко закодировать 2001:db8:aaaa:: 123 в правило брандмауэра, а префикс 2001:db8:aaaa:: может быть изменен по желанию моего провайдера. В мире IPv4 единственный IP-адрес, который мне приходилось жестко кодировать, был внутренним, поэтому я знал, что он никогда не изменится из-под меня. Можно ли как-то разрешить такой трафик без необходимости изменять правило каждый раз, когда мой провайдер меняет делегированный префикс? (Если pf может делать то, что я хочу, но ip6tables не может, я был бы готов переключиться на BSD для этого.)

1 ответ1

0

Хотя нет выделенной опции, вы можете использовать универсальный модуль iptables u32 (см. Iptables-extensions), чтобы соответствовать только части идентификатора интерфейса (которая всегда начинается с байта 32 заголовка IP):

-A FORWARD -m u32 --u32 "32 = 0x11223344 && 36 = 0xAABBCCDD" -j ACCEPT

Это будет соответствовать любому адресу назначения, оканчивающемуся на :1122:3344:aabb:ccdd .

В заголовках IPv6 адрес источника начинается с байта 8 (сеть на 8, интерфейс на 16); адрес получателя 24 (сеть 24, интерфейс 32). Вы можете использовать побитовые операции для реализации таких вещей, как сопоставление масок CIDR в u32 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .