Mishka> Для демультиплексации эти флаги пофигу.
Зато для фильтрации не пофигу.
Mishka> Ну, и, если мы начинаем подсовывать произвольные IP адреса, то уже сидим чуть ли не на уровне raw sockets. Значит и все флаги можно добыть.
Во-первых, никто произвольных адресов не подсовывает. Это просто г-н yacc тебя запутал.
А во-вторых, клиент может какие угодно флаги ставить, но файрвол не пропустит.
Объясню, но это будет в последний раз.
Примем 2 клиента C1 и C2, и их файрволы F1 и F2. Для hole punching, C1 и C2 посылают нулевые пакеты с портами источниками pi1 и pi2 общей машине T, которая записываэт внешние порты источников этих пакетов, pe1 и pe2 (зачастую, если есть место в адресном пространстве NAT, peX == piX, но не всегда). Затем, через нормальный канал, T шлет pe1 C2 и pe2 C1.
После нулевых пакетов CX шлют первые пакеты, но уже друг другу. Рассмотрим C1. Его первый пакет имеет исходный порт pi1, в надежде, что NAT перемапит его в тот же pe1, который нам известен. Порт назначения у него pe2. Если нулевой пакет не открыл сессию, то первый откроет. Если при этом изменилось отображение pi1 к pe1, то все пропало и hole punching работать не будет.
Если C2 пошлет первый пакет несколько пожже, то его сессия в F2 может быть не открыта (если F2 открывает строгие адресные сессии и таковая создалась после нулевого пакета). Тогда C1 должен будет повторить посылку.
Теперь рассмотрим проблему TCP. На нулевой стадии необходимо не 1 пакет, а 4, так как сессия наверняка будет создана, а перанаправить ее будет невозможно. Это вообще-то делает всю рабуту тут практически невозможной. Но допустим, что каким-то чудом нам удалось узнать peX и первая сессия будет иметь его снаружи. Это нам все равно не поможет, так как состояний у сессии TCP больше, чем у UDP. Внимательно следи за шариком:
Допустим C1 шлет первый пакет. Это, конечно, будет SYN. Он благополучно открывает сессию в F1 и уходит с pe1:pe2 наружу. Допустим, что C2 сделал то же самое одновременно и на F2 есть такая же сессия. Казалось бы, дело в шляпе, "демультиплексации эти флаги пофигу". На самом же деле, это ничему не поможет, так как фильтр сбрасывает голый SYN. Но если C2 попытается этому помочь, послав SYN+ACK, его сбросит F2, так как сессии TCP создаются только по SYN.
Теперь тебе видна асимметрия?
