Та же подсеть для клеток что и на физическом интерфейсе

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
гест
проходил мимо

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение гест » 2016-11-12 21:32:39

Подскажите, плиз, а то я сам не соображу.
Есть em0, на котором 10.0.0.1.0/24, есть желание собрать на этой системе клетки и раздать им ту же подсеть. Делать другую и роутить - не хочу. Не роутить и редиректить на порты клеток - тоже не хочу.

Самый простой вариант - это алиасы на em0, но он отпадает - между клетками нужен файрвол, а с альясами pf не работает.
Самый сложный вариант - это vinet вместо альясов и бридж с em0, но придётся переделывать клетки и неизвестно что со стабильностью.

Вариант с lo выглядит интересным - между альясами lo pf пакеты ловит (почему, кстати, я не нашёл, но ловит). Но lo нельзя засадить в бридж.
В общем, какие есть варианты? :)

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

guest
проходил мимо

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение guest » 2016-11-12 22:31:34

гест писал(а):Подскажите, плиз, а то я сам не соображу.
Есть em0, на котором 10.0.0.1.0/24, есть желание собрать на этой системе клетки и раздать им ту же подсеть. Делать другую и роутить - не хочу. Не роутить и редиректить на порты клеток - тоже не хочу.

Самый простой вариант - это алиасы на em0, но он отпадает - между клетками нужен файрвол, а с альясами pf не работает.
Вы с клетками работали или просто изучаете?
Какой такой firewall _между_ клетками?
У клеток нет сети, пристегиваются интерфейсы из хост-машины, соответственно firewall для хоста и
jail-vm - настраивается в хост машине.
Самый сложный вариант - это vinet вместо альясов и бридж с em0, но придётся переделывать клетки и неизвестно что со стабильностью.

Вариант с lo выглядит интересным - между альясами lo pf пакеты ловит (почему, кстати, я не нашёл, но ловит). Но lo нельзя засадить в бридж.
В общем, какие есть варианты? :)
vnet - это vimage в ядре и соответственно, наличие виртуальной сети в jail'ах.
Использую vimage с 10-11'ого года, не знаю как сейчас, но pf регулярно правили для работы с vimage.

vnet(vimage) + ipfw - работает стабильно, что с epair, что с netgraph, с virtio не пробовал.

Проблема у jail+vnet - одна, апгрейдить вместе с хостом, у традиционных jail - нет такой проблемы,
ну это и понятно.

При наличии bhyve, не вижу смысла связываться с тухлой реализацией jail, которые с 2007'а не могут
довести до уровня полноценных контейнеров, вялотекущее развитие jail'ов, наверняка забросят, ибо
есть bhyve и все силы отдают реальному гипервизору.

Так что решайте:
- pf или jail+ipfw
- pf + bhyve

Лучше все делать на 11'ой ветке.

гест
проходил мимо

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение гест » 2016-11-12 22:59:46

guest писал(а): Какой такой firewall _между_ клетками?
Файрвол на хосте, который прописывает правила взаимодействия между клетками. В случае с альясами на физическом интерфейсе это невозможно.
Виртуальная сеть в клетке мне не нужна, поэтому я до последнего буду не хотеть возиться с vinet. В общем, я думаю, вопрос в том, чтобы объединить lo и em0 каким-то образом, потому что как я уже говорил, pf с альясами на lo работает.
guest писал(а):не вижу смысла связываться с тухлой реализацией jail
Лень вестись на троллинг.

guest
проходил мимо

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение guest » 2016-11-13 23:05:31

гест писал(а):
guest писал(а): Какой такой firewall _между_ клетками?
Файрвол на хосте, который прописывает правила взаимодействия между клетками. В случае с альясами на физическом интерфейсе это невозможно.
Виртуальная сеть в клетке мне не нужна, поэтому я до последнего буду не хотеть возиться с vinet. В общем, я думаю, вопрос в том, чтобы объединить lo и em0 каким-то образом, потому что как я уже говорил, pf с альясами на lo работает.
guest писал(а):не вижу смысла связываться с тухлой реализацией jail
Лень вестись на троллинг.
не знаю как на счет троллинга, но такой глупости как выше, давно не читал.

Вы уж отпишите про реализацию "файрвол с правилами взаимодействия между клетками"
и про объединение "lo и em0".

В любом случае, удачи, желаю найти решение.

Аватара пользователя
Amadeus
ст. сержант
Сообщения: 332
Зарегистрирован: 2008-10-05 12:42:44
Откуда: Kiev

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение Amadeus » 2016-11-13 23:36:55

