Короткий ответ

Асимметрия: пакеты A→B идут через шлюз X, ответы B→A через Y. Для stateless ICMP иногда «живёт», TCP через stateful firewall на X без обратного пакета — drop (INVALID). Не отключайте nftables/Windows Firewall навсегда. Снимите traceroute с обеих сторон, MAC шлюза, conntrack.

LAN 10.0.10.0/24 / 10.0.20.0/24, шлюзы часто 10.0.10.1 и запасной 10.0.10.3 или VPN.

Симптомы и как отличить

  • С ПК ping сервера есть, RDP нет (или наоборот);
  • tcpdump на A видит SYN, на B SYN есть, SYN-ACK уходит, на A нет;
  • после failover VRRP часть сессий умерла.

Отличия от нет маршрута: таблица на отправителе есть. От NAT: NAT может быть частью асимметрии (вышли одним WAN, вернулись другим).

Возможные причины

  1. Два выхода в интернет/два роутера без согласованного return path.
  2. PBR/policy routing только в одну сторону.
  3. VPN на клиенте: исходящий через туннель, ответ напрямую (или наоборот).
  4. Неверный ARP шлюза: часть хостов бьёт в старый MAC.
  5. ECMP без symmetric hash.
  6. NAT на одном из двух firewall, второй прозрачный.
  7. Разные default на сервере и на клиенте.

Диагностика

1. Путь туда

С Windows 10.0.10.10 на 10.0.20.10:

Find-NetRoute -RemoteIPAddress 10.0.20.10
tracert -d 10.0.20.10
Get-NetNeighbor -IPAddress 10.0.10.1
ip route get 10.0.20.10
traceroute -n 10.0.20.10

2. Путь обратно

На 10.0.20.10 (Ubuntu):

ip route get 10.0.10.10
traceroute -n 10.0.10.10
ip neigh show 10.0.20.1

Сравните первый хоп. Если туда 10.0.10.1, обратно 10.0.20.1 уходит в другую автономную систему/VPN — асимметрия.

3. Stateful

На Ubuntu-шлюзе, который видит только одну сторону:

sudo conntrack -L | grep 10.0.10.10
sudo nft list ruleset
# счётчики drop

INVALID / not NEW and not established — классика: SYN-ACK пришёл не туда, где ждали SYN.

Windows:

Get-NetFirewallProfile
Test-NetConnection 10.0.20.10 -Port 3389

Не выключайте профиль Domain. Смотрите, не стоит ли «inbound block» при том, что ответ идёт другим NIC.

4. ARP и два претендента на шлюз

arp -a 10.0.10.1

Разные MAC 10.0.10.1 на разных ПК — кто-то ходит «не в тот» роутер. См. ARP-кеш.

5. Два WAN

Сравните source NAT адрес исходящего пакета и маршрут возврата у провайдера. Разные ISP без BGP/согласованного NAT — TCP умрёт.

Решение

Сценарий A. Один firewall должен видеть обе стороны

Включите состояние на границе, куда сведёте оба направления: общий next-hop, или policy routing симметрично, или conntrack helper/disable sequence только как осознанный костыль (хуже, чем починить путь).

Предпочтительно: оба префикса через одну пару шлюзов, VRRP VIP 10.0.10.1 единственный default.

Сценарий B. VPN split

Маршрут к 10.0.20.0/24 и обратный на филиале к 10.0.10.0/24 через тот же туннель. Без обратного префикса — асимметрия.

Сценарий C. Два роутера в одном VLAN

Оставьте один default option 3. Второй — standby VRRP, не второй DHCP router.

Сценарий D. Временно ослабить stateful

Только для доказательства: правило accept related/established + лог drop. Не nft flush ruleset на проде.

6. Как доказать stateful drop, а не «плохой порт»

Снимите tcpdump на трёх точках одним запуском трафика RDP/HTTPS: клиент 10.0.10.10, шлюз A, хост 10.0.20.10. Если SYN виден везде, SYN-ACK уходит с B, на A его нет, а на firewall между ними нет conntrack — пакет ушёл другим путём. Это асимметрия, не MTU. Сравните ip route get туда и ip route get обратно. Разные первые hop при stateful на одном из них — ваш кейс.

Два DHCP router option или два «живых» 10.0.10.1 (забытый роутер) дают часть хостов в старый NAT. Сверьте MAC шлюза через Get-NetNeighbor. VRRP: после failover ARP stale на клиентах — похоже на асимметрию до gratuitous ARP. Не лечите nft flush ruleset. Логируйте drop INVALID сутки: если счётчик растёт только для одной пары подсетей, чините prefix/VPN return path. ECMP через два ISP без session sync сломает длинные TCP; ICMP ping при этом может жить. В тикете: traceroute оба направления, MAC gw, кусок conntrack, что именно сделали с маршрутом (не «открыли порт»).

Практический минимум для закрытия: (1) одинаковый VIP default 10.0.10.1 у всех в VLAN; (2) на филиале маршрут 10.0.10.0/24 в тот же туннель, которым пришли; (3) firewall видит обе стороны сессии или сознательно stateless на этом участке. Если оставили два WAN, нарисуйте, какой source NAT и какой return BGP/static. Без этого TCP будет умирать «иногда», а ping жить. Не включайте conntrack loose как постоянную норму: вы спрячете следующие инциденты. После правки повторите traceroute с обеих сторон и одну длинную TCP-сессию (копирование, RDP 10 минут). Если INVALID исчез, а приложение всё ещё рвётся — смотрите timeout NAT, не путь. Сохраните «до/после» traceroute в тикет: асимметрия хорошо доказывается картинкой hop, не словесным «починили роутер».

Как проверить, что проблема устранена

Traceroute туда и обратно с теми же первыми хопами (или заведомо симметричный дизайн). TCP: Test-NetConnection -Port и реальная сессия 5+ минут. conntrack без INVALID для этой пары. После failover VRRP — повтор.

tracert -d 10.0.20.10
Test-NetConnection 10.0.20.10 -Port 443

Если не помогло

  • Только UDP жив — нет state как у TCP, но приложение своё.
  • AnyCast/ECMP: разные синапсы CDN, это не ваш LAN.
  • Trunk режет один VLAN обратного пути.
  • MTU разный по направлениям.

Профилактика

  • Один VIP шлюза на VLAN.
  • Симметричные маршруты филиалов в документации.
  • Не ECMP через stateful без dedicated hash/session sync.
  • Рисуйте path diagram до включения второго WAN.

FAQ

Можно ли выключить firewall, чтобы «подтвердить»?

Краткий тест в окно, с консолью и бэкапом правил. Постоянно — нет. Асимметрия останется, вы только потеряете защиту.

Почему ping работает при асимметрии?

Многие цепочки пропускают ICMP без conntrack или echo не требует той же симметрии. TCP — да.

VRRP всегда асимметрия?

Нет. Один VIP, оба маршрутизатора согласованы. Асимметрия — когда часть хостов бьёт в old master по ARP.

tcpdump на хосте видит оба направления, на firewall нет. Где проблема?

Пакеты идут мимо этого firewall. Это и есть асимметрия относительно него.

Нужно ли включаеть tcp loose на conntrack?

Как костыль — возможно. Как решение — нет: чините маршруты. Loose ослабляет модель сессий.