Вопрос или проблема
У меня есть домашняя лаборатория, настроенная следующим образом (схему также можно найти здесь):
Одно, что стоит отметить здесь, это то, что у моего хоста 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 и ВМ 2 к устройствам в моей домашней сети? TCP/UDP/ICMP и все остальное.
-
Как мне получить доступ к ВМ 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, но я использую ее, чтобы проиллюстрировать требование.
Ответ или решение
Как отправить запросы из домашней сети в 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 и маршрутизирования. Если у вас возникнут дополнительные вопросы или потребуется помощь с более сложными сценариями, не стесняйтесь обращаться за помощью.