Короткий ответ
Асимметрия: пакеты 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, вернулись другим).
Возможные причины
- Два выхода в интернет/два роутера без согласованного return path.
- PBR/policy routing только в одну сторону.
- VPN на клиенте: исходящий через туннель, ответ напрямую (или наоборот).
- Неверный ARP шлюза: часть хостов бьёт в старый MAC.
- ECMP без symmetric hash.
- NAT на одном из двух firewall, второй прозрачный.
- Разные 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.1ip route get 10.0.20.10
traceroute -n 10.0.20.102. Путь обратно
На 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
# счётчики dropINVALID / 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 ослабляет модель сессий.