LINUX.ORG.RU
ФорумAdmin

Как изолировать виртуалку от локальной сети но пустить в интернет / kvm / host ubuntu 16 / guest win 7

 , , , ,


0

1

Добрый день!)

Не могу составить нормальный запрос, чтобы найти ответ в сети. С сетью я не очень хорошо дружу, пока. Поэтому прошу Вашей помощи!)

Есть микротик, есть воткнутый в него Ubuntu Server 16.04 со следующими интерфейсами

auto br0
iface br0 inet dhcp
        bridge_ports enp3s0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off
        pre-up iptables-restore < /etc/iptables.up.rules

auto enp4s0
        iface enp4s0 inet static
        address 192.168.135.1
        netmask 255.255.255.0
        network 192.168.135.0
        broadcast 192.168.135.255

enp4s0 - сейчас бездействует.

# /etc/iptables.up.rules:
# Generated by iptables-save v1.6.0 on Sat Jan 13 15:12:40 2018
*nat
:PREROUTING ACCEPT [657:55334]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Sat Jan 13 15:12:40 2018
# Generated by iptables-save v1.6.0 on Sat Jan 13 15:12:40 2018
*filter
:INPUT ACCEPT [377:29463]
:FORWARD ACCEPT [299:36992]
:OUTPUT ACCEPT [1:76]
-A FORWARD -s 192.168.135.0/24 -i enp3s0 -o enp4s0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Sat Jan 13 15:12:40 2018

Есть виртуалки. Мостом отлично кидаются в микротик. Вот так я их устанавливаю (пример):

sudo virt-install \
--connect qemu:///system \
--name win7ult \
--memory 3072 \
--vcpus 2 \
--cdrom /home/user/images/win7.iso \
--os-variant win7 \
--disk /var/lib/libvirt/images/win7ult.img,size=100 \
--network bridge=br0 \
--graphics vnc,port=5927 \
--hvm \
--autostart \
--debug

Но одна из них (конкретно гость на windows 7) (а потом может быть и еще парочка) должны быть изолированы от сети микротика, но иметь выход в интернет.

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

Проблема еще в том, что в случае ошибки я могу потерять сервер, и добраться до него физически это несколько дней) Может заодно порекомендуете, как поступать в таких случаях? Какой-то сервис надо написать/запустить на сервере, чтобы он сам перезапускал нормальную сеть/сервер если потерял связь с миром?)

Ну так смаршрутизируй их, а не закидывай в мост, делов-то. libvirt умеет через dnsmasq раздавать DHCP для интерфейсов виртуалок, останется только настроить файрвол соответствующим образом и всё.

Может заодно порекомендуете, как поступать в таких случаях?

Делать все изменения без записи в конфиги и ставить задачу в cron которая проверяет нормальное состояние сервера(активность сетевых интерфейсов, пинг до заданного узла, что-то еще) и при необходимости - восстанавливает старую конфигурацию. Или даже ребутает сервер.

Pinkbyte ★★★★★
()

Я бы виртуалки в отдельную сеть посадил, и на хосте рубил доступ. А не бриджем как у вас.

anc ★★★★★
()

Раздать с помощью dhcp IPшник виртуалке, а уже на роутере резать все соединения с этого IPшника в локалку и обратно. Как то так:

iptables -A FORWARD -s 192.168.1.2 -m iprange --dst-range 192.168.1.3-192.168.1.254 -j REJECT
iptables -A FORWARD -d 192.168.1.2 -m iprange --src-range 192.168.1.3-192.168.1.254 -j REJECT
FluffyPillow
()
Последнее исправление: FluffyPillow (всего исправлений: 1)

Выкинуть из br0 «bridge_ports enp3s0», задать статиком адрес/маску для br0 по аналогии с enp4s0 , а enp3s0 сконфигурировать через dhcp.

виртуалки подключать к br0

-A FORWARD -s 192.168.135.0/24 -i enp3s0 -o enp4s0 -m conntrack --ctstate NEW -j ACCEPT

не работает, т.к. пакеты приходят через br0, а работает оно из-за ACCEPT в policy для FORWARDING.

Чтобы изолировать гостевую систему от локалки (enp3s0) в FORWARD нужно будет вставить запрещающие правила (1-2 шт.)

"-A POSTROUTING -j MASQUERADE" в nat - зло! Если интернет приходит через enp3s0, то добавь "-o enp3s0"

PS Есть средство для фильтрации в брижде - ebtables, но оно требует не только знаний по основам ip-сетей и понимания картинки https://en.wikipedia.org/wiki/Netfilter#/media/File:Netfilter-packet-flow.svg

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от anc

Разве? Роутер выполняет транзит пакетов для локальной сети же? Тогда ведь можно их рубить.

P.S Я только учусь, не сердитесь.

FluffyPillow
()
Ответ на: комментарий от FluffyPillow

Роутер выполняет транзит пакетов для локальной сети же?

Сфига?

Я только учусь, не сердитесь.

