Difference between revisions of "VLAN"

From ArchWiki
Jump to: navigation, search
(systemd-networkd single interface: Expanded example for single interface to include IP configuration.)
 
(42 intermediate revisions by 19 users not shown)
Line 1: Line 1:
{{stub}}
+
[[Category:Networking]]
 +
[[ja:VLAN]]
 
[[ru:VLAN]]
 
[[ru:VLAN]]
[[Category:Networking]]
+
[[zh-hans:VLAN]]
 +
{{Related articles start}}
 +
{{Related|Network Configuration}}
 +
{{Related|systemd-networkd}}
 +
{{Related|Netctl}}
 +
{{Related articles end}}
 +
 
 +
Virtual LANs give you the ability to sub-divide a LAN. Linux can accept '''VLAN''' tagged traffic and presents each '''VLAN ID''' as a different network interface (eg: {{ic|eth0.100}} for '''VLAN ID''' {{ic|100}})
 +
 
 +
This article explains how to configure a VLAN using {{Pkg|iproute2}} and [[systemd-networkd]] or [[netctl]].
 +
 
 +
==Configuration==
 +
Previously Arch Linux used the {{ic|vconfig}} command to setup VLANs. This had been superseded by the {{ic|ip}} command. Make sure you have {{Pkg|iproute2}} installed.
 +
 
 +
In the following examples, lets assume the '''interface''' is {{ic|eth0}}, the assigned '''name''' is {{ic|eth0.100}} and the '''vlan id''' is {{ic|100}}.
 +
===Create the VLAN device===
 +
 
 +
Add the VLAN with the following command:
 +
 
 +
# ip link add link eth0 name eth0.100 type vlan id 100
 +
 
 +
Run {{ic|ip link}} to confirm that it has been created.
 +
 
 +
This interface behaves like a normal interface. All traffic routed to it will go through the master interface (in this example, {{ic|eth0}}) but with a VLAN tag. Only VLAN aware devices can accept them if configured correctly else the traffic is dropped.
 +
 
 +
Using a '''name''' like {{ic|eth0.100}} is just convention and not enforced; you can alternatively use {{ic|eth0_100}} or something descriptive like {{ic|IPTV}}. To see the VLAN ID on an interface, in case you used an unconventional name:
 +
 
 +
# ip -d link show eth0.100
  
{{Article summary start}}
+
The {{ic|-d}} flag shows full details on an interface:
{{Article summary text|VLAN}}
 
{{Article summary heading|Related}}
 
{{Article summary wiki|Network}}
 
{{Article summary wiki|Netcfg}}
 
{{Article summary end}}
 
  
==Introduction==
+
# ip -d addr show
Virtual LANs give you the ability to sub-divide a LAN. Linux can accept VLAN tagged traffic and presents each VID as a different network interface (eg: eth0.100 for VID 100)
+
4: eno1.100@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
==Getting Started==
+
    link/ether 96:4a:9c:84:36:51 brd ff:ff:ff:ff:ff:ff promiscuity 0
Previously Arch Linux used '''vconfig''' to setup VLANs. This had been superseded by the ip command. Make sure you have '''iproute2''' installed<br>
+
    '''vlan protocol 802.1Q id 100 <REORDER_HDR>'''  
# pacman -Ss iproute2
+
    inet6 fe80::944a:9cff:fe84:3651/64 scope link
