- Что выбрать по архитектуре
- Базовая настройка интерфейсов на Linux
- Как сделать так, чтобы «локальная» карта не использовалась для выхода в интернет
- Виртуальная машина: как «отключить интернет» у гостя
- Пример: две подсети и шлюз по умолчанию только через интернет-карту
- Чек-лист по настройке
- Частые ошибки
- Резюме
Если на одном хосте нужно держать два независимых контура - один для выхода в интернет, второй для доступа к внутренним ресурсам (например, базы данных, файловый обмен, сервисы), - обычно проблему решают так: интернет настраивают на одной сетевой карте, а локальную сеть - на второй. Логику трафика задают маршруты и, при необходимости, правила firewall.
Ниже - практичный план для Linux и универсальные принципы для виртуалок.
Что выбрать по архитектуре
Вариант A. Хост раздаёт только локальную сеть, а в виртуалку отдаёте нужный интерфейс
Самый простой и надёжный подход, когда хосту не нужна «локалка» целиком, а виртуальной машине нужна только внутренняя сеть.
Схема:
- хост: интернет через первую карту
- хост: вторая карта не поднимает соединение с локальной сетью для себя
- виртуальная машина: проброс второй карты и работа только с внутренней сетью
Именно это описывают как рабочую схему в обсуждениях на форумах: соединение с локалкой на хосте отключают, а в гостевую ОС пробрасывают интерфейс, который нужен гостю. Источник: обсуждение на Linux Mint форуме https://linuxmint.com.ru/viewtopic.php?t=5791
Вариант B. Один хост ходит в интернет и в локальную сеть одновременно
Тут без маршрутов и иногда без iptables обычно не обойтись: у машины становится несколько путей выхода, и важно определить, куда отправлять исходящий трафик, а куда принимать входящий.
Базовая настройка интерфейсов на Linux
Шаг 1. Проверьте интерфейсы и их IP
На хосте выполните:
ip a
ip r
Дальше определите:
- какая карта смотрит в интернет (далее inet)
- какая карта в локальную сеть (далее loc)
Шаг 2. Назначьте IP и маску каждой карте
Ориентир:
- inet обычно получает адрес по DHCP или имеет статический адрес из подсети провайдера/роутера
- loc - статический адрес из внутренней подсети, либо DHCP из корпоративной сети
Если используете статический адрес, типично это выглядит так:
- inet: адрес, маска, шлюз, DNS
- loc: адрес и маска, шлюз можно не задавать на loc, если нужен только доступ внутрь
Идея «шлюз не указывать на второй сетевой карте и добавить маршруты вручную» встречается в реальных практиках настройки двойных интерфейсов. Источник с примером маршрутов: linux.org.ru https://www.linux.org.ru/forum/admin/17684186
Как сделать так, чтобы «локальная» карта не использовалась для выхода в интернет
Самая частая задача из практики: в системе настроены два интерфейса, но весь интернет должен идти через inet, а loc использоваться только для адресов локальной подсети.
Способ 1. Настроить маршруты и политику маршрутизации
Смысл:
- default route остаётся через inet
- сеть(и) локалки отправляется через loc
На практике это делается через таблицы маршрутизации и правила policy routing.
Пример подхода (похожие команды встречаются в обсуждениях про маршруты для двух карт):
Источник: linux.org.ru https://www.linux.org.ru/forum/admin/17684186
Примерно логика такая:
1) отдельная таблица маршрутов для loc
2) правило: трафик с адресов loc идёт в таблицу loc
3) локальные подсети - через соответствующий шлюз
Если вы хотите, чтобы весь исходящий интернет шёл строго через inet, проще всего:
- оставьте default route в основной таблице через шлюз inet
- локальным подсетям укажите конкретные маршруты через loc
Способ 2. Настроить метрики интерфейсов
В некоторых случаях помогает выставить более низкую метрику для inet, чтобы система чаще выбирала его.
Это зависит от того, как у вас настроен NetworkManager и/или netplan.
Пример с route-metric встречается в обсуждении на тему dual NIC и выбора интерфейса по метрике:
Источники:
- linux.org.ru (варианты с route-metric и через ip route/ip rule) https://www.linux.org.ru/forum/admin/17684186
Виртуальная машина: как «отключить интернет» у гостя
Если виртуалка подцеплена к хосту и видит интернет через вторую карту, задача решается не «блокировкой пакетов», а правильным пробросом интерфейсов.
Рекомендованная схема
- На хосте оставляете интернет только на inet.
- На хосте локальную сеть не используете.
- В гостевую ОС пробрасываете только loc интерфейс.
Так гостевая получает доступ только к тому, что реально даёт подключённый интерфейс. Источник: https://linuxmint.com.ru/viewtopic.php?t=5791
Как проверить, что получилось
В гостевой ОС:
ip r
ping <IP_локальной_сети>
ping 1.1.1.1
Если ping на внешний адрес не работает, значит интернет действительно не доступен в гостевой через сеть, которая ему выдана.
Пример: две подсети и шлюз по умолчанию только через интернет-карту
Допустим:
- inet: 192.168.1.0/24, шлюз 192.168.1.1
- loc: 192.168.0.0/24, шлюз 192.168.0.1
Тогда:
- default route у хоста должен указывать на 192.168.1.1
- маршрут в 192.168.0.0/24 - указывать на loc (шлюз 192.168.0.1 или следующий хоп)
В материалах по двухсетевому шлюзу для раздачи интернета по локальной сети описывается похожая модель: inet получает шлюз и DNS, loc получает адрес в отдельной подсети и используется как внутренняя точка. Источник: Habr sandbox https://habr.com/ru/sandbox/72840/
Чек-лист по настройке
| Что проверить | Должно быть так |
|---|---|
| На хосте есть два интерфейса с разными IP-подсетями | inet и loc разделены по подсетям |
| Маршрут по умолчанию | указывает на inet (если нужна работа только через него) |
| Маршруты в локальные подсети | есть явные маршруты на loc |
| Виртуалка не получает лишний интерфейс | гостю проброшен только нужный сетевой интерфейс |
| Нет «случайного» шлюза на второй карте | loc не перетягивает трафик наружу без явной настройки |
Частые ошибки
1) Две сетевые карты получают шлюз по умолчанию одновременно
В результате система выбирает не тот путь и трафик уходит «не туда». Решение - один default route или policy routing.
2) Пытаются «запретить интернет» без контроля проброса в виртуалку
Если гостю доступен маршрут к внешним адресам через выданную ему сеть, блокировка будет сложнее и менее надёжна, чем правильная выдача интерфейса.
3) Перепутали подсети и шлюзы при ручной настройке
Обычно из-за этого локальные адреса недостижимы, а интернет работает или наоборот.
Резюме
- Чтобы разнести интернет и локальную сеть на одном хосте, держите раздельные подсети на двух сетевых картах и управляйте выбором маршрутов.
- Если виртуалка не должна ходить в интернет, чаще всего проще дать ей только интерфейс локальной сети, а на хосте локальную сеть не подключать для себя. Такая схема прямо описана в практике настройки dual NIC под Linux и виртуальные машины: https://linuxmint.com.ru/viewtopic.php?t=5791
- Если нужен одновременный доступ в обе стороны с одного хоста, используйте маршруты и при необходимости policy routing. Примеры подходов обсуждаются здесь: https://www.linux.org.ru/forum/admin/17684186
Источники по базовой идее шлюза и раздельных подсетей:
- https://habr.com/ru/sandbox/72840/
- https://linuxmint.com.ru/viewtopic.php?t=5791
- https://www.linux.org.ru/forum/admin/17684186