Администрирование Linux
Теория: Интерфейсы
Сетевое взаимодействие в Linux работает через понятие "сетевой интерфейс". Сетевой интерфейс – это программный способ обращаться к сетевой карте в том случае, когда он связан с физическим устройством. Но сетевой интерфейс может быть "виртуальным", то есть он не связан с железом, а существует лишь на уровне самой операционной системы. Нужно это для взаимодействия программ, которые изначально сетевые, но запускаются на одном компьютере. Посмотреть сетевые интерфейсы внутри операционной системы можно командой ifconfig:
eth0 – интерфейс, связанный с сетевой картой, работающей через Ethernet (по кабелю). В выводе выше можно увидеть множество полезной информации, например, ip-адрес, привязанный к этому интерфейсу. Если бы сетевых карт было несколько, то кроме eth0, мы бы увидели eth1 и так далее.
lo (loopback device) – виртуальный интерфейс, присутствующий по умолчанию в любом Linux. Он используется для отладки сетевых программ и запуска серверных приложений на локальной машине. С этим интерфейсом всегда связан адрес 127.0.0.1. У него есть dns-имя – localhost. Посмотреть привязку можно в файле /etc/hosts.
Запуск сервисов
Понимание принципов работы интерфейсов (и в целом tcp/ip) крайне важно для запуска любых сетевых сервисов, будь то веб-сервер или база данных. От этого зависит как доступность сервиса, так и безопасность всего процесса. Мы уже знаем, что запуск сервиса – это запуск процесса операционной системы, который внутри себя должен начать слушать порт на определенном ip-адресе, то есть интерфейсе. По умолчанию большинство сервисов стартует на localhost либо в документации предлагают стартовать на нём.
На это есть 2 причины. По умолчанию это безопасно. Сервис, запущенный на одном интерфейсе, недоступен с другого. То есть при таком запуске сервис занимает 8000 порт на 127.0.0.1 адресе, но 8000 порт на интерфейсе eth0 остается свободным, а значит снаружи до него не достучаться. Как правило, сервисы не выставляют напрямую во внешний мир, часто для этого служат специальные прокси, которые прокидывают запросы внутрь и обеспечивают дополнительные функции связанные с производительностью или безопасностью.
С другой стороны часть сервисов всё же нужно выставлять наружу. И здесь появляется сложность: нам нужно знать точный ip-адрес интерфейса, на который мы хотим завязаться. Подобное не всегда возможно, адреса имеют свойство меняться. Более того, если сервис запущен на разных машинах, то адреса вообще не совпадут. Как выкручиваться из этой ситуации? Через специальный псевдо-адрес 0.0.0.0. В Linux это не конкретный адрес, а скорее указатель, который говорит о необходимости связать запуск сервиса со всеми доступными интерфейсами в системе. То есть привязавшись к 0.0.0.0, сервис автоматически станет доступным через все сетевые интерфейсы системы.
.png)







