Вопрос или проблема
Я хочу сделать веб-сервер, работающий в моей локальной сети, доступным в интернете. Мой роутер работает на OpenWrt 22.03 с firewall4.
С IPv4 я бы дал серверу стабильный RFC 1918 адрес, затем включил перенаправление портов на роутере.
С IPv6, как я понимаю, я просто должен дать серверу его собственный публичный IPv6-адрес, а затем настроить брандмауэр роутера для разрешения входящего доступа к порту 443 на этом адресе.
Но я не понимаю, как указать адрес назначения, когда он может измениться в зависимости от префикса IPv6, назначенного моим провайдером. Я мог бы настроить его для конкретного адреса, который есть у сервера сейчас, но если мой провайдер назначит мне другой префикс, это сделает сервер недоступным, пока я не отредактирую конфигурацию брандмауэра с новым адресом.
Как я могу указать динамический адрес назначения в OpenWrt firewall4?
IPv6-адрес может изменяться, но все же существует его статическая часть. Формат IPv6-адреса выглядит как A:B:C:D:E:F:G:H, где A:B:C:D идет от вашего IDC или локального префикса IPv6, а E:F:G:H статичны, поэтому вы можете добавить эту часть адреса в брандмауэр OpenWrt, и ее формат будет выглядеть как ::E:F:G:H/0. Например, у вас был IPv6-адрес типа 2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b, его статическая часть — 0000:0000:1a2f:1a2b, поскольку 0000 можно игнорировать, можно поместить ::1a2f:1a2b/0 в брандмауэр как адрес назначения.
Я просто разрешаю брандмауэру пересылать wan
-> lan
для любого устройства, использующего 443
в качестве порта назначения:
config rule
option name 'Allow-HTTPS'
option src 'wan'
option dest 'lan'
option dest_port '443'
option target 'ACCEPT'
Это работает идеально. Я не вижу причины указывать dest_ip
.
Согласно:
- https://korhonen.cc/posts/firewall_rules_openwrt_ipv6_dynamic_prefix/#_dynamic_prefix_forwarding
- https://superuser.com/a/1507356/76158
- https://openwrt.org/docs/guide-user/firewall/fw3_configurations/fw3_ipv6_examples#dynamic_prefix_forwarding
OpenWRT имеет специальную функцию под названием “динамическая пересылка префиксов”, которая позволяет указать только последние N (вместо первых N) битов в формате, подобном CIDR. Или: укажите IP-адрес назначения, например, как "::123/-64"
(обратите внимание на отрицательные 64).
(Также этот вопрос может быть дубликатом указанного вопроса на superuser, заданного несколько лет назад.)
Ответ или решение
Для успешного предоставления доступа к серверу с динамическим IPv6-адресом через маршрутизатор OpenWrt, использующего firewall4, важно учитывать особенности функционирования IPv6 и настройки файрвола, что в значительной степени отличается от работы с IPv4.
Теория
IPv6 обладает рядом особенностей, которые нужно учитывать при настройке сети. В отличие от IPv4, где для внутренней сети обычно применяется частный диапазон адресов (RFC 1918), а затем выполняется проброс портов, IPv6 позволяет каждому устройству иметь публичный адрес в глобальном пространстве. Это упрощает настройку, однако вызывает сложности в случае, когда провайдер периодически меняет префикс, предоставляемый абоненту. Из-за этого конечный IPv6-адрес вашего сервера может измениться.
Однако в IPv6-адресах часть адреса, генерируемая как EUI-64, остаётся постоянной. Например, если у вашего сервера IPv6-адрес вида 2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b, то его стабильной частью будет ::1a2f:1a2b.
Пример
Для работы с динамическими префиксами в OpenWrt существует функция «динамического проброса префиксов», которая позволяет указать в правилах файрвола лишь последнюю часть адреса. Это делается с использованием CIDR-подобной нотации, где указывается отрицательное число бит. Для примера, ::1a2f:1a2b/-64 позволит обрабатывать пакеты для всех адресов с этой последней частью.
Вот пример настройки правила в файрволе для разрешения входящих соединений на порт 443 по протоколу IPv6, не зависящий от префикса:
config rule
option name 'Allow-HTTPS'
option src 'wan'
option dest 'lan'
option dest_port '443'
option dest_ip '::1a2f:1a2b/-64'
option target 'ACCEPT'
Применение
Давайте разберём, как применить данный метод для настройки вашего маршрутизатора.
-
Определите стабильную часть адреса сервера. Подключите сервер и зафиксируйте его IPv6-адрес. Сохраните стабильную часть адреса, после нормы ::.
-
Настройка правила в файрволе. Перейдите в веб-интерфейс OpenWrt или подсоединитесь через SSH, затем откройте файл конфигурации
/etc/config/firewall
. Добавьте правило, аналогичное тому, что указано выше, заменив стабильную часть адреса на статическую часть вашего сервера. -
Тестирование. Проверьте доступность вашего сервера извне, используя другой IPv6-совместимый интернет-соединение. Это подтвердит, что настройка работает корректно, и сервер доступен по нужному порту.
-
Мониторинг и поддержка. Регулярно проверяйте работоспособность соединения, особенно после изменения IPv6-префиксов со стороны провайдера. В большинстве случаев, если стабильный адрес указан корректно, изменения префиксов не повлияют на доступность сервера.
Таким образом, используя подход с динамическими префиксами, вы сможете сохранять стабильность подключения к вашему веб-серверу даже при изменении префикса провайдером. Этот метод обладает высокой эффективностью при правильной предварительной настройке и контроле.