Виртуальный маршрутизатор в homelab Proxmox VM: как отправить запросы из основной/домашней сети на VM за виртуальным маршрутизатором?

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

У меня есть домашняя лаборатория, настроенная следующим образом (схему также можно найти здесь):

network

Одно, что стоит отметить здесь, это то, что у моего хоста Proxmox только один сетевой интерфейс для ethernet-кабеля. У него также есть WiFi, но я решил не использовать его, потому что он не будет работать так, как мне нужно (это мое понимание после прочтения десятков статей и форумов об этом).

Итак, я подключил ethernet-кабель от WiFi-репитера. Этот хост Proxmox находится в другом месте моего дома – именно поэтому я не подключил ethernet непосредственно к домашнему маршрутизатору. С моего ноутбука я могу беспроводным способом подключиться по SSH к хосту Proxmox (192.168.1.5) без проблем. Я также могу беспроводным способом получить доступ к веб-интерфейсу Proxmox по адресу https://192.168.1.5:8006 без проблем.

Что я хочу сделать здесь, так это сегментацию сети между моей домашней сетью и сетью ВМ. Я знаю, что есть бесплатное программное обеспечение для маршрутизаторов, такое как pfSense, OpenWrt и т.д. Но я хочу воспользоваться этой возможностью, чтобы создать это с нуля, чтобы лучше понять, как все работает вместе.

Я планирую запустить несколько ВМ на этом хосте Proxmox. Все они должны работать в сети ВМ, которую я создаю здесь. Некоторые ВМ могут работать в динамическом режиме IP/DHCP, а некоторые могут работать в статическом режиме IP. 99% из них будут ВМ на базе Linux. На данный момент мне не нужна поддержка IPv6 в этой сети ВМ. Кроме того, использование VLAN не является вариантом, потому что мой маршрутизатор не поддерживает VLAN.

Скажу так, я следовал этому руководству, чтобы создать виртуальный маршрутизатор в ВМ Ubuntu. Единственное, что я сделал иначе, чем в этом руководстве, это создал мост (br0) и назначил ему статический IP (192.168.2.1/24), чтобы он мог быть маршрутизатором / виртуальным коммутатором для сети моих ВМ.

Я не следовал шагам Перенаправление портов из Интернета в LAN и Так, о тестировании…, потому что они мне не нужны. Другими словами, я следовал всем шагам до и включая шаг Разрешение трафика в Интернет.

Что я вижу в данный момент:

  • [OK] ВМ могут пинговать друг друга
  • [OK] ВМ могут пинговать интернет
  • [Not OK] ВМ 1 и ВМ 2 могут пинговать устройства в домашней сети, например, ноутбук и маршрутизатор
  • [OK] Ноутбук может пинговать ВМ маршрутизатора
  • [Not OK] Ноутбук не может пинговать ВМ 1 или ВМ 2*

* Я уже добавил статический маршрут на своем ноутбуке, следуя этому руководству. Я также пробовал добавить статический маршрут в домашний маршрутизатор/шлюз.

Для информации, ниже приведены мои конфигурации…

ip a с хоста Proxmox:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UP group default qlen 1000
    link/ether fc:4d:d4:f3:fe:d3 brd ff:ff:ff:ff:ff:ff
    altname enp0s25
3: wlp2s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 28:c2:dd:a5:46:53 brd ff:ff:ff:ff:ff:ff
4: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fc:4d:d4:f3:fe:d3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.5/24 scope global vmbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::fe4d:d4ff:fef3:fed3/64 scope link
       valid_lft forever preferred_lft forever
5: vmbr1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 8e:7e:21:7e:f9:e1 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::8c7e:21ff:fe7e:f9e1/64 scope link
       valid_lft forever preferred_lft forever
11: tap104i0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UNKNOWN group default qlen 1000
    link/ether b6:5c:75:be:38:d5 brd ff:ff:ff:ff:ff:ff
12: vmbr2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 3e:6b:04:2c:d9:e0 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::3c6b:4ff:fe2c:d9e0/64 scope link
       valid_lft forever preferred_lft forever
13: tap104i1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr2 state UNKNOWN group default qlen 1000
    link/ether 46:d9:8f:dd:ab:77 brd ff:ff:ff:ff:ff:ff
23: tap102i0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr2 state UNKNOWN group default qlen 1000
    link/ether 46:9c:a4:fd:81:27 brd ff:ff:ff:ff:ff:ff
24: tap103i0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr2 state UNKNOWN group default qlen 1000
    link/ether 12:90:ee:36:27:7a brd ff:ff:ff:ff:ff:ff

Содержимое /etc/network/interfaces на хосте Proxmox:

auto lo
iface lo inet loopback

iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
    address 192.168.1.5/24
    gateway 192.168.1.1
    bridge-ports eno1
    bridge-stp off
    bridge-fd 0

