Если вы заблокируете все входящие соединения, как вы все еще можете использовать Интернет?

22

Если ваш интернет-провайдер или брандмауэр блокирует все входящие соединения, как веб-серверы могут отправлять вам данные в ваш браузер? Вы отправляете запрос (исходящий), а сервер отправляет данные (входящий). Если вы заблокируете все входящие, как веб-сервер может ответить?

Как насчет потокового видео и многопользовательских игр, где используется UDP? UDP не имеет соединения, поэтому соединение не устанавливается, так как брандмауэр или интернет-провайдер справятся с этим?

Кунал Чопра
источник
2
Блокировать все входящие телефонные звонки / Переадресовывать все входящие телефонные звонки на голосовую почту? Не мешает вам звать кого-то.
WernerCD

Ответы:

43

«Входящий блок» означает, что входящие новые соединения блокируются, но установленный трафик разрешен. Так что если разрешены новые исходящие соединения , то входящая половина этого разговора в порядке.

Брандмауэр управляет этим путем отслеживания состояния соединений (такой брандмауэр часто называют «брандмауэром с отслеживанием состояния»). Он видит исходящий TCP SYN и разрешает его. Он видит входящий SYN / ACK и может проверить, соответствует ли он исходящему SYN, который он видел, и пропускает его, и так далее. Если это разрешает трехстороннее рукопожатие (например, это разрешено согласно правилам брандмауэра), это разрешит этот разговор. И когда он видит конец этого диалога (FIN или RST), он удаляет это соединение из списка разрешенных пакетов.

UDP выполняется аналогично, хотя он включает в себя брандмауэр, запоминающий достаточно, чтобы притвориться, что UDP имеет соединение или сеанс (а UDP не имеет).

gowenfawr
источник
1
Для UDP, поскольку фактического соединения нет, брандмауэр обычно отслеживает IP-адрес назначения и порт исходящих пакетов UDP, и если есть входящий пакет с тем же IP-адресом и портом, что и у источника, он примет это как ответ и разрешит ему в.
WhiteWinterWolf
17

У @gowenfawr низкоуровневая картинка. Тем не менее, я решил добавить некоторые подробности о том, как выполняется «сопоставление» для отслеживания соединения, поскольку это может показаться магическим для непосвященных.

Каждое TCP-соединение имеет номер порта каждой стороны. Как известно большинству специалистов, HTTP-серверы работают на порту 80. Когда ваш браузер подключается к веб-серверу, он попросит операционную систему сгенерировать «локальный» номер порта, который будет случайным, например, 29672, который не используется другими TCP-соединение с этого компьютера (и ОС может сделать это, потому что оно знает обо всех активных TCP-соединениях). Затем начальный пакет установки TCP будет отправлен с IP-адреса вашей машины (IP_YOURS) и номера порта 29672 на IP-адрес веб-сервера (IP_WEBSERVER) и номер порта 80. В этот момент межсетевой экран с сохранением состояния скажет «ага, будущие пакеты с порта IP_WEBSERVER». 80, идущий к IP_YOURS порту 29672, не являются новыми соединениями, они являются ответами на существующее соединение и должны быть разрешены ". Брандмауэры с состоянием поддерживают таблицу,

Atsby
источник
3
Это в основном правильно, но, как пара незначительных моментов, номера портов останавливаются на 65535 (это 16-битные числа без знака), и, помимо тайм-аута, пакеты с установленными флагами FIN или RST могут также сигнализировать о том, что TCP соединение сейчас закрыто.
Рейраб
@reirab Ой, да, номер порта не удался. В заключение, конечно, можно было бы проверить флаги TCP, но необходимость учитывать возможную потерю пакетов и повторную передачу близких последовательностей достаточно сложна, так что я бы предположил, что большинство брандмауэров просто переназначают наименее использованную запись таблицы, а не сохраняют отслеживать точно.
@atsby Вы всегда можете отредактировать свой пост и заменить номера портов на что-то более подходящее?
Все это отличная информация. Просто хотел добавить одну вещь в порты, которые обсуждались в комментариях выше. Они называются «эфемерными портами», и их диапазон определяется ядром, специфичным для каждой ОС. В Linux вы можете получить их с помощью "cat / proc / sys / net / ipv4 / ip_local_port_range" --- диапазон по умолчанию "32768 до 61000"
Аруль Сельван,