В чем разница между сетевым коммутатором (L2) и маршрутизатором (L3)?

«В чем разница между сетевым коммутатором (L2) и маршрутизатором (L3)?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Как DevOps-инженер, я работаю с этими концепциями при проектировании сетей в облаке (VPC, подсети) и настройке виртуальных сетевых устройств.

Коммутатор (Switch, уровень L2 - канальный) работает внутри одной логической сети (LAN, VLAN, подсеть VPC). Его основная задача — пересылать кадры (frames) между устройствами, находящимися в одной сети, на основе MAC-адресов. Он строит таблицу MAC-адресов, сопоставляя их с портами. Коммутатор не понимает IP-адреса.

Маршрутизатор (Router, уровень L3 - сетевой) работает между разными сетями. Его задача — передавать пакеты (packets) из одной сети в другую на основе IP-адресов. Он принимает решение о маршруте, используя таблицу маршрутизации.

Ключевые отличия с практической точки зрения:

Аспект Коммутатор (L2) Маршрутизатор (L3)
Уровень работы Канальный (Data Link, L2) Сетевой (Network, L3)
Адресация MAC-адреса IP-адреса
Домен Одна сеть/подсеть (broadcast domain) Соединяет разные сети/подсети
Типичные задачи Объединение устройств в LAN, сегментация через VLAN Маршрутизация между подсетями, NAT, базовый firewall (ACL)

Пример в облаке AWS:

  • Подсеть (Subnet) в VPC — это, по сути, сегмент L2-сети. EC2-инстансы в одной подсети общаются через L2-коммутацию (через гипервизор).
  • Таблица маршрутизации (Route Table), прикрепленная к подсети, и Internet Gateway / NAT Gateway выполняют роль маршрутизаторов (L3), направляя трафик между подсетями и в интернет.

Пример настройки маршрута в Linux (имитация работы роутера):

# Просмотр таблицы маршрутизации
ip route show
# Добавление статического маршрута (например, для доступа к внутренней сети через VPN-шлюз)
ip route add 10.8.0.0/24 via 192.168.1.1 dev eth0
# Включение IP forwarding (чтобы сервер мог работать как роутер)
echo 1 > /proc/sys/net/ipv4/ip_forward
# Или перманентно в /etc/sysctl.conf: net.ipv4.ip_forward=1