Простой вопрос: как настроить несколько MAC-адресов на одном физическом сетевом интерфейсе (Linux)?
Зачем? Мой интернет-провайдер проверяет ip <-> mac на GW, и я хотел бы маршрутизировать трафик через мой "linuxbox", а затем пересылать его с другим исходным ip.
Не проверяя ip <-> mac, я буду использовать eth0, eth0: 0, но в этой ситуации мне нужен уникальный MAC-адрес для каждого IP.
Вы можете использовать macvlan для создания нескольких виртуальных интерфейсов с разными MAC-адресами.
ip link add link eth0 address 00:11:11:11:11:11 eth0.1 type macvlan
ip link add link eth0 address 00:22:22:22:22:22 eth0.2 type macvlan
Теоретически это должно быть все, что вам нужно, хотя в какой-то момент что-то сломалось в ядре, и оно заставило бы использовать один MAC для всего. Я не уверен, каков статус этого; надеюсь, это исправлено.
Если нет, вы можете использовать arptables для перезаписи MAC-адресов на выходе на основе выходного интерфейса или на входе на основе IP-адреса назначения:
arptables -A OUT -o eth0.1 --arhln 06 -j mangle --mangle-hw-s 00:11:11:11:11:11
arptables -A OUT -o eth0.2 --arhln 06 -j mangle --mangle-hw-s 00:22:22:22:22:22
arptables -A IN -d 192.168.1.1 --arhln 06 -j mangle --mangle-hw-d 00:11:11:11:11:11
arptables -A IN -d 192.168.1.2 --arhln 06 -j mangle --mangle-hw-d 00:22:22:22:22:22
К сожалению, по моему опыту, arptables также довольно глючит.
Причина, по которой ваш мост и интерфейс TAP используют один и тот же MAC-адрес, заключается в том, что у моста нет MAC, пока он не привязан к интерфейсу. Если вы создадите мост с помощью BRCTL и выполните "brctl show", вы обнаружите, что мост имеет пустые порты (интерфейс не привязан к нему). При привязке TAP0 к br0, естественно, он будет отображаться как тот же MAC. Я создал тестовый мост, чтобы проиллюстрировать это.
# brctl addbr testbr0
[root@stooge etc]# brctl show testbr0 bridge name bridge id STP enabled interfaces testbr0 8000.000000000000 no
Я создал три тестовых ОТВОДА. Вывод команды "brctl showmacs testbr0".
[root@stooge etc]# brctl showmacs testbr0 port no mac addr is local? ageing timer 1 86:51:b6:95:0e:b6 yes 0.00 2 86:58:63:c6:d4:e7 yes 0.00 3 8a:a7:fa:17:c5:12 yes 0.00
Как видите, каждый порт моста имеет уникальный MAC-адрес, и мост должен отображать свой MAC-адрес в качестве первого привязанного интерфейса. Если вы подключили физический сетевой интерфейс, мост Ethernet унаследует его MAC-адрес и переместит все виртуальные интерфейсы вниз. Пример связывания eth0 с тестовым мостом.
[root@stooge etc]# brctl showmacs testbr0 port no mac addr is local? ageing timer 4 AA:BB:CC:DD:EE:FF yes 0.00 1 86:51:b6:95:0e:b6 yes 0.00 2 86:58:63:c6:d4:e7 yes 0.00 3 8a:a7:fa:17:c5:12 yes 0.00
Снова используя "brctl show";
[root@stooge etc]# brctl show bridge name bridge id STP enabled interfaces testbr0 8000.00aabbccddee no eth0 tap00 tap01 tap02
интерфейсы TAP переместились на один ниже, хотя eth0 все еще находится на PORT 4. У вас все еще есть уникальные MAC-адреса. Если мост Ethernet привязан к интерфейсу исходного маршрута, у вас нет выбора в использовании IP-адреса или DHCP. Как бы то ни было, если вы соедините интерфейс исходного маршрута, вы покажете «нелокальный» MAC-адрес. Это MAC-адрес маршрутизатора следующего перехода. Я знаю, что в RedHat есть возможность указать IP-адрес источника с помощью IFCONFIG. Мой первый вариант - обратиться к справочнику по IP-командам, поскольку я думаю, вы можете указать исходный IP-адрес. Никогда не пробовал.
Попробуй создать tap
устройства или любые другие виртуальные устройства Ethernet с необходимыми MAC-адресами и IP-адресами, а затем подключите их к одному мосту с помощью eth0.
Похоже, вы сможете использовать vconfig для создания нескольких адресов vlan в одной физической сети Ethernet, каждый с разными MAC-адресами.