Jump to content
Калькуляторы

linux bridge port isolation linux bridge port isolation

Собственно интересует вопрос есть ли в линуксе возможность изоляции портов в бридже?

Скажем есть бридж с портами:eth0, eth1, eth2, eth3

и нужно чтобы eth1, eth2, eth3 могли передавать и принимать данные с eth0 но не передавали данные между собой.

некий аналог port isolation в свитчах dlink dgs 3200 или mikrotik rb260.

 

Понимаю что можно сделать через ebtables но это на мой взгляд слишком накладно с точки зрения производительности.

Смотрел еще iproute2-> bridge но там только по вланам. А нужно именно port isolation по интерфейсам.

Share this post


Link to post
Share on other sites

Понимаю что можно сделать через ebtables но это на мой взгляд слишком накладно с точки зрения производительности.

откуда такой вывод? дропаете с и в логические порты трафик одним правилом и всё.

Share this post


Link to post
Share on other sites
Собственно интересует вопрос есть ли в линуксе возможность изоляции портов в бридже?
нету. в линагзе бридж убогий генератор петель и не более. нельзя как во фряше сказать ifconfig $bridge private $interface нескольким интерфейсам и выключить свитчинг между ними. там вообще много чего нельзя сделать.

так что пишите правила в ebtables

Share this post


Link to post
Share on other sites
Собственно интересует вопрос есть ли в линуксе возможность изоляции портов в бридже?
нету. в линагзе бридж убогий генератор петель и не более. нельзя как во фряше сказать ifconfig $bridge private $interface нескольким интерфейсам и выключить свитчинг между ними. там вообще много чего нельзя сделать.

так что пишите правила в ebtables

 

Да вы правы. Вот как раз как во фре это сделать я и нашел )

 

Понимаю что можно сделать через ebtables но это на мой взгляд слишком накладно с точки зрения производительности.

откуда такой вывод? дропаете с и в логические порты трафик одним правилом и всё.

 

Правил уже будет как минимум два. На вход и на выход.

И третье на дроп.

Edited by adron2

Share this post


Link to post
Share on other sites

зяглянул в исходник ebtables. Стало жутко от неоптимальности кода.

Конечно круто делать для каждого пакета сравнение по имени интерфейса(аля strcmp). Но помоему это перебор. Неужели блин никто за столько лет не запилил патч для ядра чтобы сделать банальную изоляцию портов у бриджа?

Share this post


Link to post
Share on other sites

Щас активно пилят бридж в линуксе, может оно скоро появится. Ещё посмотрите в сторону ovs, может там есть

Share this post


Link to post
Share on other sites

Щас активно пилят бридж в линуксе, может оно скоро появится. Ещё посмотрите в сторону ovs, может там есть

 

Это радует что пилят )

Исходники ebtables древние как дерьмо мамонта. В сновном все за 2002 год )

...

ovs смотрел. Но воопервых оно как бы для виртуализации больше а во вторых я не нашел там изоляции.

Только возможность фильтрации по вланам(что iproute2 и так умеет). Может плохо смотрел? Но...не нашел.

Edited by adron2

Share this post


Link to post
Share on other sites

я уже предлагал и автор говорит что нет там порт-изоляции

Share this post


Link to post
Share on other sites

Правил уже будет как минимум два. На вход и на выход.

Попробуйте переименовать интерфейсы, например так: eth1->ieth1, eth2->ieth2, eth3->ieth3 и отфильтровать, например так

ebtables -A FORWARD -i ieth+ -o ieth+ -j DROP

 

Красивее было бы через devgroup, но не уверен, что ebtables это умеет.

Share this post


Link to post
Share on other sites

Извиняюсь за некропостинг, но возник похожий на ТС вопрос, только вот даже с помощью ebtables я не могу изолировать трафик. Есть роутер wr740n, на нем стоит OpenWrt, есть 2 интерфейса - eth1 - wan порт и eth0 - свич из четырех портов. Задача в принципе такая же как у ТС, необходимо изолировать порты свича между собой, при этом трафик от wan порта к каждому порту свича ходить должен. Пытался решить задачу с помощью swconfig, но ничего не получилось... Может кто то осуществлял подобное на OpenWrt?

Edited by Lipton

Share this post


Link to post
Share on other sites

