Назад | Перейти на главную страницу

Маршрутизация через Cisco ASA меняет последовательность TCP / номера ACK

В нашей сети есть выделенное устройство VPN, которое находится внутри офисной сети. У нас есть Cisco ASA со статическим маршрутом, который направляет подсети VPN к устройству VPN. Итак, типичный запрос от клиента к удаленному сайту (192.168.161.28 -> 192.168.101.28) идет:

Client            ASA               Local VPN         Remote VPN       Remote Server
192.168.161.28 -> 192.168.161.17 -> 192.168.161.10 -> 192.168.101.1 -> 192.168.101.28

При использовании этого маршрута брандмауэр на удаленной конечной точке VPN 192.168.101.1 отклоняет трехстороннее подтверждение TCP:

Status: A TCP packet was rejected because it has an invalid sequence number or an invalid acknowledgement number

Однако, если я обойду ASA (со статическим маршрутом на клиентских машинах напрямую):

Client            Local VPN         Remote VPN       Remote Server
192.168.161.28 -> 192.168.161.10 -> 192.168.101.1 -> 192.168.101.28

Потоки TCP правильно согласованы, и все идет гладко.

Что бы это могло быть? Есть ли какие-то правила проверки на ASA, которые могли бы это нарушить? Я подозреваю, что это связано с тем, что обратный маршрут трафика отличается от маршрута отправки (т.е. пакеты будут идти напрямую от конечной точки VPN к клиенту, а не через ASA, поскольку они находятся в одной локальной сети).

Отключение рандомизации ACK на ASA решает эту проблему (этот сценарий соответствует Пример B - Множественные пути в Интернет):

access-list tcp_bypass extended permit tcp 192.168.161.0 255.255.255.0 any
class-map tcp_bypass
match access-list tcp_bypass
policy-map tcp_bypass_policy
class tcp_bypass
set connection advanced-options tcp-state-bypass
set connection timeout idle 0:10:00
service-policy tcp_bypass_policy interface inside

Это отстойное решение - убедитесь, что вы прочитали последствия, прежде чем делать это.

Скорее всего, брандмауэр (192.168.101.1) пропускает SYN-ACK, потому что он маршрутизируется по другому маршруту обратно и, поскольку это брандмауэр с отслеживанием состояния, он его отклоняет.

  1. A отправляет SYN B через Z, пока его проверяет C.
  2. B отправляет SYN-ACK напрямую в A (поскольку B находится в той же подсети и имеет маршрут по умолчанию к A)
  3. A отправляет ACK B через Z, пока C проверяется и отбрасывается, потому что он никогда не видел SYN-ACK.

Это обычно называется асимметричной маршрутизацией.