Сделав глубокий вдох чего-то потенциально общезначимого, снова устремимся к глубинам устройства Интернета. Время от времени придется выныривать ненадолго, чтобы порассуждать о том, как технические принципы применимы в реальной жизни. Соберем по порядку эти фрагменты и посмотрим, во что они сложатся.
В этой главе сочтем маршрутизацию уровня Интернета и передачу данных на транспортном уровне понятной и прозрачной и рассмотрим уровни, связываемые таким образом, – от точки доступа каждого пользователя Интернета до точки входа на уровень приложения каждого сайта. В этих моментах должны быть решены в чем-то похожие, а в чем-то обратные задачи, так что в этой главе мы говорим об антисимметрии.
И там, и там используются прокси – технические решения, построенные в соответствии с со структурным паттерном проектирования «proxy». Хотя «proxy» вполне точно можно перевести на русский как «посредник», «представитель», «уполномоченный», в техническом смысле принято использовать кальку с английского. Впрочем, написанное русскими буквами слово прокси встречается в нетехнических контекстах все чаще, видимо, скоро уже совсем приживется в качестве заимствования.
И уж за паттерны проектирования давайте поясним, чтобы два раза не вставать. Паттерны проектирования – устоявшиеся изученные документированные подходы к решению практических задач программирования путем установления определенным образом порядка взаимосвязи, взаимозависимости и распределения ответственности между фрагментами кода. Помимо структурных, бывают еще порождающие и поведенческие паттерны проектирования. Паттерны проектирования используются именно на уровне программирования и не должны когда-либо быть перепутаны с архитектурными паттернами, применяемыми при высокоуровневом проектировании информационных систем. При погружении в технические принципы неизбежны такие краткие справочные вкрапления, выглядящие как застрявшие в тексте и неловко торчащие из него сноски-переростки. Все потому, что с одной стороны, сейчас нет смысла разбирать такие темы подробно, но с другой, спотыкаться о следующее применение этих терминов мы не должны: для этого необходимо и достаточно знать об их существовании эту сущую малость, умещающуюся в абзац.
Итак, на уровне Network Access каждый роутер – устройство, тем или иным образом имеющее возможность подключения к сети, – является прокси для всех подключенных к нему пользовательских устройств, способных предоставлять пользователям доступ к интерфейсам, построенным по описаниям, полученным из сети. Здесь важно то, что каждое конечное устройство не пытается подключиться к сети само, а находит наиболее подходящую точку доступа, которая может быть также использована другими устройствами. Узел доступа к Интернету в качестве прокси выдает каждому подключенному устройству IP-адрес своей внутренней сети, получает из Интернета датаграммы для всех подключенных устройств на свой внешний IP-адрес и затем рассылает адресатам по внутренней сети. Точка доступа – своего рода крошечное почтовое отделение, куда приходят все отправления из большого Интернета и где все местные устройства разбирают свои письма и посылки. Точка доступа к Интернету – это прокси, посредник, представитель, уполномоченный в сети Интернета получать и отправлять сигналы от имени и по поручению всех подключенных к этой точке устройств. Такая структура позволяет решать многие задачи обеспечения информационной безопасности и оптимизации передачи данных, что мы обязательно рассмотрим в ближайших главах.
На входе на сайт примерно такая же структура, только куда как побольше, посложнее и помощнее. Здесь входная точка называется веб-сервером и выполняет функции «reverse proxy», обратного прокси для внутренней сети сайта, содержащей серверы его приложений. То есть, в качестве обратного прокси веб-сервер принимает потенциально опасный запрос из внешней сети и принимает решение транслировать или не транслировать его в защищенную внутреннюю сеть. Масштаб задач обеспечения безопасности и передачи данных здесь может отличаться на немалое количество порядков даже от самых мощных и дальнобойных Wi-Fi роутеров. Есть ведь сайты с миллиардами добросовестных пользователей и несколько меньшим и неисчислимым количеством злоумышленников, ищущих любую эффективно эксплуатируемую уязвимость. И самые разные сетевые атаки тоже есть, включающие, но не ограничивающиеся наиболее известными DDoS – «Distributed Denial of Service», распределенный отказ в обслуживании.
Прямые и обратные прокси похожие, но разные. Интернет контролирует уязвимости на всех уровнях, поэтому к пользователю на уровень его доступа к сети просто так не выйдешь, а на уровень приложения на любом сайте просто так не войдешь. Только через прокси, только от имени и по поручению.