Извиняюсь за некропостинг, но возник похожий на ТС вопрос, только вот даже с помощью ebtables я не могу изолировать трафик. Есть роутер wr740n, на нем стоит OpenWrt, есть 2 интерфейса - eth1 - wan порт и eth0 - свич из четырех портов. Задача в принципе такая же как у ТС, необходимо изолировать порты свича между собой, при этом трафик от wan порта к каждому порту свича ходить должен. Пытался решить задачу с помощью swconfig, но ничего не получилось... Может кто то осуществлял подобное на OpenWrt?

 

я задачу решил ebtables-ом. он отлично все изолирует.

Share this post


Link to post
Share on other sites

я задачу решил ebtables-ом. он отлично все изолирует.

Можешь подробнее? Для каждого интерфейса правила или только для аплинка?

Share this post


Link to post
Share on other sites

я задачу решил ebtables-ом. он отлично все изолирует.

Можешь подробнее? Для каждого интерфейса правила или только для аплинка?

 

для начала вам нужно каждый порт свитча вынести в отдельный влан и из вланов и wan-а(eth1)собрать бридж:

 

config interface 'sw'
   	option ifname 'eth1 eth0.2 eth0.3 eth0.4 eth0.5'
   	option type 'bridge'
   	option proto 'static'
   	option ipaddr '10.255.255.1'
   	option netmask '255.255.255.0'

config switch
   	option name 'switch0'
   	option reset '1'
   	option enable_vlan '1'

config switch_vlan
   	option device 'switch0'
   	option vlan '2'
   	option ports '0t 2'

config switch_vlan
   	option device 'switch0'
   	option vlan '3'
   	option ports '0t 3'

config switch_vlan
   	option device 'switch0'
   	option vlan '4'
   	option ports '0t 4'

config switch_vlan
   	option device 'switch0'
   	option vlan '5'
   	option ports '0t 5'


 

затем изолируем трафик(разрешаем трафик только с или на wan внутри бриджа):

 

ebtables -N SW
ebtables -P SW DROP
ebtables -A FORWARD --logical-in sw --logical-out sw -j SW
ebtables -A SW -o eth1 -j ACCEPT
ebtables -A SW -i eth1 -j ACCEPT

Share this post


Link to post
Share on other sites

adron2

почти все заработало, но клиенты почему то не получают адреса по dhcp, один или 2 раза получили адреса и все работало как надо, но это происходит очень редко. Может быть для броадкаста надо отдельные правила в ebtables? Чтобы они ходили из lan портов в wan и обратно?

Share this post


Link to post
Share on other sites

Нет. Эти правила пропускают любой трафик с eth0.x интерфейсов в eth1 и обратно.

У провайдера нет ограничения кол-ва маков на порт?

Share this post


Link to post
Share on other sites

Нет. Эти правила пропускают любой трафик с eth0.x интерфейсов в eth1 и обратно.

У провайдера нет ограничения кол-ва маков на порт?

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

Share this post


Link to post
Share on other sites

Нет. Эти правила пропускают любой трафик с eth0.x интерфейсов в eth1 и обратно.

У провайдера нет ограничения кол-ва маков на порт?

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

 

такого не может быть. бридж полностью прозрачен.

Share this post


Link to post
Share on other sites

adron2

Огромный респект! В полях все заработало как надо. При 100 мегабитной прокачке загрузка цпу не более 15%, что говорит о незначительных требованиях бриджевания и ebtables. Вопрос еще возник небольшой относительно свича, можно на нем как то просматривать мак адреса на конкретных портах?

Share this post


Link to post
Share on other sites

adron2

Огромный респект! В полях все заработало как надо. При 100 мегабитной прокачке загрузка цпу не более 15%, что говорит о незначительных требованиях бриджевания и ebtables. Вопрос еще возник небольшой относительно свича, можно на нем как то просматривать мак адреса на конкретных портах?

 

Смотря какой свитч. Если что то на атхеросе то нет. Там очень убогий драйвер.

Вы можете маки просматривать в самом бридже:

brctl showmacs sw где sw это имя интерфейса бриджа.

но это при условии что у вас стоит полная версия brctl-я а не кастрированная bysybox-овская.

Share this post


Link to post
Share on other sites

Смотря какой свитч. Если что то на атхеросе то нет.

