Всегда пользовался keep-state не задумываясь где создаются виртуальные правила, пока один раз не на ступил на грабли….
check-state — проверяет пакет по динамическим правилам; если соответствие обнаружено, поиск прекращается; в противном случае выполняется переход к следующему правилу; eсли check-state правило не обнаружено, динамические правила проверяются по первом правилу с опцией keep-state;
Взято здесь.