undefined писал(а): между клетками нужен файрвол, а с альясами pf не работает.
1) Почитайте, пожалуйста, теорию, что такое FreeBSD Jail.
2) После того, как будет выполнен пункт 1, станет понятно, что даже если у вас на хосте 100500 клеток и висят они да хоть на SuPerMeGaCartd0
если вы хотите настроить взаимодействие МЕЖДУ ними повесьте tcpdump на lo0 и посмотрите. Самое банальное правило взаимодействия выглядит так

Код: Выделить всё

ipfw add 00099 allow ip from any to any via lo0

Дальше - по потребностям
В случае с альясами на физическом интерфейсе это невозможно.
А вы как проверяли? "Я тебе говорю, невозможно и все?"
Нет ничего невозможного

гест
проходил мимо

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение гест » 2016-11-14 0:07:23

Amadeus писал(а): повесьте tcpdump на lo0 и посмотрите
Либо я очень плохо изланаю свои мысли или Вы не прочитали суть проблемы. К lo у меня вопросов нет.
Amadeus писал(а):А вы как проверяли? "Я тебе говорю, невозможно и все?"
Испытаниями на реальном железе. Правила файрвола не работают на физическом интерфейсе, tcpdump на железном интерфейсе не показывает прохождение пакетов, потому что - представьте себе - по нему они действительно не проходят.

гест
проходил мимо

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение гест » 2016-11-14 0:11:57

В общем, пишу ещё раз что мне нужно
1. Клетки должны находиться в одной подсети с физическим интерфейсом.
2. Между клетками должен быть работаютший на хосте файрвол.
3. Хорошо бы чтобы это не был vimage.

Способы которыми я пока пытался решить задачу
1. Алиасы на физическом интерфейсе - невыполнение п.2
2. Клетки на lo - невыполнение п.1

Аватара пользователя
Amadeus
ст. сержант
Сообщения: 332
Зарегистрирован: 2008-10-05 12:42:44
Откуда: Kiev

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение Amadeus » 2016-11-14 2:06:40

Либо я очень плохо изланаю свои мысли или Вы не прочитали суть проблемы. К lo у меня вопросов нет.
Я то как раз прочитал суть "проблемы". Только это НЕ проблема, а недопонимание как и каким образом работают клетки. И каким образом они коммуницируются с внешним миром.

Испытаниями на реальном железе. Правила файрвола не работают на физическом интерфейсе, tcpdump на железном интерфейсе не показывает прохождение пакетов, потому что - представьте себе - по нему они действительно не проходят.
Не ерничайте, эта "проблема" испытаниями на реальном железе, решается за минут 15. И если вы говорите что их проводили, значит у меня какое то особенное железо. Ради интереса сейчас воспроизвел. При том что я не использую pass pf правил. Не нравится их синтаксис. Но то опционально

В нижеописанном примере, SSH порт взят опционально. То что Вам требуется - уже решайте сами.

Дано:

Код: Выделить всё

root@freebsd11:/etc # jls
   JID  IP Address      Hostname                      Path
     3  10.21.1.182     db                            /data/jails/db
     4  10.21.1.181     test1                         /data/jails/test1
Это тестовый сервер. На котором развёрнуты две клетки, и обычная 2С /23 сеть.

Висят они, на LAN интерфейсе

Код: Выделить всё

em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=4219b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MAGIC,VLAN_HWTSO>
        ether 68:05:ca:34:5a:4f
        inet 10.21.1.235 netmask 0xfffffe00 broadcast 10.21.1.255
        inet 10.21.1.180 netmask 0xfffffe00 broadcast 10.21.1.255
        inet 10.21.1.182 netmask 0xfffffe00 broadcast 10.21.1.255
        inet 10.21.1.181 netmask 0xfffffe00 broadcast 10.21.1.255
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
Что бы не писать портянку - несколькими постами набросаю

Отправлено спустя 4 минуты 33 секунды:
Далее, подгружаем самый простой файрвол, pf , для начала

Код: Выделить всё

pass in on $int_if from any to any
pass out on $ext_if from $ext_if to any.
pass in on $ext_if proto tcp from any to $ext_if port ssh
pass in inet proto icmp all icmp-type echoreq.
Это так, сферический конь в вакуме, но для теста - пойдет.

заходим в первую клетку
root@freebsd11:/etc # jexec 3 /bin/sh

Код: Выделить всё

# uname -a
FreeBSD db 11.0-RELEASE-p1 FreeBSD 11.0-RELEASE-p1 #0: Wed Oct 12 11:41:43 EEST 2016     sergey@freebsd11:/usr/obj/usr/src/sys/GENERIC  amd64
И из нее, например, пингуем другую