как раз он самый: AR7240/AR9330 :(

Вы можете маки просматривать в самом бридже:

brctl showmacs sw где sw это имя интерфейса бриджа.

но это при условии что у вас стоит полная версия brctl-я а не кастрированная bysybox-овская.

как раз урезанная, и в пакетах bridge-utils я не нашел. Можно конечно попробовать скомпилить под qemu из исходников или прямо на роутере, но вопрос, что мне это даст? Если brctl showmac br0 мне покажет только все маки в бридже - то это бессмысленно, я их и так увижу на вышестоящем свиче... Жаль конечно, если это нереализуемо, но что мы хотим от прибора за 1к руб...

Edited by Lipton

Share this post


Link to post
Share on other sites

Смотря какой свитч. Если что то на атхеросе то нет.

как раз он самый: AR7240/AR9330 :(

Вы можете маки просматривать в самом бридже:

brctl showmacs sw где sw это имя интерфейса бриджа.

как раз урезанная, и в пакетах bridge-utils я не нашел. Можно конечно попробовать скомпилить под qemu из исходников или прямо на роутере, но вопрос, что мне это даст? Если brctl showmac br0 мне покажет только все маки в бридже - то это бессмысленно, я их и так увижу на вышестоящем свиче... Жаль конечно, если это нереализуемо, но что мы хотим от прибора за 1к руб...

 

Он покажет что то типа такого:

brctl showmacs br-vlan190

port no	mac addr		is local?	ageing timer
 1	00:25:90:36:1b:5f	no	       0.06
 6	4c:5e:0c:01:5a:16	no	  	16.72
 6	4c:5e:0c:01:5a:18	no	  	16.71
 5	4c:5e:0c:20:af:6f	no	       0.27
 6	4c:5e:0c:3e:ae:e8	no	  	70.18
 1	ba:b5:2f:51:70:e4	yes	       0.00
 2	ba:b5:2f:51:79:1a	yes	       0.00
 3	ba:b5:2f:51:79:1b	yes	       0.00
 4	ba:b5:2f:51:79:1c	yes	       0.00
 5	ba:b5:2f:51:79:1d	yes	       0.00
 6	ba:b5:2f:51:79:1e	yes	       0.00
 6	ba:ca:6d:1e:79:1e	no	       0.24
 3	d4:ca:6d:1d:e5:00	no	       0.26

 

а номера портов можно посмотреть вот так:

brctl showstp br-vlan190

br-vlan190
bridge id    	8000.bab52f5170e4
designated root	8000.bab52f5170e4
root port   		0        	path cost   		0
max age      	20.00        	bridge max age      	20.00
hello time   		2.00        	bridge hello time   	2.00
forward delay      	15.00        	bridge forward delay  	15.00
ageing time 		300.00
hello timer   		0.93        	tcn timer   		0.00
topology change timer   	0.00        	gc timer 		179.51
flags   		


vlan190M253 (1)
port id    	8001        	state     		forwarding
designated root	8000.bab52f5170e4	path cost 		100
designated bridge	8000.bab52f5170e4	message age timer   	0.00
designated port	8001        	forward delay timer   	0.00
designated cost   	0        	hold timer   		0.00
flags   		

vlan190S002 (2)
port id    	8002        	state     		forwarding
designated root	8000.bab52f5170e4	path cost 		100
designated bridge	8000.bab52f5170e4	message age timer   	0.00
designated port	8002        	forward delay timer   	0.00
designated cost   	0        	hold timer   		0.00
flags   		

vlan190S003 (3)
port id    	8003        	state     		forwarding
designated root	8000.bab52f5170e4	path cost 		100
designated bridge	8000.bab52f5170e4	message age timer   	0.00
designated port	8003        	forward delay timer   	0.00
designated cost   	0        	hold timer   		0.00
flags   		

vlan190S004 (4)
port id    	8004        	state     		forwarding
designated root	8000.bab52f5170e4	path cost 		100
designated bridge	8000.bab52f5170e4	message age timer   	0.00
designated port	8004        	forward delay timer   	0.00
designated cost   	0        	hold timer   		0.00
flags   		

vlan190S005 (5)
port id    	8005        	state     		forwarding
designated root	8000.bab52f5170e4	path cost 		100
designated bridge	8000.bab52f5170e4	message age timer   	0.00
designated port	8005        	forward delay timer   	0.00
designated cost   	0        	hold timer   		0.00
flags   		

vlan190S006 (6)
port id    	8006        	state     		forwarding
designated root	8000.bab52f5170e4	path cost 		100
designated bridge	8000.bab52f5170e4	message age timer   	0.00
designated port	8006        	forward delay timer   	0.00
designated cost   	0        	hold timer   		0.00
flags

Share this post


Link to post
Share on other sites

Я тоже для своих нужд как раз bridge-utils под openwrt собирал и именно чтобы смотреть какой мак в каком порту :-)

Самого пакета под рукой сейчас нет(сервер разработки далеко и выключен) а вот с работающей железки brctl стянуть удалось. Можете себе скопировать и попробовать: brctl

 

Кстати для сборки пакетов под openwrt qemu не нужен. там своя среда сборки под обычный процессор.

Share this post


Link to post
Share on other sites

Самого пакета под рукой сейчас нет(сервер разработки далеко и выключен) а вот с работающей железки brctl стянуть удалось. Можете себе скопировать и попробовать: brctl

к сожалению бинарника мало:

mv /usr/sbin/brctl /usr/sbin/brctl.bk
cp /tmp/brctl /usr/sbin/brctl
chmod +x /usr/sbin/brctl
brctl show
-ash: brctl: not found

видимо пакет еще что то прописывает...

Кстати для сборки пакетов под openwrt qemu не нужен. там своя среда сборки под обычный процессор.

ну, я вроде про тулчейн в курсе, но хотел то не пакет собрать а бинарник и его сунуть прямо в роутер, но видимо не тут то было... Сейчас буду пробовать пакет собирать.

Share this post


Link to post
Share on other sites

Самого пакета под рукой сейчас нет(сервер разработки далеко и выключен) а вот с работающей железки brctl стянуть удалось. Можете себе скопировать и попробовать: brctl

к сожалению бинарника мало:

mv /usr/sbin/brctl /usr/sbin/brctl.bk
cp /tmp/brctl /usr/sbin/brctl
chmod +x /usr/sbin/brctl
brctl show
-ash: brctl: not found

видимо пакет еще что то прописывает...

Кстати для сборки пакетов под openwrt qemu не нужен. там своя среда сборки под обычный процессор.

ну, я вроде про тулчейн в курсе, но хотел то не пакет собрать а бинарник и его сунуть прямо в роутер, но видимо не тут то было... Сейчас буду пробовать пакет собирать.

 

покажите ldd /usr/sbin/brctl

у меня вот так:

ldd /usr/sbin/brctl 
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x77103000)
libc.so.0 => /lib/libc.so.0 (0x77096000)
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x77126000)

 

