Почему VPN-клиент имеет доступ ко всем интерфейсам, вместо того чтобы быть ограниченным подсетью и отключенной функцией пересылки?

Вопрос или проблема

Контекст

В моей инфраструктуре Debian Linux я управляю несколькими сетевыми интерфейсами с определенными ролями.

Интерфейс Роль Подсеть Описание
eth0 Публичное соединение 192.0.2.0/24 Используется для внешнего публичного доступа.
wg0 WireGuard VPN 10.0.0.0/24 Обеспечивает защищенную связь между машинами через VPN.
vmbr0 Мост для Proxmox 172.16.0.0/16 Мост для виртуальных машин.
  • Правила брандмауэра: В настоящее время не применяются правила iptables/nftables. Все цепочки имеют политику по умолчанию, установленную на ACCEPT.
  • Конфигурация ядра: Перенаправление IPv4 отключено (net.ipv4.ip_forward = 0).

Цель

Цель состоит в том, чтобы строго ограничить сетевые коммуникации в инфраструктуре:

Когда компьютер подключается к VPN через интерфейс wg0, он должен иметь возможность общаться только с конкретной виртуальной машиной, расположенной на мосту vmbr0.

Задача заключается в том, чтобы обеспечить полную изоляцию между интерфейсами и ограничить трафик для этого конкретного сценария.


Воспроизведение настройки

Конфигурация WireGuard (фейковая информация)

Чтобы воспроизвести окружение, вот базовая конфигурация WireGuard для двух Linux-машин:

Машина 1: VPN-сервер (фейковая информация)

Интерфейс: wg0

  1. Генерация ключей (пример ключей, сгенерированных с помощью wg genkey и wg pubkey):

    • Закрытый ключ: 9+9N5R5Dje2dmldDtrjQoBb3AFOWhOAyZ9mfWQKn7QY=
    • Открытый ключ: Ci4z9W+n8gfrFRRGZs3DNMHmKk1TFNG9QXGV7zg5OkE=
  2. Конфигурация WireGuard: (фейковая информация)

    Файл /etc/wireguard/wg0.conf:

    [Interface]
    PrivateKey = 9+9N5R5Dje2dmldDtrjQoBb3AFOWhOAyZ9mfWQKn7QY=
    Address = 10.0.0.1/24
    ListenPort = 51820
    
    [Peer]
    PublicKey = YdC5+zMdKj5cRW2WlAv7GDETx+gjZukOmeC+lkJZ8is=
    AllowedIPs = 10.0.0.2/32
    
  3. Команды для применения:

    sudo wg-quick up wg0
    sudo systemctl enable wg-quick@wg0
    
Машина 2: VPN-клиент (фейковая информация)

Интерфейс: wg0

  1. Генерация ключей:

    • Закрытый ключ: mWjXaRlvJjThhf9ZZpaAWwdY0Puvy0k9fGy7prlzvV8=
    • Открытый ключ: YdC5+zMdKj5cRW2WlAv7GDETx+gjZukOmeC+lkJZ8is=
  2. Конфигурация WireGuard:

    Файл /etc/wireguard/wg0.conf:

    [Interface]
    PrivateKey = mWjXaRlvJjThhf9ZZpaAWwdY0Puvy0k9fGy7prlzvV8=
    Address = 10.0.0.2/24
    
    [Peer]
    PublicKey = Ci4z9W+n8gfrFRRGZs3DNMHmKk1TFNG9QXGV7zg5OkE=
    Endpoint = <SERVER_IP>:51820
    AllowedIPs = 10.0.0.1/24, 172.16.0.0/16, 192.0.2.0/24
    PersistentKeepalive = 25
    
  3. Команды для применения:

    sudo wg-quick up wg0
    sudo systemctl enable wg-quick@wg0
    

Эти конфигурации устанавливают простое соединение между VPN-сервером (10.0.0.1) и клиентом (10.0.0.2). Эта настройка является основой для тестирования описанного требования.