Alternatively you can install [https://aur.archlinux.org/packages.php?ID=20495 vconfig] from [[AUR]]
+
      valid_lft forever preferred_lft forever
  
==Configuring VLANs==
+
===Add an IP===
===Adding a VLAN===
+
Now add an IPv4 address to the just created vlan link, and activate the link:
To add a VLAN use a command with this needlessly long syntax:
+
{{bc|
ip link add link INTERFACE name INTERFACE.VID type vlan id VID
+
# ip addr add 192.168.100.1/24 brd 192.168.100.255 dev eth0.100
Example:
+
# ip link set dev eth0.100 up
ip link add link eth0 name eth0.100 type vlan id 100
+
}}
Run '''ifconfig -a''' to confirm that it has been created (Non deprected alternative is to run '''ip link''').<br>
+
===Turning down the device===
This interface behaves like a normal interface. All traffic routed to it will go through the master interface (in this example, eth0) but with a VLAN tag. Only VLAN aware devices can accept them if configured correctly else the traffic is dropped.<br>
 
Using a name like eth0.100 is just convention and not enforced. You can alternatively use eth0_100 or something descriptive like IPTV
 
===Configuring the VLAN===
 
To add an IPv4 address the the just created vlan link, and activate the link you can do:
 
ip addr add IP/NETMASK brd BROADCAST-ADDR dev INTERFACE.VID
 
ip link set dev INTERFACE.VID up
 
Example:
 
ip addr add 192.168.100.1/24 brd 192.168.100.255 dev eth0.100
 
ip link set dev eth0.100 up
 
===De-Configuring the VLAN===
 
 
To cleanly shutdown the setting before you remove the link, you can do:
 
To cleanly shutdown the setting before you remove the link, you can do:
ip link set dev INTERFACE.VID down
+
{{bc|# ip link set dev eth0.100 down}}
Example:
+
===Removing the device===
ip link set dev eth0.100 down
 
===Removing a VLAN===
 
 
Removing a VLAN interface is significantly less convoluted
 
Removing a VLAN interface is significantly less convoluted
ip link delete INTERFACE.VID
+
{{bc|# ip link delete eth0.100}}
Example:
+
 
ip link delete eth0.100
+
=== Starting at boot ===
 +
 
 +
==== systemd-networkd single interface ====
 +
 
 +
Use the following configuration files (Remember that systemd config files are case sensitive!):
 +
 
 +
{{hc|/etc/systemd/network/''eno1''.network|<nowiki>
 +
[Match]
 +
Name=eno1
 +
 
 +
[Network]
 +
DHCP=ipv4
 +
;these are arbitrary names, but must match the *.netdev and *.network files
 +
VLAN=eno1.100
 +
VLAN=eno1.200
 +
</nowiki>}}
 +
 
 +
{{hc|/etc/systemd/network/''eno1.100''.netdev|<nowiki>
 +
[NetDev]
 +
Name=eno1.100
 +
Kind=vlan
 +
 
 +
[VLAN]
 +
Id=100
 +
</nowiki>}}
 +
 
 +
{{hc|/etc/systemd/network/''eno1.200''.netdev|<nowiki>
 +
[NetDev]
 +
Name=eno1.200
 +
Kind=vlan
 +
 
 +
[VLAN]
 +
Id=200
 +
</nowiki>}}
 +
 
 +
You'll have to have associated .network files for each .netdev to handle addressing and routing. For example, to set the eno1.100 interface with a static IP and the eno1.200 interface with DHCP (but ignoring the supplied default route), use:
 +
 
 +
{{hc|/etc/systemd/network/''eno1.100''.netdev|<nowiki>
 +
[Match]
 +
Name=eno1.100
 +
 
 +
[Network]
 +
DHCP=no
 +
Address=192.168.0.25/24
 +
</nowiki>}}
 +
 
 +
{{hc|/etc/systemd/network/''eno1.200''.netdev|<nowiki>
 +
[Match]
 +
Name=eno1.200
 +
 
 +
[Network]
 +
DHCP=yes
 +
 
 +
[DHCP]
 +
UseRoutes=false
 +
</nowiki>}}
 +
 
 +
Then [[enable]] {{ic|systemd-networkd.service}}. See [[systemd-networkd]] for details.
 +
 
 +
==== systemd-networkd bonded interface ====
 +
 
 +
Similar to above, you're just going to stack more of the concepts in place. You'll want to ensure that you've got a bond set up in your switch and also make sure its a trunk with tagged vlans corresponding to what you create below. Convention would be to create a bond interface with the name {{ic|bond0}}, however there is a known issue where the {{ic|bonding}} module, when loaded, creates a bond device of the name {{ic|bond0}} which systemd then refuses to configure (as systemd tries to respectfully leave alone any device it did not create).
 +
 
 +
{{Tip|To prevent the {{ic|bonding}} module to create an initial {{ic|bond0}} interface, set the {{ic|max_bonds}} option of the bonding module to {{ic|0}} (default value is {{ic|1}}):
 +
{{hc|/etc/modprobe.d/bonding.conf|2=options bonding max_bonds=0}}
 +
See [[Kernel modules#Setting module options]] and [https://www.kernel.org/doc/Documentation/networking/bonding.txt Linux Ethernet Bonding Driver HOWTO (Kernel Documentation)]for details.}}
 +
 
 +
For the purposes of this write up, we are going to use {{ic|''bondname''}} and you can make the choice yourself.
 +
 
 +
First, we create the bond device:
 +
 
 +
{{hc|/etc/systemd/network/''bondname''.netdev|2=
 +
[NetDev]
 +
Name=''bondname''
 +
Kind=bond
 +
 
 +
[Bond]
 +
Mode=802.3ad
 +
LACPTransmitRate=fast
 +
}}
 +
 
 +
Now create a .network directive that references the vlans and interface carriers. In this case we'll use the convention for a dual port fiber module:
 +
 
 +
{{hc|/etc/systemd/network/''bondname''.network|2=
 +
[Match]
 +
Name=''bondname''
 +
 
 +
[Network]
 +
VLAN=vlan10
 +
VLAN=vlan20
 +
VLAN=vlan30
 +
BindCarrier=''enp3s0f0 enp3s0f1''
 +
}}
 +
 
 +
We're using the vlan<number> naming convention here, you can use something else but realize that this is a named reference so you'll have to have a corresponding set of files with the same name.
 +
 
 +
We'll now set up the physical network interfaces:
 +
 
 +
{{hc|/etc/systemd/network/''enp3s0f0''.network|2=
 +
[Match]
 +
Name=''enp3s0f0''
 +
 
 +
[Network]
 +
Bond=''bondname''
 +
}}
 +
 
 +
{{hc|/etc/systemd/network/''enp3s0f1''.network|2=
 +
[Match]
 +
Name=''enp3s0f1''
 +
 
 +
[Network]
 +
Bond=''bondname''
 +
}}
 +
 
 +
At this time you could reboot, and likely should, because the bonded interface is created at boot time. Restarting systemd-networkd will consume changes from these files typically, but device creation seems to occur at startup.
 +
 
 +
We will now set up the VLANs. You should be aware that having multiple VLANs can result in a situation where your machine has multiple default routes, so you'll need to specify a Destination directive in the network directives to ensure that only one VLAN is being used for a default route. In this case we'll use the VLAN with an ID of 10 as our default route.
 +
 
 +
{{hc|/etc/systemd/network/''vlan10''.netdev|2=
 +
[NetDev]
 +
Name=vlan10
 +
Kind=vlan
 +
 
 +
[VLAN]
 +
Id=10
 +
}}
 +
 
 +
Now create the associated network directive to set an address:
 +
 
 +
{{hc|/etc/systemd/network/''vlan10''.network|2=
 +
[Match]
 +
Name=vlan10
 +
 
 +
[Network]
 +
VLAN=vlan10
 +
 
 +
[Address]
 +
Address=10.10.10.2/24
 +
 
 +
[Route]
 +
Destination=0.0.0.0/0
 +
Gateway=10.10.10.1
 +
}}
 +
 
 +
We'll create a similar pair of files for the VLAN with an ID of 20:
 +
 
 +
{{hc|/etc/systemd/network/''vlan20''.netdev|2=
 +
[NetDev]
 +
Name=vlan20
 +
Kind=vlan
 +
 
 +
[VLAN]
 +
Id=20
 +
}}
 +
 
 +
 
 +
{{hc|/etc/systemd/network/''vlan20''.network|2=
 +
[Match]
 +
Name=vlan20
 +
 
 +
[Network]
 +
VLAN=vlan20
 +
 
 +
[Address]
 +
Address=10.10.20.2/24
 +
 
 +
[Route]
 +
Destination=10.10.20.0/24
 +
Gateway=10.10.20.1
 +
}}
 +
 
 +
And again for the VLAN with an ID of 30:
 +
 
 +
{{hc|/etc/systemd/network/''vlan30''.netdev|2=
 +
[NetDev]
 +
Name=vlan30
 +
Kind=vlan
 +
 
 +
[VLAN]
 +
Id=30
 +
}}
 +
 
 +
{{hc|/etc/systemd/network/''vlan30''.network|2=
 +
[Match]
 +
Name=vlan30
 +
 
 +
[Network]
 +
VLAN=vlan30
 +
 
 +
[Address]
 +
Address=10.10.30.2/24
 +
 
 +
[Route]
 +
Destination=10.10.30.0/24
 +
Gateway=10.10.30.1
 +
}}
 +
 
 +
Note that the Destination on {{ic|vlan10}} is set to {{ic|0.0.0.0/0}}, which will match all outbound, becoming the default route.
 +
 
 +
==== netctl ====
 +
 
 +
You can use [[netctl]] for this purpose, see the self-explanatory example profiles in {{ic|/etc/netctl/examples/vlan-{dhcp,static} }}.
 +
 
 +
==Troubleshooting==
 +
===udev renames the virtual devices===
 +
An annoyance is that [[udev]] may try to rename virtual devices as they are added, thus ignoring the '''name''' configured for them (in this case {{ic|eth0.100}}).
  
===UDEV considerations===
 
An annoyance is that '''udev''' may try to rename virtual devices as they are added, thus ignoring the INTERFACE.VID configured for them either via iproute2 or via a netcfg profile<br>
 
 
For instance, if the following commands are issued:  
 
For instance, if the following commands are issued:  
ip link add link eth0 name eth0.100 type vlan id 100
+
{{bc|
ip link show  
+
# ip link add link eth0 name eth0.100 type vlan id 100
This would generate the following output:  
+
# ip link show  
 
+
}}
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN  
+
This could generate the following output:  
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+
{{bc|<nowiki>
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
+
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN  
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
+
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: rename1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state DOWN  
+
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
 +
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
 +
3: rename1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state DOWN  
 
     link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
 
     link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
 +
</nowiki>}}
 +
'''udev''' has ignored the configured virtual interface name {{ic|eth0.100}} and autonamed it '''rename1'''.
  
'''udev''' has ignored the configured virtual interface name of INTERFACE.VID and autonamed it '''rename1'''. Hmmph!
+
The solution is to edit {{ic|/etc/udev/rules.d/network_persistent.rules}} and append '''DRIVERS=="?*"''' to the end of the physical interface's configuration line.
  
The solution is to edit /etc/udev/rules.d/network_persistent.rules and append '''DRIVERS=="?*"''' to the end of the physical interface's configuration line. <br>
 
 
For example, for the interface '''aa:bb:cc:dd:ee:ff''' (eth0):  
 
For example, for the interface '''aa:bb:cc:dd:ee:ff''' (eth0):  
SUBSYSTEM=="net", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="eth0", DRIVERS=="?*"
+
{{hc|/etc/udev/rules.d/network_persistent.rules|<nowiki>
 +
SUBSYSTEM=="net", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="eth0", DRIVERS=="?*"
 +
</nowiki>}}
  
 
A reboot should mean that VLANs configure correctly with the names assigned to them.
 
A reboot should mean that VLANs configure correctly with the names assigned to them.
 
==VLANs at boot==
 
You can use netcfg profile and put POST_UP, PRE_DOWN command to do above action.
 
(Similar thing as done here: [https://bbs.archlinux.org/viewtopic.php?pid=1036395#p1036395])
 
I did it for my eht0, that have is both multi-home (DHCP to the modem, and local subnet 192.168.12.0), and VLAN 112 as well.
 
Here is an extract of a sample /etc/rc.d/my-network file:
 
CONNECTION='ethernet'
 
DESCRIPTION='modem cable connection'
 
INTERFACE='eth0'
 
IP='dhcp'
 
POST_UP='ip addr add 192.168.12.1/24 brd 192.168.12.255 dev eth0; ip link add link eth0 name eth0.112 type vlan id 112; ip addr add 192.168.112.1/24 brd 192.168.112.255 dev eth0.112; ip link set dev eth0.112 up'
 
PRE_DOWN='ip link set dev eth0.112 down; ip link delete eth0.112; ip addr del 192.168.12.1/24 dev eth0'
 
 
Question: Any \ like syntax available at eol to have POST_UP split on multi-line ?<br>
 
Seems it should be possible to put such control directly for netcfg into /etc/rc.conf (instead of inside the POST_UP in the netcfg profile file).
 
Extra info on how to do that still missing ... (not clear)<br>
 
possible issue is to get error in one of commands put inside POST_UP/PRE_DOWN.
 
This can prevent to manual stop/start control of the network link
 
===Manual start/stop===
 
To control by hand the link after boot using the netcfg profile you put in place, you can try following commands:
 
/etc/rc.d/net-profiles restart
 
/etc/rc.d/net-profiles stop
 
/etc/rc.d/net-profiles start
 

Latest revision as of 16:53, 25 July 2017

Virtual LANs give you the ability to sub-divide a LAN. Linux can accept VLAN tagged traffic and presents each VLAN ID as a different network interface (eg: eth0.100 for VLAN ID 100)

This article explains how to configure a VLAN using iproute2 and systemd-networkd or netctl.

Configuration

Previously Arch Linux used the vconfig command to setup VLANs. This had been superseded by the ip command. Make sure you have iproute2 installed.

In the following examples, lets assume the interface is eth0, the assigned name is eth0.100 and the vlan id is 100.

Create the VLAN device

Add the VLAN with the following command:

# ip link add link eth0 name eth0.100 type vlan id 100

Run ip link to confirm that it has been created.

This interface behaves like a normal interface. All traffic routed to it will go through the master interface (in this example, eth0) but with a VLAN tag. Only VLAN aware devices can accept them if configured correctly else the traffic is dropped.

Using a name like eth0.100 is just convention and not enforced; you can alternatively use eth0_100 or something descriptive like IPTV. To see the VLAN ID on an interface, in case you used an unconventional name:

# ip -d link show eth0.100

The -d flag shows full details on an interface:

# ip -d addr show
4: eno1.100@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
   link/ether 96:4a:9c:84:36:51 brd ff:ff:ff:ff:ff:ff promiscuity 0 
   vlan protocol 802.1Q id 100 <REORDER_HDR> 
   inet6 fe80::944a:9cff:fe84:3651/64 scope link 
      valid_lft forever preferred_lft forever

Add an IP

Now add an IPv4 address to the just created vlan link, and activate the link:

# ip addr add 192.168.100.1/24 brd 192.168.100.255 dev eth0.100
# ip link set dev eth0.100 up

Turning down the device

To cleanly shutdown the setting before you remove the link, you can do:

# ip link set dev eth0.100 down

Removing the device

Removing a VLAN interface is significantly less convoluted

# ip link delete eth0.100

Starting at boot

systemd-networkd single interface

Use the following configuration files (Remember that systemd config files are case sensitive!):

/etc/systemd/network/eno1.network
[Match]
Name=eno1

[Network]
DHCP=ipv4
;these are arbitrary names, but must match the *.netdev and *.network files
VLAN=eno1.100
VLAN=eno1.200
/etc/systemd/network/eno1.100.netdev
[NetDev]
Name=eno1.100
Kind=vlan

[VLAN]
Id=100
/etc/systemd/network/eno1.200.netdev
[NetDev]
Name=eno1.200
Kind=vlan

[VLAN]
Id=200

You'll have to have associated .network files for each .netdev to handle addressing and routing. For example, to set the eno1.100 interface with a static IP and the eno1.200 interface with DHCP (but ignoring the supplied default route), use:

/etc/systemd/network/eno1.100.netdev
[Match]
Name=eno1.100

[Network]
DHCP=no
Address=192.168.0.25/24
/etc/systemd/network/eno1.200.netdev
[Match]
Name=eno1.200

[Network]
DHCP=yes

[DHCP]
UseRoutes=false

Then enable systemd-networkd.service. See systemd-networkd for details.

systemd-networkd bonded interface

Similar to above, you're just going to stack more of the concepts in place. You'll want to ensure that you've got a bond set up in your switch and also make sure its a trunk with tagged vlans corresponding to what you create below. Convention would be to create a bond interface with the name bond0, however there is a known issue where the bonding module, when loaded, creates a bond device of the name bond0 which systemd then refuses to configure (as systemd tries to respectfully leave alone any device it did not create).

Tip: To prevent the bonding module to create an initial bond0 interface, set the max_bonds option of the bonding module to 0 (default value is 1):
/etc/modprobe.d/bonding.conf
options bonding max_bonds=0
See Kernel modules#Setting module options and Linux Ethernet Bonding Driver HOWTO (Kernel Documentation)for details.

For the purposes of this write up, we are going to use bondname and you can make the choice yourself.

First, we create the bond device:

/etc/systemd/network/bondname.netdev
[NetDev]
Name=bondname
Kind=bond

[Bond]
Mode=802.3ad
LACPTransmitRate=fast

Now create a .network directive that references the vlans and interface carriers. In this case we'll use the convention for a dual port fiber module:

/etc/systemd/network/bondname.network
[Match]
Name=bondname

[Network]
VLAN=vlan10
VLAN=vlan20
VLAN=vlan30
BindCarrier=enp3s0f0 enp3s0f1

We're using the vlan<number> naming convention here, you can use something else but realize that this is a named reference so you'll have to have a corresponding set of files with the same name.

We'll now set up the physical network interfaces:

/etc/systemd/network/enp3s0f0.network
[Match]
Name=enp3s0f0

[Network]
Bond=bondname
/etc/systemd/network/enp3s0f1.network
[Match]
Name=enp3s0f1

[Network]
Bond=bondname

At this time you could reboot, and likely should, because the bonded interface is created at boot time. Restarting systemd-networkd will consume changes from these files typically, but device creation seems to occur at startup.

We will now set up the VLANs. You should be aware that having multiple VLANs can result in a situation where your machine has multiple default routes, so you'll need to specify a Destination directive in the network directives to ensure that only one VLAN is being used for a default route. In this case we'll use the VLAN with an ID of 10 as our default route.

/etc/systemd/network/vlan10.netdev
[NetDev]
Name=vlan10
Kind=vlan

[VLAN]
Id=10

Now create the associated network directive to set an address:

/etc/systemd/network/vlan10.network
[Match]
Name=vlan10

[Network]
VLAN=vlan10

[Address]
Address=10.10.10.2/24

[Route]
Destination=0.0.0.0/0
Gateway=10.10.10.1

We'll create a similar pair of files for the VLAN with an ID of 20:

/etc/systemd/network/vlan20.netdev
[NetDev]
Name=vlan20
Kind=vlan

[VLAN]
Id=20


/etc/systemd/network/vlan20.network
[Match]
Name=vlan20

[Network]
VLAN=vlan20

[Address]
Address=10.10.20.2/24

[Route]
Destination=10.10.20.0/24
Gateway=10.10.20.1

And again for the VLAN with an ID of 30:

/etc/systemd/network/vlan30.netdev
[NetDev]
Name=vlan30
Kind=vlan

[VLAN]
Id=30
/etc/systemd/network/vlan30.network
[Match]
Name=vlan30

[Network]
VLAN=vlan30

[Address]
Address=10.10.30.2/24

[Route]
Destination=10.10.30.0/24
Gateway=10.10.30.1

Note that the Destination on vlan10 is set to 0.0.0.0/0, which will match all outbound, becoming the default route.

netctl

You can use netctl for this purpose, see the self-explanatory example profiles in /etc/netctl/examples/vlan-{dhcp,static} .

Troubleshooting

udev renames the virtual devices

An annoyance is that udev may try to rename virtual devices as they are added, thus ignoring the name configured for them (in this case eth0.100).

For instance, if the following commands are issued:

# ip link add link eth0 name eth0.100 type vlan id 100
# ip link show 

This could generate the following output:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
3: rename1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff

udev has ignored the configured virtual interface name eth0.100 and autonamed it rename1.

The solution is to edit /etc/udev/rules.d/network_persistent.rules and append DRIVERS=="?*" to the end of the physical interface's configuration line.

For example, for the interface aa:bb:cc:dd:ee:ff (eth0):

/etc/udev/rules.d/network_persistent.rules
SUBSYSTEM=="net", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="eth0", DRIVERS=="?*"

A reboot should mean that VLANs configure correctly with the names assigned to them.