You are right - if you drop anything with the SYN flag set, a connection cannot be made. I use a slightly different approach and drop packets that don't have the SYN flag set if their state is NEW:
Code:
-p TCP ! --syn -m state --state NEW
But I don't drop packets with the SYN flag set unless there are too many of them (SYN flooding):
Code:
-p TCP --syn -m limit --limit 1/s --limit-burst 4