Предположим, у меня есть эта конфигурация на 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 для этого.)