iface wlp2s0 inet manual

auto vmbr1
iface vmbr1 inet manual
    bridge-ports none
    bridge-stp off
    bridge-fd 0

auto vmbr2
iface vmbr2 inet manual
    bridge-ports none
    bridge-stp off
    bridge-fd 0

post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '192.168.2.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '192.168.2.0/24' -o vmbr0 -j MASQUERADE

Примечания:

  • vmbr1 был из моего предыдущего эксперимента и не имеет отношения к теме; ни одна из моих ВМ не использует сеть vmbr1
  • Строки post-up и post-down были скопированы из этого руководства – часть моих проб и ошибок

ip a из ВМ маршрутизатора:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 2a:06:12:a9:18:98 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 192.168.1.175/24 metric 100 brd 192.168.1.255 scope global dynamic ens18
       valid_lft 4270sec preferred_lft 4270sec
    inet6 fe80::2806:12ff:fea9:1898/64 scope link
       valid_lft forever preferred_lft forever
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether ca:bc:10:17:e0:2f brd ff:ff:ff:ff:ff:ff
    altname enp0s19
    inet6 fe80::c8bc:10ff:fe17:e02f/64 scope link
       valid_lft forever preferred_lft forever
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether da:56:23:09:09:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.1/24 brd 192.168.2.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::d856:23ff:fe09:972/64 scope link
       valid_lft forever preferred_lft forever

Содержимое /etc/network/interfaces в ВМ маршрутизатора:

auto lo
iface lo inet loopback

auto ens18
iface ens18 inet dhcp

#auto ens19
#iface ens19 inet static
#   address 192.168.99.1
#   netmask 255.255.255.0

Настройки IP-переадресации в ВМ маршрутизатора:

$ cat /etc/sysctl.conf | grep net.ipv4.ip_forward
net.ipv4.ip_forward=1

Содержимое /etc/network/if-pre-up.d/iptables в ВМ маршрутизатора:

#!/bin/sh
/sbin/iptables-restore < /etc/network/iptables

Содержимое /etc/network/iptables в ВМ маршрутизатора:

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# ens18 - WAN интерфейс
# br0 - LAN интерфейс
-A POSTROUTING -o ens18 -j MASQUERADE

COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# Правила сервиса
# основные глобальные правила принятия - ICMP, петля, трассировка, все установленные
-A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT

# разрешить отклонения трассировки
-A INPUT -p udp -m udp --dport 33434:33523 -j REJECT --reject-with icmp-port-unreachable

# DNS - разрешить из LAN
-A INPUT -i br0 -p tcp --dport 53 -j ACCEPT
-A INPUT -i br0 -p udp --dport 53 -j ACCEPT

# DHCP клиентские запросы - разрешить из LAN
-A INPUT -i br0 -p udp --dport 67:68 -j ACCEPT

# SSH - разрешить из WAN
-A INPUT -i ens18 -p tcp --dport 22 -j ACCEPT

# заблокировать весь другой входящий трафик
-A INPUT -j DROP

# Правила переадресации
# переадресовывать пакеты по установленным/сопутствующим соединениям
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# переадресовывать ICMP
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -p icmp -s 0.0.0.0/0 -d 192.168.2.0/24 -j ACCEPT

# переадресовывать из LAN (br0) в WAN (ens18)
-A FORWARD -i br0 -o ens18 -j ACCEPT

# заблокировать весь другой переадресованный трафик
-A FORWARD -j DROP

COMMIT

Результат выполнения команды sudo iptables -S в ВМ маршрутизатора:

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p udp -m udp --dport 33434:33523 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -i br0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i br0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i br0 -p udp -m udp --dport 67:68 -j ACCEPT
-A INPUT -i ens18 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j DROP
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -d 192.168.2.0/24 -p icmp -j ACCEPT
-A FORWARD -i br0 -o ens18 -j ACCEPT
-A FORWARD -j DROP

Конфигурация DHCP в /etc/dhcp/dhcpd.conf в ВМ маршрутизатора:

subnet 192.168.2.0 netmask 255.255.255.0 {
    range 192.168.2.100 192.168.2.199;
    option routers 192.168.2.1;
    option domain-name-servers 192.168.2.1;
    option broadcast-address 192.168.2.255;
        host ubuntu-desktop {
          hardware ethernet 5A:5B:74:01:69:34;
          fixed-address 192.168.2.2;
        }
}

Примечание: ubuntu-desktop – это ВМ 1