Странно. Попробовал этот бинарник в TPLINK какой то там абонентский запихать со стандартной openwrt прошивкой. работает на ура..

root@plax:/tmp# wget http://adron-nout.yapic.net/openwrt/brctl/brctl
Connecting to adron-nout.yapic.net (195.189.99.194:80)
brctl            	100% |*****************************************************************************| 20325   0:00:00 ETA
root@plax:/tmp# chmod +x ./brctl 
root@plax:/tmp# ./brctl 
Usage: brctl [commands]
commands:
addbr 		<bridge>		add bridge
delbr 		<bridge>		delete bridge
addif 		<bridge> <device>	add interface to bridge
delif 		<bridge> <device>	delete interface from bridge
hairpin   	<bridge> <port> {on|off}	turn hairpin on/off
setageing 	<bridge> <time>		set ageing time
setbridgeprio	<bridge> <prio>		set bridge priority
setfd 		<bridge> <time>		set bridge forward delay
sethello  	<bridge> <time>		set hello time
setmaxage 	<bridge> <time>		set max message age
setpathcost	<bridge> <port> <cost>	set path cost
setportprio	<bridge> <port> <prio>	set port priority
show  		[ <bridge> ]		show a list of bridges
showmacs  	<bridge>		show a list of mac addrs
showstp   	<bridge>		show bridge stp info
stp   		<bridge> {on|off}	turn stp on/off

root@plax:/tmp# ./brctl showmacs br-lan
port no	mac addr		is local?	ageing timer
 1	00:0c:42:f8:5c:f9	no		   0.73
 1	00:27:22:dc:db:f2	no		  17.84
 1	dc:9f:db:e4:1c:ce	no		  33.35
 1	f8:1a:67:f2:05:e0	yes		   0.00
root@plax:/tmp# 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this