Допустим, вам необходимо создать несколько виртуальных интерфейсов, которые будут работать как обычные, не зависимые друг от друга. Это очень легко делается через netgraph. Приведу лишь скрипт, который создаст 3 виртуальных интерфейса, не трогая при этом физический:
#!/bin/sh
ngctl mkpeer em0: bridge lower link0
ngctl connect em0: em0:lower upper link1
ngctl name em0:lower em0Bridge
ngctl mkpeer em0:lower eiface link3 ether
ngctl mkpeer em0:lower eiface link4 ether
ngctl mkpeer em0:lower eiface link5 ether
где em0 – наш физический интерфейс. Теперь вывод ifconfig выглядит так:
# ifconfig
em0: flags=8843 metric 0 mtu 1500
options=9b
ether 08:00:27:e3:37:ae
inet 10.10.10.94 netmask 0xffffff00 broadcast 10.10.10.255
nd6 options=29
media: Ethernet autoselect (1000baseT )
status: active
lo0: flags=8049 metric 0 mtu 16384
options=3
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet 127.0.0.1 netmask 0xff000000
nd6 options=21
ngeth0: flags=8843 metric 0 mtu 1500
options=28
ether 00:00:00:00:00:00
nd6 options=29
media: Ethernet autoselect (1000baseT )
status: active
ngeth1: flags=8802 metric 0 mtu 1500
options=28
ether 00:00:00:00:00:00
nd6 options=29
media: Ethernet autoselect (1000baseT )
status: active
ngeth2: flags=8802 metric 0 mtu 1500
options=28
ether 00:00:00:00:00:00
nd6 options=29
media: Ethernet autoselect (1000baseT )
status: active
Но как видим MAC-адреса у нас пустые. Присвоим IP и MAC адреса на ngeth0:
#ifconfig ngeth0 link 00:11:22:33:44:01
#ifconfig ngeth0 inet 192.168.1.254 netmask 255.255.255.0
#ngeth0: flags=8843 metric 0 mtu 1500
options=28
ether 00:11:22:33:44:01
inet 192.168.1.254 netmask 0xffffff00 broadcast 192.168.1.255
nd6 options=29
media: Ethernet autoselect (1000baseT )
status: active