Если на одном хосте нужно держать два независимых контура - один для выхода в интернет, второй для доступа к внутренним ресурсам (например, базы данных, файловый обмен, сервисы), - обычно проблему решают так: интернет настраивают на одной сетевой карте, а локальную сеть - на второй. Логику трафика задают маршруты и, при необходимости, правила 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