Код: Выделить всё

# ping 10.21.1.181
PING 10.21.1.181 (10.21.1.181): 56 data bytes
64 bytes from 10.21.1.181: icmp_seq=0 ttl=64 time=0.032 ms
Отправлено спустя 3 минуты 5 секунд:

Код: Выделить всё

root@freebsd11:~ # tcpdump -i em1 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on em1, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
33 packets received by filter
0 packets dropped by kernel
root@freebsd11:~ # tcpdump -i lo0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
21:36:55.576777 IP 10.21.1.182 > 10.21.1.181: ICMP echo request, id 19724, seq 44, length 64
21:36:55.576805 IP 10.21.1.181 > 10.21.1.182: ICMP echo reply, id 19724, seq 44, length 64
21:36:56.640118 IP 10.21.1.182 > 10.21.1.181: ICMP echo request, id 19724, seq 45, length 64
21:36:56.640168 IP 10.21.1.181 > 10.21.1.182: ICMP echo reply, id 19724, seq 45, length 64
Вот это к вопросу через КАКОЙ интерфейс клетки взамодействуют между собой НА локальной машине.

Идем далее.

Отправлено спустя 4 минуты 57 секунд:
Вам для того, что бы работал файрвол через lo0 надо проверять трафик через этот интерфейс. Соответственно если вверху конфига у вас есть что то типа

Код: Выделить всё

set skip on lo0
Это убирается.

Далее, для теста делаем вот такую распиновку по интефейсам

Код: Выделить всё

ext_if="em0"
int_if="lo0"
lan_if="em1"
Далее основные правила

Код: Выделить всё

table <main> { 10.21.1.181 }

pass in on $int_if proto tcp from any to <main> port ssh
pass out on $int_if proto tcp to any port ssh.

И самый простой например такой кусок.

Отправлено спустя 6 минут 46 секунд:
При этом убираем правило

Код: Выделить всё

#pass in on $int_if from any to any
Итого мы получаем

Код: Выделить всё

freebsd11:/etc # jls
   JID  IP Address      Hostname                      Path
     3  10.21.1.182     db                            /data/jails/db
     4  10.21.1.181     test1                         /data/jails/test1
root@freebsd11:/etc # jexec 3 /bin/sh
# telnet 10.21.1.181 22
Trying 10.21.1.181...
Connected to 10.21.1.181.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.2 FreeBSD-20160310
^C^\^D
Connection closed by foreign host.
# telnet 10.21.1.182 22
Trying 10.21.1.182...
Отправлено спустя 3 минуты 57 секунд:
Далее, взаимодействие МЕЖДУ клетками я показал, далее, вам надо что бы остальные машины видели.

Окей.
pass in on $lan_if proto tcp from any to <main> port ssh
pass out on $lan_if proto tcp to any port ssh
В файрволе на исходной машине

мы получаем

Код: Выделить всё

[root@gw1 /]# telnet 10.21.1.182 22
Trying 10.21.1.182...
^C
[root@gw1 /]# telnet 10.21.1.181 22
Trying 10.21.1.181...
Connected to 10.21.1.181.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.2 FreeBSD-20160310
^C^]
Отправлено спустя 12 минут 36 секунд:
Естественно - начальное правило перед pass

Код: Выделить всё

block all
Нет ничего невозможного

гест
проходил мимо

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение гест » 2016-11-14 9:56:12

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

Код: Выделить всё

em0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=42098<VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,VLAN_HWTSO>
	ether 00:1b:21:bf:3e:f9
	inet 10.0.1.2 netmask 0xffffff00 broadcast 10.0.1.255 
	inet 10.0.1.4 netmask 0xffffffff broadcast 10.0.1.4 
	inet 10.0.1.6 netmask 0xffffffff broadcast 10.0.1.6 
	inet 10.0.1.3 netmask 0xffffffff broadcast 10.0.1.3 
	inet 10.0.1.5 netmask 0xffffffff broadcast 10.0.1.5 
	inet 10.0.1.7 netmask 0xffffffff broadcast 10.0.1.7 
	inet 10.0.1.9 netmask 0xffffffff broadcast 10.0.1.9 
	inet 10.0.1.11 netmask 0xffffffff broadcast 10.0.1.11 

Код: Выделить всё

ifconfig_em0="inet 10.0.1.2 netmask 255.255.255.0"
ifconfig_em0_alias0="inet 10.0.1.3 netmask 255.255.255.255"
и т.д.

Код: Выделить всё

