LINUX.ORG.RU
ФорумAdmin

kvm/раздать интернет/

 ,


0

2

Доброго времени суток. В продолжении темы https://www.linux.org.ru/forum/admin/12941969 Создал еще одну вирт. сеть - изолированную. Создал на вирт. машине назовем ее ВМ1 - два адаптера, один в режиме NAT (eth0), второй в режиме изол. сети (eth1).

ВМ1 - eth0 подключен через сеть NAT.
ВМ1 - eth1 подключен к изол. сети.
Создал на вирт. машине ВМ2 - один адаптер в режиме изол. сети(eth0) - вот на нее надо раздать интернет через ВМ1.
ВМ2 - один инт. eth0 - изол. сеть.
Внутри самой ВМ1. настроил форвадинг., прописал правила для НАТ. По логам tcpdump увидел, что http запросы с интерфейса ВМ2 (eth0) не идут на инт. (eth1) ВМ1. Добавил правило для хоста:
iptables -t nat -A REDSOCKS_FILTER -i virbr1 -j RETURN
Запросы пошли, интернет заработал. Но суть проблемы скорость интернет соединения ВМ2 значительно выше, пинг меньше, чем на самом шлюзе ВМ1. Сделал вывод что ВМ2 ходит в инет не через ВМ1, а как то через хост. Запутался окончательно...



Последнее исправление: ving2 (всего исправлений: 2)

Надо в virt-manager вызвать свойства коннекта к гипервизору qemu system, на вкладке network создать еще одну сеть, стартануть ее. libvirt при этом создаст для этой сети бридж virbrN. Затем в обоих виртуальных машинах подключить сетевые адаптеры к этой сети. Виртуальные машины станут directly connected в этой сети через этот бридж. И никакой магии с iptables на хосте не нужно.

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

И никакой магии с iptables на хосте не нужно.

Это в обычном случае вроде как и не нужно, проблема вся в том, что создается виртуальный свитч virbr1 для этой изолированной сети. У меня он настроен в режиме none, не имеет ip адреса по логике вещей и не нужно, т.к. он не является шлюзом. Ну а трафик через него гонится в любом случае. А фильтруется он как раз через iptables на хосте.

ving2
() автор топика

Запутался окончательно...

Так сформулируйте чётко исходную задачу, которая поставлена перед вами.
А то пока совершенно непонятно, зачем городить весь этот огород с виртуалками, фаерволами, натами и проксями.

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

Так сформулируйте чётко исходную задачу, которая поставлена перед вами.

Ну одну задачу я выполнил, гость ВМ1 удачно ходит через прокси. Задача номер два, поднять на ВМ1 впн соединение. что тоже удачно. Настроить форвардинг на госте ВМ1 и заставить ВМ2 ходить в интернет через ВМ1. Т.е. маскарадинг (Nat) настроен через tun устройство на ВМ1. Но ВМ2 не хочет ходить в инет как задумано, пинг на ней получается меньше чем на ВМ1.

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

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

  1. Почему решили, что заворачивать трафик средствами прокси будет лучше, чем маршрутизировать его через VPN-интерфейс?
  2. Зачем вообще нужно поднимать виртуалки, чего не хватает в хостовой операционке?
  3. Для чего создавать именно 2 виртуалки, а не 1, 3 или 5?
  4. Почему выбран KVM, а не LXC или что-то иное?
  5. Зачем трафик гостя #2 заворачивать через гостя #1, разве не будет эффективнее пустить их параллельно?


Короче говоря, не понимая цели работы, тут можно наворотить такого, что потом придётся всё переделывать.

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

Не льстите себе, у вас как раз обычный случай. От бриджа не требуется никакой фильтрации. Такую же конфигурацию можно было бы собрать из двух реальных машин и реального свича, и реальный свич никакой фильтрации не делал бы. Почему в конфигурации с виртуальными машинами и бриджом бридж должен что-то фильтровать?

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

Короче говоря, не понимая цели работы, тут можно наворотить такого, что потом придётся всё переделывать.

1.Трафик и так заварачивается сначала в впн. Потом в прокси. Точнее в ссш туннель, который заворачивается в тор, который живет в отдельном контейнере. 3. 3,5 не нужно надо просто раздать интернет с шлюза на другую сеть. 4. Было выбрано что доступнее, т.к. запустилось на grsec ядре.На virtbox такая сеть работает без проблем, т.к. там концепция внутренней сети другая и хостом не контролируется, но virtbox не поднимается на grsec из за своих модулей. 5.Это будет не такая цепочка, если пустить их параллельно, точнее придется поднимать впн внутри каждой виртуальной машины, а хочется на шлюзе.

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

Почему в конфигурации с виртуальными машинами и бриджом бридж должен что-то фильтровать?

Я не до конца понимаю, т.к. квм особо не пользовался. Но трафик не идет если не добавить это правило:

iptables -t nat -A REDSOCKS_FILTER -i virbr1 -j RETURN
вот смотрю я на параметры виртуалок, пишу по памяти т.к. нет доступа сейчас:
virsh domiflist ВМ1
vnet1 NAT  #virbr0 сеть NAT
vne2  isolated # вот это свитч virbr1 изол. сеть
virsh domiflist ВМ2
vnet0 isolated #вот это свитч virbr1 
внутри машины ВМ1 поднимаются адаптеры  eth0 #virbr0, eth1 # это подключено к virbr1
внутри машины ВМ2 один адаптер eth0 #virbr1
Если не добавить правило выше, то http трафик от eth0 (вм2) не идет к eth1 (вм1)

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