Вопросы:

  1. Как мне заблокировать доступ ВМ 1 и ВМ 2 к устройствам в моей домашней сети? TCP/UDP/ICMP и все остальное.

  2. Как мне получить доступ к ВМ 1 и ВМ 2, когда я использую ноутбук или настольный компьютер, например, отправляя ping/ICMP-запрос (ping 192.168.2.2/ping 192.168.2.101), получая доступ к процессу Nginx, работающему на порту 80 (curl 192.168.2.2/curl 192.168.2.101), и к процессу SSH-сервера, работающему на порту 22 (ssh [email protected]/ssh [email protected]) на обеих ВМ?

Я провел исследование этого, и я столкнулся с темой DNAT/SNAT/Masquerade, но я не уверен, нужно ли мне это. Если да, то как должны выглядеть правила? Я новичок в этой теме iptables. Я пробовал нижеприведенные правила, но я до сих пор не могу пинговать ВМ 1 и ВМ 2 со своего ноутбука.

iptables -I FORWARD -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT
iptables -I FORWARD -s 192.168.2.0/24 -d 192.168.1.0/24 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -d 192.168.2.0/24 -j SNAT --to 192.168.2.1

Интерфейс моста позволяет ВМ1 и ВМ2 пинговать ноутбук и ПК, поскольку они принадлежат к одной широковещательной домене (192.168.2.0/24). Вам нужно избавиться от интерфейса моста и заменить его на только хост-адаптер / сеть.

Давайте предположим, что ваша изолированная сеть ВМ – 192.168.10.0/24. Тогда вам необходимо включить маскарадинг на ВМ маршрутизатора:

$ sudo iptables -A POSTROUTING -o ens18 -j MASQUERADE

Чтобы ноутбук/ПК мог пинговать ВМ1 или ВМ2, вам нужно добавить статический маршрут на физический шлюз/маршрутизатор через proxmox (192.168.1.5).

$ sudo ip route add 192.168.10.0/24 via 192.168.1.5

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

Ссылка: https://dannyda.com/2020/06/01/how-to-create-an-internal-only-isolated-network-for-guest-os-virtual-machines-vm-on-proxmox-ve-pve-like-in-vmware-workstation-host-only-network-but-different/

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

Как отправить запросы из домашней сети в VM за виртуальным маршрутизатором в Proxmox

Ваша установка сети в домашней лаборатории на базе Proxmox с использованием виртуального маршрутизатора на основе Ubuntu – это распространённый подход для сегментации сети и управления трафиком между VM и домашней сетью. Давайте разберем основные шаги, которые помогут вам решить ваши задачи.

1. Блокировка доступа VM к домашней сети

Чтобы VM (например, VM1 и VM2) не могли получать доступ к устройствам в вашей домашней сети, вам нужно правильно настроить правила iptables на вашем виртуальном маршрутизаторе. Предложенные вами правила требуют небольших корректировок. Вот рекомендации для реализации этой цели:

# Блокируем весь исходящий трафик из сетевого сегмента VMs в домашнюю сеть
iptables -A FORWARD -s 192.168.2.0/24 -d 192.168.1.0/24 -j DROP

# Разрешаем трафик обратно для установленных соединений (чтобы подключенные сессии могли работать)
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Эти правила гарантируют, что трафик из сегмента 192.168.2.0/24, состоящего из ваших виртуальных машин, не попадет в домашнюю сеть 192.168.1.0/24.

2. Доступ к VM из домашней сети

Чтобы вы могли отправлять запросы к VM из вашего ноутбука или стационарного компьютера, вам необходимо настроить статический маршрут на домашнем маршрутизаторе (или на самом ноутбуке). Это позволит маршрутизатору направлять пакеты к вашим VM через виртуальный маршрутизатор. Рассмотрим как это сделать:

  • Если ваш маршрутизатор поддерживает настройку статических маршрутов, добавьте маршрут следующим образом (указан пример для Linux):
sudo ip route add 192.168.2.0/24 via 192.168.1.5

В данной команде 192.168.1.5 – это IP-адрес вашего хоста Proxmox.

  • Если ваш маршрутизатор не поддерживает статические маршруты, вы не сможете нормально настраивать соединение с VM.

3. Настройка NAT для связи с VM

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

iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE

Здесь ens18 – это интерфейс, который подключен к интернету.

4. Проведение окончательных проверок

После изменения маршрутов и настройки iptables, выполните следующие проверки:

  • Убедитесь, что ваши VM имеют доступ к интернету.
  • Попробуйте выполнить ping с вашего ноутбука на IP-адреса ваших VM, например:
ping 192.168.2.2
  • Если у вас работает сервер Nginx на одном из VM, попробуйте получить доступ через браузер или curl:
curl http://192.168.2.2

Заключение

Ваша настройка сети, направленная на изоляцию VM от домашней сети с использованием виртуального маршрутизатора, может быть реализована с помощью соответствующих правил iptables и маршрутизирования. Если у вас возникнут дополнительные вопросы или потребуется помощь с более сложными сценариями, не стесняйтесь обращаться за помощью.

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

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