11.4. DSR

Обзор

DSR (Direct Server Return) — это режим L4-балансировки, в котором ADC задействован только на пути трафика от клиента к Worker:

  • Клиент -> Worker: трафик передается через ADC.

  • Worker -> Клиент: ответный трафик отправляется напрямую от Worker к клиенту, минуя ADC.

При пересылке трафика ADC использует IP-in-IP инкапсуляцию. Внутренний (первоначальный) IP-заголовок остается неизменным, поэтому Worker видит реальный IP-адрес клиента и может отправлять ответы напрямую клиенту. ADC добавляет внешний IP-заголовок для доставки пакета выбранному Worker:

  • Внешний IP-адрес назначения: адрес Worker.

  • Внешний IP-адрес источника: адрес из настроенного пула источников или IP-адрес клиента, если пул не используется.

Настройка

Все команды выполняются внутри Сервиса.

access-point type <l4-dsr-tcp|l4-dsr-udp> ip A.B.C.D/M port <(0-65535)|any> [vrf VRFNAME] [dp-access-list ACLNAME] [tcp-profile NAME]

Создать Access Point с типом l4-dsr-tcp или l4-dsr-udp для IPv4.

access-point type <l4-dsr-tcp|l4-dsr-udp> ipv6 X:X::X:X/M port <(0-65535)|any> [vrf VRFNAME] [dp-access-list ACLNAME] [tcp-profile NAME]

Создать Access Point с типом l4-dsr-tcp или l4-dsr-udp для IPv6.

В режиме DSR, TCP использует другой набор состояний сессий, чем L4 TCP. Используются следующие состояния:

established|syn-sent|syn-recv|fin-wait|time-wait|close|close-wait|last-ack|listen|syn-ack

Каждое состояние имеет свой таймаут. Если сессия находится в данном состоянии и новые пакеты не поступают через ADC до истечения таймаута, то сессия завершается.

Таймауты настраиваются глобально с помощью следующих команд:

<vlb|vlb6> timeout dsr-tcp <established|syn-sent|syn-recv|fin-wait|time-wait|close|close-wait|last-ack|listen|syn-ack> (1-604800) [vrf NAME]

Задать таймаут для состояния сессии в dsr-tcp.

<vlb|vlb6> timeout dsr-udp (1-604800) [vrf NAME]

Задать таймаут для состояния сессии в dsr-udp.

В режиме DSR функциональность drop-entry может использоваться для удаления залипших сессий, чтобы освободить место для новых. Это поведение определяется тремя параметрами: mode, keepalive и threshold.

<vlb|vlb6> drop-entry mode <disabled|threshold|enabled> [vrf NAME]

Параметр mode имеет следующие значения:

  • disabled: drop-entry отключен.

  • threshold: drop-entry применяется только к тем бакетам хэш-таблицы сеансов, где количество сеансов, соответствующих условиям drop-entry, больше или равно установленному значению threshold.

  • enabled: drop-entry применяется ко всем бакетам.

<vlb|vlb6> drop-entry keepalive (0-60) [vrf NAME]

Параметр keepalive определяет таймаут для залипшей сессии, после которого она может быть удалена. Сессия удаляется только тогда, когда в том же бакете появляется новая сессия; удаление происходит с определённой вероятностью. Только сессии в состояниях syn-recv и syn-ack доступны для удаления, и только если не более 8 пакетов были отправлены в сторону Worker, пока сессия находилась в этих состояниях.

<vlb|vlb6> drop-entry threshold (0-8) [vrf NAME]

Установить порог для режима drop-entry.

Настройка IP-in-IP туннеля на Worker

Приведённые ниже примеры показывают, как настроить туннель IP-in-IP на Worker под управлением Linux для IPv4 и IPv6.

IPv4

Чтобы настроить туннель IP-in-IP для IPv4 на Worker, выполните следующие команды в Linux:

sudo ip link add name ipip0 type ipip local 192.168.11.200 remote 100.64.0.1
sudo ip link set ipip0 up
sudo ip addr add 172.16.0.1/24 dev ipip0

Где:

  • 192.168.11.200 — это адрес Worker.

  • 100.64.0.1 — это адрес из пула источников на ADC.

  • 172.16.0.1 — это адрес Access Point на ADC.

Примечание

Убедитесь, что сетевой путь и любые межсетевые экраны на хостах разрешают инкапсулированный трафик, иначе пакеты туннеля могут быть отброшены, не дойдя до Worker.

IPv6

Для настройки IPv6-туннеля (ip6tnl) на Worker, выполните следующие команды:

sudo ip link add name ipip1 type ip6tnl local fd07:10:10:11::1 remote fd07:10:10:10::1
sudo ip link set ipip1 up
sudo ip -6 addr add fd07:10:10:12::3/128 dev ipip1

Где:

  • fd07:10:10:11::1 — это адрес Worker.

  • fd07:10:10:10::1 — это адрес клиента. В режиме IPv6 пул источников не используется.

  • fd07:10:10:12::3 — это адрес Access Point на ADC.

Примечание

Если ADC использует адрес клиента в качестве внешнего исходного адреса (без пула источников), то адрес источника туннеля может различаться для каждого клиента. В этом случае настройте туннель без указания конкретного remote-адреса (например, не указывайте ключ remote или используйте remote any), чтобы Worker мог принимать инкапсулированные пакеты от нескольких клиентов.

Show-команды

show vlb access-point type <l4-dsr-tcp|l4-dsr-udp> ip A.B.C.D/M port <(0-65535)|any> [vrf VRF] [<dp-access-list|counters>]

Показать статистику для указанного Access Point.

ADC# show vlb access-point type l4-dsr-tcp ip 172.16.0.1/32 port 443 counters
      Total Connections:             0
      Active Connections:            0
      Dead Connections:              0
      Application Errors:            0
      Framework Errors:              0
      TCP Handshake Errors:          0
      TCP Handshake RST Errors:      0
    Content switch rules:
      default-target-group tg1 (0 hits)

Счётчики

Описание

Total Connections

Общее количество соединений между клиентом и ADC за всё время

Active Connections

Количество текущих активных соединений

Dead Connections

Общее число закрытых соединений за всё время

Application Errors

Произошла ошибка при инициализации сессии L7 на уровне TCP/HTTP/HTTPS. Этот счётчик обычно увеличивается из-за нехватки памяти. Для DSR этот счётчик всегда равен 0

Framework Errors

Не удалось выделить память для сессии L7. Обычно вызывается большим количеством соединений, приводящих к исчерпанию памяти. Для DSR этот счётчик всегда равен 0

TCP Handshake Errors

Не удалось установить TCP-сессию из-за таймаута соединения

TCP Handshake RST Errors

Получен пакет TCP RST от клиента на этапе рукопожатия