Hi, we're currently attempting to use OpenVPN in an environment where potentially several hundred users connect to a cluster of OpenVPN instances and gain access to several different internal networks.
The different networks are internally managed using VLANs (based on IEEE 802.1Q). (The packets are transported in tagged form on the internal backbones and inserted into the actual department networks in untagged form.) Instead of using one OpenVPN server instance per VLAN (e.g. on a different port or a different load-balanced IP) we would like every instance to provide access to all networks by directly plugging into the "backbone", i.e. by directly handling tagged packets. The following patch-set is a first draft to implement VLAN tagging on an OpenVPN server running in server mode and using a TAP device. Each client gets assigned a VLAN identifier (VID) (e.g. through a client-connect script or through ccd files), indicating the network the client may communicate with. Packets coming in from the TAP device are assumed to be tagged with IEEE 802.1Q headers. OpenVPN removes the tag, remembers the VID and routes the packet to the destination client(s) on the other side of the secure tunnel which have a matching VID. Packets that OpenVPN pushes onto the device are tagged according to which VID the sending client belonged to. For high-level illustration, consider the following example network: |---+---------------------| Untagged internal network A | | |---+------| Untagged internal network B | | | | T(*) T(**) |====+=====+========+======| Backbone with tagged networks A and B | | (*) Switch tags/untags with VID 11 | (**) Switch tags/untags with VID 22 tap (***) (***) receives tagged packets from A and B [ OpenVPN server ] | | | | | +---------[ OpenVPN client 1 (server-side: --vlan-tag 11) ] | | tap | | | | | |-----+---------| Untagged network A | | | +-----------[ OpenVPN client 2 (server-side: --vlan-tag 11) ] | tap | | | |-----+---------| Untagged network A | +-------------[ OpenVPN client 3 (server-side: --vlan-tag 22) ] tap | |-----+---------| Untagged network B The internal network A is only available to clients 1 and 2, network B is only available to client 3. A and B are seperate broadcast domains and broadcasts on network A only propagate to client 1's and client 2's networks. The server's tap interface sits on the backbone and inputs/outputs only tagged packets. The clients receive and send untagged packets and require no explicit VLAN support. The patch-set is now based on Davide Guerri's --passtos patch, as it directly falls with-in the functionality of my original version and looked like a candidate for integration. The patches are also available directly via git, see our gitweb at http://opensource.fsmi.uni-karlsruhe.de/cgi-bin/gitweb.cgi?p=openvpn.git;a=shortlog;h=refs/heads/feat_vlan_on_feat_passtos The last two patches (add debug logging ...) aren't really intended for inclusion. I haven't looked into proper log levels, so currently the debug messages flood at notice priority. I'm not sure whether the messages should be included at all. Another question would be whether I should turn the feature into a compile-time selectable option. The patch-set has only received light testing up to now, as it was originally only intended as a proof of concept. At this point I'm very interested in all kinds of feed-back and would like to determine whether you might be interested in integrating something like this in an official OpenVPN release at some point. Cheers Fabian Fabian Knittel (9): is_ipv4(): add packet length check for 802.1Q packets vlan: Add global --vlan-tagging option vlan: Add per-client --vlan-tag option vlan: Prepend and remove VLAN identifiers on outgoing and incoming frames vlan: Add VLAN identifier to mroute_addr for ethernet addresses vlan: Restrict broadcasts to the sender's VLAN. vlan: Slightly enhance PF's protocol inspection of 802.1Q packets vlan: add debug logging to tagging / untagging vlan: add debug logging to broadcast filter mroute.c | 20 ++++++++-- mroute.h | 8 +++-- multi.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- multi.h | 5 +++ options.c | 34 +++++++++++++++++ options.h | 3 ++ proto.c | 3 ++ proto.h | 36 ++++++++++++++++-- 8 files changed, 210 insertions(+), 20 deletions(-)