В огороде бузина, а в Киеве дядька. Нат выполняет ВМ1, а магическое правило добавляется на хост в какую-то нестандартную цепочку, да не в фильтр, а в нат. Ну бред же. «Дорогая редакция, у меня в подполье стук.»

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

какую-то нестандартную цепочку, да не в фильтр, а в нат. Ну бред же.

Чтоб вы поняли дальнейший смысл IPTABLES -t nat -A PREROUTING -p tcp -j REDSOCKS_FILTER

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

Можно еще так сделать, чтоб трафик пошел от ВМ2 к ВМ1

iptables -t nat -A PREROUTING -p tcp ! -i virbr1 -j REDSOCKS_FILTER
а так он трафик пытается гнать на порт который слушает редсокс. Что не надо в данном случае. Т.к. ВМ1 подключена к прокси.

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

Да трафик между виртуалками вообще не должен в IP стек хоста попадать. Потому что destination mac адреса у этого трафика принадлежат интерфейсам, у которых нет IP адресов на хосте. Этот трафик должен коммутироваться бриджом на хосте с одного tun интерфейса на другой tun интерфейс (vnetN интерфейсы это tun). Может ты вручную на хосте добавил адреса на tun интерфейсы? Так это «наши руки не для скуки».

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

Может ты вручную на хосте добавил адреса на tun интерфейсы?

С vnet интерфейсами вообще ни каких манипуляций не производил. Добавил изол. сеть из xml:

<network>
  <name>isolated</name>
  <bridge name='virbr1' stp='on' delay='0'/>
</network>
Появляется интерфейс virbr1 без ip адреса. И уже внутри виртуалок на эти интерфейсы можно любые адреса назначить, ну чтоб они в одной сети были. Вот на них в ручную назначил. Заметил еще такой глюк, не всегда при старте машины которая является шлюзом ВМ1 на инт. eth1 который подключен к virbr1. Появляется дроп пакетов, помогает перезапуск сети virbr1. tcpdump -i eth1 Сыпит вот такими сообщениями
STP 802.1d, Config, Flags [none], bridge-id 8000.52:54:00:e4:ec:1b.8003, length 35
Похоже вот на этот баг https://bugzilla.redhat.com/show_bug.cgi?id=1301548

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

Да трафик между виртуалками вообще не должен в IP стек хоста попадать.

Попробовал пересобрать libvirtd на разных версиях одинаковое поведение. Стоит добавить правило в цепочку PREROUTING, трафик не идет между виртуалками. Почему тогда в описании изолированной сети говорится, что ограничение трафика только для внешнего мира, но не для хоста. вот например http://integrator.adior.ru/index.php/gui-kvm/349-nastrojka-virtualnoj-seti-kvm-kak-isolated-set.

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

Это всё из-за того, что libvirt добавляет на бриджовый интерфейс ip адрес. После этого броадкасты, попадающие в этот бридж, доставляются и на этот адрес и попадают в ip стек хоста. Но юникасты на адреса виртуалок всё равно не должны попадать в ip стек хоста.

Можно попытаться сделать виртуальную сеть без настроек ip в virt-manager. Но тогда адреса виртуалок в этой сети надо либо задавать на виртуалках статически, либо одна из виртуалок должна раздавать их по DHCP.

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

Мне кажется я понял, в чём твоя проблема. Если в виртуальной сети задана конфигурация IPv4, libvirt добавляет на бриджовый интерфейс адрес (чтобы хост тоже был в этой сети) и запускает на этом бриджовом интерфейсе dnsmasq. Этот dnsmasq (это dhcp сервер и dns forwarder в одном приложении) в качестве маршрута по умолчанию и dns сервера выдаёт по dhcp адрес хоста на этом бриджовом интерфейсе. Виртуалка, получившая настройки IPv4 по DHCP от этого dnsmasq, будет использовать хост в качестве шлюза по умолчанию и dns сервера. А тебе надо, чтобы вм2 в качестве шлюза по умолчанию и dns сервера использовала вм1. Надо на вм2 статически настроить шлюз по умолчанию, и адрес dns сервера.

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

А тебе надо, чтобы вм2 в качестве шлюза по умолчанию и dns сервера использовала вм1. Надо на вм2 статически настроить шлюз по умолчанию, и адрес dns сервера.

Только наверно вм1 должна быть шлюзом она же раздает интернет. Сразу так и сделал. Вот еще что пишется в офиц. доке, самый последний абзац. https://libvirt.org/formatnetwork.html#examplesPrivate Если создать сеть без gateway addresses (У меня virbr1 не имеет ip адреса). То вроде должна быть сеть как они пишут «very private» or «very isolated». А так чет пока не могу догнать как это вм2 должна быть шлюзом, если интернет она получает от вм1? Чет все в моей голове перевернулось=) И еще почему то при таких настройках демон ebtables пихает свои правила вроде как они и не нужны, зачем открыты порты на сервер dhcp и днс, если ifconfig virbr1

 virbr1 Link encap:Ethernet  HWaddr 52:52:x:x
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
iptables-save | grep virbr1 
-A INPUT -i virbr1 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr1 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr1 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr1 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -i virbr1 -o virbr1 -j ACCEPT
-A FORWARD -o virbr1 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr1 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o virbr1 -p udp -m udp --dport 68 -j ACCEP 

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

Пока у меня так, на ВМ1 на которой есть интернет:

auto eth1 #интерфейс который смотрит в "локалку"
iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0

на ВМ2, которая должа получить инет:

eth0 - адрес 192.168.1.27
шлюз - 192.168.1.1
днс - да любой может быть хоть гугл 8.8.8.8
А надо как сделать?

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

Попробывал шлюз прописал на вм1 и на вм2. Такие же симптомы.

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