Блин, сколько раз повторять. Представим: Вот у вас есть два ноута 10.0.0.2 и 10.0.0.3 и роутер 10.0.0.1 сеть 10.0.0.0/24
Пакеты от 10.0.0.2 до 10.0.0.3 Как полетят? Правильно, напрямую. Роутер 10.0.0.1 тут не задействован от слова совсем.
Читаем Сети для самых маленьких. Может поймете.

anc ★★★★★
()
Ответ на: комментарий от FluffyPillow

Перечитайте тему, у ТС роутер отдельно а комп с виртуалками отдельно. До роутера пакеты не долетят.

anc ★★★★★
()
Ответ на: комментарий от FluffyPillow

Зачем вы приводите схему в ведре когда речь идет о локальной сети? Еще раз «Сети для самых маленьких»

anc ★★★★★
()
Ответ на: комментарий от anc

Так а разве та схемка здесь не сработает? Ведь, допустим, 10.0.0.5 хост шлёт пакеты хосту 10.0.0.6 через витую пару которая идёт в роутер, то есть он может и их фильтровать. Нет?

FluffyPillow
()
Ответ на: комментарий от FluffyPillow

Если «умный» коммутатор то фильтрацию между физическими портами сделать можно. Только слово роутер(маршрутиризатор) здесь не уместно.

anc ★★★★★
()
Ответ на: комментарий от FluffyPillow

Блина ну сколько раз повторять? Роутер не может фильтровать локальный трафик. До него этот трафик просто не доходит. Дело роутера переправить пакеты из одной сети в другую и обратно.
Третий и последний раз «Сети для самых маленьких»

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от dhameoelin

В общем решил изучить VLAN.

Начал идти по инструкции настройки Open vSwitch https://habrahabr.ru/post/242741/

Настроил vSwitch

:~$ sudo ovs-vsctl show
18ce869f-8bfd-494b-9e02-7af81c220158
    Bridge "ovs-br0"
        Port "enp3s0"
            Interface "enp3s0"
        Port "ovs-br0"
            Interface "ovs-br0"
                type: internal
    ovs_version: "2.5.4"

:~$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

auto enp3s0
iface enp3s0 inet manual

auto ovs-br0
iface ovs-br0 inet static
        address 10.0.7.1
        netmask 255.255.255.0
        network 10.0.7.0
        broadcast 10.0.7.255
        gateway 10.0.7.254
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 10.0.1.1

auto enp4s0
        iface enp4s0 inet static
        address 192.168.135.1
        netmask 255.255.255.0
        network 192.168.135.0
        broadcast 192.168.135.255

после этого запускаю скрипт:

 
#!/bin/bash
ifconfig br0 0
ifconfig enp3s0 0
ifconfig ovs-br0 10.0.7.1/24 up
ip r add default via 10.0.7.254

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

Я наверное должен после этого на микротике перенастроить порт с access на trunk? правильно?

Я конечно начал читать «сети для самых маленьких», но буду благодарен если поможете, там на долго...)

Vetrintsev
() автор топика
Ответ на: комментарий от Vetrintsev

Чето сложно :) но я обнаружил, что у меня же есть дефолтный виртуальный адаптер virbr0:

virbr0    Link encap:Ethernet  HWaddr 52:54:00:4c:5a:ae
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14128 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23533 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:889966 (889.9 KB)  TX bytes:32241894 (32.2 MB)

настроил нужного гостя на него, гость получил ip: 192.168.122.82

на сервере добавил правила:

sudo iptables -A FORWARD -s 192.168.122.0/24 -d 192.168.0.0/24 -j REJECT
sudo iptables -A FORWARD -s 192.168.0.0/24 -d 192.168.122.0/24 -j REJECT

но с гостя пингуется, например, 192.168.0.106 - это другая виртуалка проброшенная мостом в микротик. А мне надо чтобы не пинговалась...

sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
ACCEPT     all  --  192.168.135.0/24     anywhere             ctstate NEW
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
REJECT     all  --  192.168.122.0/24     192.168.0.0/24       reject-with icmp-port-unreachable
REJECT     all  --  192.168.0.0/24       192.168.122.0/24     reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc

Топчусь на месте, вроде должно быть очевидное решение, задача то типовая, особенно через такой виртуальный адаптер...

Vetrintsev
() автор топика
Ответ на: комментарий от Vetrintsev

iptables tutorial это тоже не быстро, но прочитать стоит.
По простому. Правила работают последовательно до первого совпадения, вот у вас:
1.
ACCEPT all  — 192.168.122.0/24 anywhere
т.е. для пакетов с исходящим адресом из сети 192.168.122.0/24 и с любым адресом назначения разрешено прохождение.
2. Ответ пройдет благодаря правилу
ACCEPT all  — anywhere 192.168.122.0/24 ctstate RELATED,ESTABLISHED

До правил с REJECT обработка не дойдет.

Плохой вариант но для теста пройдет, используйте -I а не -A
iptables -I FORWARD....

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.