Мост

sudo brctl addbr vmbr0
sudo ip addr add 172.16.0.1/16 dev vmbr0
sudo ip link set dev vmbr0 up

Проблема

Когда клиент подключается к VPN через интерфейс wg0, наблюдаются следующие проблемы:

Доступ ко всем интерфейсам:
Несмотря на разные подсети и отключенное перенаправление IPv4, VPN-клиент может успешно отправлять пинг на все сетевые интерфейсы, включая eth0 и vmbr0.

Видимость пакетов:
При запуске tcpdump на каждом интерфейсе (eth0, vmbr0 и wg0) наблюдается, что пакеты пинга проходят только через интерфейс wg0. Однако ответы все равно поступают, когда клиент пингует другие интерфейсы.

Выявление сервисов:
Если на любом интерфейсе работает сервис, такой как:

python3 -m http.server --bind 192.0.2.1

(привязан к IP-адресу eth0 192.0.2.1/24), VPN-клиент имеет доступ к этому сервису.

Сцена с отключенным интерфейсом:
Если интерфейс (например, eth0) отключить с помощью:

ip link set dev eth0 down

VPN-клиент по-прежнему может успешно пинговать IP-адрес, связанный с отключенным интерфейсом, и получать доступ к работающему сервису (например, HTTP-сервер). Это поведение сохраняется независимо от рабочего состояния интерфейса.

Проблема с ограниченной ВМ:
При добавлении виртуальной машины на мосту vmbr0 VPN-клиент не может ее пинговать. (Нормально, но почему я могу пинговать мост)

Запрос на помощь

Учитывая вышеизложенную конфигурацию и наблюдаемые проблемы:

  • Почему VPN-клиент имеет доступ ко всем интерфейсам (eth0, vmbr0), вместо того чтобы быть ограниченным по подсети и отключенной опции перенаправления?
  • Как VPN-клиент все еще может получать доступ к сервисам или пинговать IP-адреса на отключенных интерфейсах?

Будем благодарны за любые подсказки или решения!

Почему VPN-клиент имеет доступ ко всем интерфейсам (eth0, vmbr0), вместо того чтобы быть ограниченным по подсети и отключенной опции перенаправления?

Вы как бы сами на это ответили 🙂

Видимость пакетов: При запуске tcpdump на каждом интерфейсе (eth0, vmbr0 и wg0) наблюдается, что пакеты пинга проходят только через интерфейс wg0. Однако ответы все равно поступают, когда клиент пингует другие интерфейсы.

Вы не отправляете IP-пакет на интерфейс, а на систему. Поскольку IP, к которому вы пытаетесь получить доступ, назначен системе, которая приняла пакет, ей не нужно пересылать его на конкретный интерфейс, на котором настроен адрес. Система обрабатывает его локально.

Почему?

ip rule (man 8 ip-rule) покажет, что local таблица маршрутизации используется первой для обработки пакета, поскольку она имеет наименьший приоритет (0).

Из man 8 ip-route:

local – назначения назначены этому хосту. Пакеты отправляются обратно и доставляются локально.

