У меня есть небольшой сервер Ubuntu x64, который предоставляет dhcp, именование, файл и такие услуги для моей домашней сети. Он просто подключен к неуправляемому SOHO коммутатору, лежащему рядом с ним, и просто работает. Но у него есть неиспользуемая сетевая карта 4xGbE i350 в слоте PCIe, и у меня возникла идея использовать эту сетевую карту вместо текущего коммутатора. Возможно, это не будет иметь никаких преимуществ, если это будет обычный неуправляемый коммутатор, как текущее выделенное устройство, но я хотел чему-то научиться (и я мог бы превратить его в управляемый коммутатор позже, возможно, реализовать некоторые IPS/IDS и другие вещи). Как я был удивлен, когда узнал об этом, я понятия не имею. Я, конечно, поискал, но это привело меня в еще большее замешательство. Во-первых, почему во всех руководствах и статьях для достижения коммутации настраиваются мосты? В неуправляемом коммутаторе все порты одинаковы, не имеют IP-адресов, и один из них ведет к шлюзу. Можно ли вообще создать такое на Linux-сервере (игнорируя, что это может быть не очень полезно, учитывая низкую цену маленького коммутатора)?
Используйте драйвер моста.
Мост - это программная реализация коммутатора уровня 2, где каждый интерфейс, добавленный в мост, является портом коммутатора.
Допустим, у вас есть 4 порта i350 в мосте br0
с двумя другими подключенными ПК:
[ Remote PC A - MAC aa:aa:aa:aa:aa ] ---- [ i350 #1 ] ---- .------------.
[ i350 #2 ] ---- | Linux PC |
[ i350 #3 ] ---- | bridge br0 |
[ Remote PC B - MAC bb:bb:bb:bb:bb ] ---- [ i350 #4 ] ---- '------------'
Удаленный ПК A пытается связаться с удаленным ПК B.
ПК A отправит ARP-запрос на широковещательный MAC-адрес назначения (все ff
) с собственным исходным MAC-адресом (все aa
).
Мост получит этот запрос ARP и узнает, что MAC aa
отключен от порта моста i350 # 1
.
Затем мост пересылает эту широковещательную рассылку на все остальные порты i350, потому что это правильное поведение, когда коммутатор получает широковещательный пакет.
Удаленный ПК B принимает ARP и генерирует ответ на ПК A с MAC-адресом назначения ПК A (все aa
) и собственным исходным MAC-адресом (все bb
).
Мост получит этот ответ ARP и узнает, что MAC bb
отключен от порта моста i350 # 4
.
Мост видит, что MAC назначения - aa
, и мост знает, что MAC aa
доступен в нисходящем порту i350 # 1
, и поэтому отправляет кадр. этот сетевой адаптер.
Вы можете добавить IP-адрес к мосту и использовать его как обычный сетевой интерфейс, маршрутизировать с ним, NAT с ним и т. Д., Но это необязательно.
Сказанное выше происходит, даже если ядро настраивается net.ipv4.ip_forward = 0
установлен, поскольку драйвер моста не выполняет IP-переадресацию, IP-маршрутизацию или IP-NAT, он выполняет коммутацию пакетов уровня 2, как любой другой неуправляемый коммутатор уровня 2.
Вы также можете запустить Spanning Tree на мосту, если вы подключаете его к более крупной сети.
Вы сказали, что используете Ubuntu. Следующее должно работать для Ubuntu 20.04 с использованием NetworkManager:
/etc/NetworkManager/system-connections/br0.nmconnection
[connection]
id=br0
type=bridge
interface-name=br0
permissions=
[bridge]
stp=false
[ipv4]
dns-search=
ignore-auto-dns=true
ignore-auto-routes=true
method=disabled
never-default=true
[ipv6]
addr-gen-mode=stable-privacy
dns-search=
ignore-auto-dns=true
ignore-auto-routes=true
method=ignore
never-default=true
[proxy]
Повторите этот файл для каждого i350 с именем netX
, используя правильный MAC-адрес каждого сетевого адаптера:
/etc/NetworkManager/system-connections/netX.nmconnection
[connection]
id=netX
type=ethernet
interface-name=netX
master=br0
metered=2
permissions=
slave-type=bridge
[ethernet]
mac-address=xx:xx:xx:xx:xx:xx
mac-address-blacklist=
[bridge-port]