int="em0"					# LAN + Jails
block all
pass in on $int inet proto icmp all icmp-type $icmp_types					# ICMP
pass in on $int inet proto tcp from any to $int:network port ssh				# SSH
Проверяем, что pf загружен и конфиг применён.
В общем, от этого конфига можно ожидать что клетки не смогут взаимодействовать друг с другом, правильно?
Идём на клетку и пытаемся прицепиться на порт постгреса на другой клетке.

Код: Выделить всё

root@proxy:~ # telnet  10.0.1.6 5432
Trying 10.0.1.6...
Connected to 10.0.1.6.
Escape character is '^]'.
Результат pfctl -sr для верности

Код: Выделить всё

scrub in on em0 all fragment reassemble
block drop all
pass out quick on em0 all flags S/SA keep state (if-bound)
pass out quick on em1 all flags S/SA keep state (if-bound)
pass in on em0 inet proto icmp all icmp-type echoreq keep state (if-bound)
pass in on em0 inet proto icmp all icmp-type unreach keep state (if-bound)
pass in on em0 inet proto icmp all icmp-type timex keep state (if-bound)
pass in on em0 inet proto icmp all icmp-type trace keep state (if-bound)
pass in on em0 inet proto tcp from any to 10.0.1.5 port = http flags S/SA keep state (if-bound)
pass in on em0 inet proto tcp from any to 10.0.1.5 port = https flags S/SA keep state (if-bound)
pass in on em0 inet proto tcp from any to 10.0.1.0/24 port = ssh flags S/SA keep state (if-bound)

гест
проходил мимо

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение гест » 2016-11-14 10:17:42

Клетки взаимодействуют между собой через lo0 ? Блин, а. А вот не знал.

Аватара пользователя
Amadeus
ст. сержант
Сообщения: 332
Зарегистрирован: 2008-10-05 12:42:44
Откуда: Kiev

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение Amadeus » 2016-11-14 11:29:05

undefined писал(а): Клетки взаимодействуют между собой через lo0 ? Блин, а. А вот не знал.

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

Код: Выделить всё

em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=4019b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,VLAN_HWTSO>
        ether 6c:0b:84:99:85:b1
        inet IP netmask 0xffffff00 broadcast XXX
        inet IP2 netmask 0xffffff00 broadcast XXX

Код: Выделить всё

root@freebsd11:/etc # ping IP2
PING IP2 (IP2): 56 data bytes
64 bytes from IP2: icmp_seq=0 ttl=64 time=0.031 ms
64 bytes from IP2 icmp_seq=1 ttl=64 time=0.047 ms

Код: Выделить всё

root@freebsd11:~ # tcpdump -i em0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on em0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
48 packets received by filter
0 packets dropped by kernel
root@freebsd11:~ # tcpdump -i lo0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
07:24:17.108612 IP localhost > IP2: ICMP echo request, id 4634, seq 28, length 64
07:24:17.108663 IP IP2 > localhost: ICMP echo reply, id 4634, seq 28, length 64
07:24:18.159690 IP localhost > IP2: ICMP echo request, id 4634, seq 29, length 64
Нет ничего невозможного

гест
проходил мимо

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение гест » 2016-11-20 14:02:30

А можно ещё одну подсказку получить :)
Между клетками всё настроил, но возникла проблема с гостем в bhyve.
Он висит на tap0, который вместе с em0 загнан в bridge0.
Для tap0 и bridge0 сделан skip.
В общем, трафик между алиасами и виртуалкой не ходит, пока не указать skip на em0.

Код: Выделить всё

listening on tap0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:00:23.349093 IP 10.0.1.8.61095 > 10.0.1.5.http: Flags [S], seq 500890583, win 8192, options [mss 1460,nop,nop,sackOK], length 0
tap0 они покидают, но дальше их нигде не видно. 
Выставил block log all и нашёл вот эти пакеты:
[code]14:00:14.343904 rule 0..16777216/0(match): block out on em0: 10.0.1.5.80 > 10.0.1.8.61095: Flags [S.], seq 1243405236, ack 500890584, win 65535, options [mss 1460,nop,wscale 6,sackOK,eol], length 0
state не нет. Что я мог забыть?

pimlab
прапорщик
Сообщения: 483
Зарегистрирован: 2007-10-09 11:31:03

Та же подсеть для клеток что и на физическом интерфейсе

Непрочитанное сообщение pimlab » 2016-11-23 11:14:18

как-то тоже мучился с работой в бридге... не помню что конкретно там не бегало, но очень помог скрипт

Код: Выделить всё

/usr/share/examples/netgraph/ether.bridge