Этот ответ (https://unix.stackexchange.com/a/524304/651211) также объясняет это и предлагает решение для предотвращения такого поведения.

Как VPN-клиент все еще может получать доступ к сервисам или пинговать IP-адреса на отключенных интерфейсах?

Это зависит от того, как IPv4-адрес назначен системе (и настроен на отключенном интерфейсе). Для статической адресации IPv4-адрес все еще настроен на интерфейсе. Просто выполните быструю ip addr show или ip route show table local и убедитесь сами, что адрес все еще должен быть указан и маршрутизироваться локально.
Для IPv6 вы решаете, что делать. По умолчанию адрес удаляется (см. параметр ядра keep_addr_on_down для /proc/sys/net/ipv6/)

Ответ или решение

Ответ на вопрос: Почему клиент VPN имеет доступ ко всем интерфейсам вместо ограничения по подсети и отключенной переадресации?

Введение

VPN (Virtual Private Network) стал неотъемлемой частью сетевой инфраструктуры, обеспечивая безопасность и конфиденциальность соединений. Однако, иногда возникают ситуации, когда клиент VPN имеет доступ к интерфейсам, которые должны быть изолированы. В представленном контексте с Debian Linux инфраструктурой, мы рассмотрим, почему клиент VPN может взаимодействовать с различными интерфейсами и как обойти это поведение.

Доступ ко всем интерфейсам

Проблема доступа клиента VPN к интерфейсам, таким как eth0 и vmbr0, несмотря на настройку подсетей и отключение IPv4 переадресации, во многом объясняется тем, как работает IP-адресация и маршрутизация в Linux. Когда клиент пингует IP-адрес, который назначен какой-либо интерфейсной картой, система обрабатывает этот запрос локально.

  1. Локальная маршрутизация: В Linux маршрутизация IP-пакетов осуществляется через таблицы маршрутизации. Существует специальная локальная таблица маршрутизации, которая имеет приоритет на уровень 0. Пакеты, предназначенные для локальных адресов (т.е., адресов, назначенных самой системе), обрабатываются сразу и не требуют переадресации. Это объясняет, почему клиент VPN может видеть и пинговать адреса, даже если интерфейсы находятся в разных подсетях.

  2. Структура настроек: Ваша конфигурация WireGuard включает в себя инструкции, которые позволяют клиенту обрабатывать адреса 10.0.0.1/24, 172.16.0.0/16 и 192.0.2.0/24. Из-за этого клиент имеет возможность взаимодействовать с адресами на других интерфейсах, которые в основном обрабатываются локально операционной системой.

Почему клиент может пинговать интерфейсы, находящиеся в отключенном состоянии?

Если интерфейс, такой как eth0, был отключен, а его IP-адрес все еще числится в локальной таблице маршрутизации, то клиент VPN сможет пинговать этот адрес и получать ответ как от системы.

  1. Состояние интерфейса: Поскольку IP-адрес назначен интерфейсу, даже когда он отключен, операционная система продолжает считать его локальным адресом. Для статических адресов это означает, что, несмотря на отключение интерфейса, адрес всё ещё существует на уровне маршрутизации.

  2. Настройки IPv6: В случае IPv6 поведения могут быть изменены с помощью параметров конфигурации, чтобы решить, как операции с IP-адресами будут происходить на отключенных интерфейсах.

Решение для ограничения доступа клиента VPN

Чтобы ограничить доступ клиента к конкретным интерфейсам и обеспечить полную изоляцию, вам следует рассмотреть следующие шаги:

  1. Настройка iptables или nftables: Используйте системы межсетевого экрана для контроля входящего и исходящего трафика. Создайте правила, которые разрешают только трафик от интерфейса wg0 к вашему виртуальному машине на vmbr0.

  2. Ограничение разрешенных IP-адресов в конфигурации WireGuard: Ограничьте AllowedIPs в конфигурации клиента нюансами, чтобы он мог видеть только узкие адреса, необходимые для подключения к целевым системам.

  3. Изменение маршрутизации и анализа локальной таблицы: Проверьте вашу локальную таблицу маршрутизации через ip route show table local, чтобы убедиться, что исключительные адреса правильно обрабатываются, и удалите, если необходимо, адреса, которые не должны быть доступны.

Заключение

Практики управления сетевыми подключениями требуют тщательного внимания к деталям конфигурации и взаимодействия между интерфейсами. Понимание механизмов локальной маршрутизации и правильное применение фильтрации через iptables или nftables помогут вам значительно укрепить безопасность вашей инфраструктуры, ограничивая доступ к VPN-клиенту и создавая необходимые условия для изоляции интерфейсов.

Оцените материал
Добавить комментарий

Капча загружается...