Вопрос или проблема
Мне нужно, чтобы машина находилась в собственной сети (подсети) и подключалась к основной сети (подсети) через мост на машине с Linux, у которой есть только одно физическое Ethernet-устройство.
Причина, по которой мне это нужно, заключается в тестировании поведения программного обеспечения на изолированной машине при ухудшении сети. Применяя правила iptables и различные другие инструменты к мосту, я могу имитировать различные условия сетевого трафика.
Я делал это ранее, используя VLAN и коммутатор, поддерживающий VLAN (с ifupdown), но сегодня у меня нет такого коммутатора. Поэтому я пытаюсь использовать подсети для этого.
С помощью ifupdown
я мог создать псевдоним с собственным IP-адресом, а затем создать мост (также с собственным IP-адресом) между реальным устройством и устройством псевдонима.
Инструкции, которые у меня есть для netplan с использованием устройств-псевдонимов, просто вызывают полное отключение моей сети — вероятно, я сделал что-то неправильно. Я также замечаю тот же эффект при использовании фиктивного устройства.
Устройства-псевдонимы не реальны. Это фикция эпохи ядра 2.2.x для присвоения нескольких IP-адресов интерфейсу, чего в наши дни можно достичь… просто перечислив несколько IP-адресов для интерфейса.
addresses:
- 192.168.1.2/24
- 172.16.26.36/24
Адреса превращаются в “устройства-псевдонимы” для программ, использующих старый API, если параметр alias
установлен на адресе, и наоборот.
С одним сетевым интерфейсом нечего “мостить”. Вы можете создать мост с только одной физической сетью Ethernet, и он будет передавать трафик, но это тот же результат, что и просто наличие интерфейса Ethernet сам по себе.
Это означает, что если маршрутизация включена, Linux будет маршрутизировать между двумя подсетями, даже если ему придется отправлять пакеты обратно через тот же интерфейс.
Но интерфейс Ethernet, вероятно, подключен к физическому Ethernet-коммутатору — этобуквально аппаратный мост, и если VLAN не используются, то коммутатор технически позволяет “изолированному” узлу обойти ваш маршрутизатор Linux и общаться напрямую с восходящим маршрутизатором. Действительно, Linux будет продолжать говорить изолированному узлу (через пакеты ICMP ‘Redirect’), что доступен более прямой путь, поэтому вы можете захотеть отключить sysctl net.ipv4.conf.all.send_redirects
, чтобы избежать этого.
Если вы действительно хотите иметь возможность выполнять фильтрацию “моста”, как вы говорите, что делали ранее, то наиболее надежным методом будет заказать PCI-Express Ethernet-карту за $10 (или USB-адаптер Ethernet на крайний случай, который может служить “деградацией сети” сам по себе).
Это также может быть возможно, создав виртуальный интерфейс macvlan
поверх физической сети Ethernet — но, подумав еще раз, лучше не подключать сеть Ethernet к её собственному macvlan (так как он автоматически выполняет внутренний мост)… Однако, возможно, существует режим, который делает это возможным без немедленного создания петли.
Другим возможным методом может быть создание устройства veth
(автоматически создаваемого в парах, действующего как два конца кабеля) и объединение только одного его конца с физическим интерфейсом eth0, одновременно настраивая IP-адреса на другом конце. Контейнеры используют интерфейсы veth, но я не знаю, может ли Netplan их создавать.
Ответ или решение
Для обеспечения соединения двух подсетей на одном сетевом устройстве с использованием Netplan, необходимо проделать определенные шаги и понимать концептуальные основы сетевого взаимодействия. Рассмотрим это детально.
Теория
Netplan — это утилита для управления сетевой конфигурацией, работающая поверх systemd-networkd и NetworkManager, которая значительно упрощает процесс настройки сети на серверах и рабочих станциях под управлением Ubuntu и некоторых других дистрибутивов на базе Debian. В основе Netplan лежат файлы конфигурации в формате YAML, которые определяют сетевые интерфейсы и их параметры.
Когда у вас есть только одно физическое сетевое устройство, задача соединения двух подсетей с применением фильтров на мосту становится более сложной, но она все еще выполнима. Применение Netplan позволяет обозначить несколько IP-адресов для одного интерфейса, что заменяет старые "алиасные" интерфейсы, упрощая задачу.
Пример
Рассмотрим конфигурацию Netplan, которая позволяет реализовать соединение двух подсетей. Допустим, у нас есть физический сетевой интерфейс eth0 и две подсети: 192.168.1.0/24 и 172.16.26.0/24. Мы хотим, чтобы наша машина была маршрутизатором между этими двумя подсетями и чтобы на стыке можно было применять правила iptables для контроля трафика.
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses:
- 192.168.1.2/24
- 172.16.26.36/24
gateway4: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
Применение
-
Конфигурация IP-адресов: В приведенной выше конфигурации Netplan, интерфейсу eth0 заданы два IP-адреса, каждый для своей подсети. Это позволяет устройству участвовать в обеих сетях.
-
Маршрутизация: Для обеспечения маршрутизации между подсетями необходимо включить IPv4 маршрутизацию. Это можно сделать, отредактировав
/etc/sysctl.conf
и добавив или раскомментировав строку:net.ipv4.ip_forward=1
-
Настройка Iptables: В вашем случае важно настроить правила фильтрации трафика. Это сделано с помощью iptables:
iptables -A FORWARD -i eth0 -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o eth0 -m condition --condition my_custom_condition -j DROP
Эти правила позволят контролировать трафик на основе желаемых условий.
-
Отключение ICMP Redirects: Для предотвращения ICMP Redirect, который может предложить хосту более краткий маршрут, добавьте в /etc/sysctl.conf:
net.ipv4.conf.all.send_redirects=0
-
Создание виртуальных интерфейсов: В случае, если требуется усилить контроль над сетевыми интерфейсами или добавить "петлю", можно создать виртуальные сетевые устройства, такие как veth, вручную. Они позволяют связывать два конца как будто через виртуальный кабель, создавая между ними мост.
-
Настройка через Netplan: Если необходимо, чтобы Netplan управлял этими устройствами, возможно, придется делать это вручную через systemd или другие средства, поскольку поддержка в Netplan для таких сложных конструкций может отсутствовать.
Заключение
С применением Netplan вы можете управлять сетевыми конфигурациями более декларативно и смело экспериментировать с настройками для тестирования поведения ПО в условиях деградации сети. Если каких-то возможностей не хватает, всегда можно применить другие средства Linux для достижения цели. Главное — это тщательное планирование и понимание сетевой диагностики, чтобы избежать потенциальных ловушек, связанных с сетевыми петлями или неправильной маршрутизацией.