• Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Search
  • Register
  • Login
Netgate Discussion Forum
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Search
  • Register
  • Login

OpenVPN Layer 2 with VLANs - How to Set Up?

Scheduled Pinned Locked Moved OpenVPN
7 Posts 3 Posters 752 Views 3 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    decibel83
    last edited by Mar 1, 2025, 3:07 PM

    Hi everyone,

    I have a CARP cluster of pfSense firewalls at my headquarters, with multiple VLANs routed through pfSense.

    I am adding some cloud servers that I want to connect to the headquarters via an OpenVPN Layer 2 tunnel. My goal is to pass multiple VLANs through a single VPN tunnel.

    The cloud servers will be running Proxmox as the virtualization platform, and the virtual machines will use dedicated VLANs on virtual interfaces within Proxmox.

    Essentially, I want to have VLANs dedicated to cloud servers, which are routed through pfSense via a single VPN interface. This way, the cloud servers would have only one interface and use pfSense as their default gateway for each VLAN.

    However, I noticed that pfSense does not allow VLANs to be created on OpenVPN interfaces. So, I’m wondering how I can achieve this setup.

    Do you have any recommendations on how to build this infrastructure?

    Thanks!

    J 1 Reply Last reply Mar 2, 2025, 8:02 PM Reply Quote 0
    • J Offline
      JKnott @decibel83
      last edited by Mar 2, 2025, 8:02 PM

      @decibel83

      You route the individual subnets to the other end, where there will be corresponding VLANs to use. The VLAN IDs don't have to match.

      PfSense running on Qotom mini PC
      i5 CPU, 4 GB memory, 32 GB SSD & 4 Intel Gb Ethernet ports.
      UniFi AC-Lite access point

      I haven't lost my mind. It's around here...somewhere...

      D 1 Reply Last reply Mar 4, 2025, 6:10 PM Reply Quote 0
      • D Offline
        decibel83 @JKnott
        last edited by Mar 4, 2025, 6:10 PM

        @JKnott thank you for your answer.

        I don't want to route, because I don't have a router on the client end.

        On the client end I have a Proxmox instance with a bridge on the tap0.150 interface and another on the tap0.151 interface.
        This way I expect that packets go through the OpenVPN TAP tunnel tagged with the VLANs 150 and 151, and arrive tagged on pfSense which have other two bridges on the OpenVPN interface.

        Anyway, I see that tagged packages do not enter the tunnel (I debugged with tcpdump).

        I enabled the VLAN feature on the OpenVPN server with the vlan-tagging custom option.

        Do you have any idea?

        Thank you!

        J 1 Reply Last reply Mar 4, 2025, 6:47 PM Reply Quote 0
        • J Offline
          JKnott @decibel83
          last edited by Mar 4, 2025, 6:47 PM

          @decibel83 said in OpenVPN Layer 2 with VLANs - How to Set Up?:

          I enabled the VLAN feature on the OpenVPN server with the vlan-tagging custom option.

          That requires using TAP rather than TUN VPN. With TAP, you essentially bridge the 2 networks together. This means both sites will have to be on the same subnet.

          Here's what the manual says:

          --vlan-tagging

          Server-only option. Turns the OpenVPN server instance into a switch that understands VLAN-tagging, based on IEEE 802.1Q.

          The server TAP device and each of the connecting clients is seen as a port of the switch. All client ports are in untagged mode and the server TAP device is VLAN-tagged, untagged or accepts both, depending on the --vlan-accept setting.

          Ethernet frames with a prepended 802.1Q tag are called "tagged". If the VLAN Identifier (VID) field in such a tag is non-zero, the frame is called "VLAN-tagged". If the VID is zero, but the Priority Control Point (PCP) field is non-zero, the frame is called "prio-tagged". If there is no 802.1Q tag, the frame is "untagged".

          Using the --vlan-pvid v option once per client (see --client-config-dir), each port can be associated with a certain VID. Packets can only be forwarded between ports having the same VID. Therefore, clients with differing VIDs are completely separated from one-another, even if --client-to-client is activated.

          The packet filtering takes place in the OpenVPN server. Clients should not have any VLAN tagging configuration applied.

          The --vlan-tagging option is off by default. While turned off, OpenVPN accepts any Ethernet frame and does not perform any special processing for VLAN-tagged packets.

          This option can only be activated in --dev tap mode.

          PfSense running on Qotom mini PC
          i5 CPU, 4 GB memory, 32 GB SSD & 4 Intel Gb Ethernet ports.
          UniFi AC-Lite access point

          I haven't lost my mind. It's around here...somewhere...

          1 Reply Last reply Reply Quote 0
          • D Offline
            decibel83
            last edited by Mar 4, 2025, 7:32 PM

            Yes, I am using the tap mode.

            This is my server configuration file on pfSense:

            dev ovpns8
            verb 1
            dev-type tap
            dev-node /dev/tap8
            writepid /var/run/openvpn_server8.pid
            #user nobody
            #group nobody
            script-security 3
            daemon
            keepalive 10 60
            ping-timer-rem
            persist-tun
            persist-key
            proto udp4
            auth SHA256
            up /usr/local/sbin/ovpn-linkup
            down /usr/local/sbin/ovpn-linkdown
            client-connect /usr/local/sbin/openvpn.attributes.sh
            client-disconnect /usr/local/sbin/openvpn.attributes.sh
            local <my-ip-address>
            tls-server
            server 192.168.144.0 255.255.255.0
            client-config-dir /var/etc/openvpn/server8/csc
            tls-verify "/usr/local/sbin/ovpn_auth_verify tls 'vpn-cloud-server' 1"
            lport 30677
            management /var/etc/openvpn/server8/sock unix
            remote-cert-tls client
            capath /var/etc/openvpn/server8/ca
            cert /var/etc/openvpn/server8/cert
            key /var/etc/openvpn/server8/key
            dh /etc/dh-parameters.2048
            tls-auth /var/etc/openvpn/server8/tls-auth 0
            data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305:AES-256-CBC
            data-ciphers-fallback AES-256-CBC
            allow-compression no
            explicit-exit-notify 1
            inactive 300
            vlan-tagging
            

            This is my client configuration file:

            dev tap
            persist-tun
            persist-key
            ncp-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC
            cipher AES-256-CBC
            auth SHA256
            tls-client
            client
            resolv-retry infinite
            remote <my-ip-address> <my-port> udp
            nobind
            verify-x509-name "<server-cert-name>" name
            remote-cert-tls server
            explicit-exit-notify
            
            <ca>
            -----BEGIN CERTIFICATE-----
            <certificate>
            -----END CERTIFICATE-----
            </ca>
            <cert>
            -----BEGIN CERTIFICATE-----
            <certificate>
            -----END CERTIFICATE-----
            </cert>
            <key>
            -----BEGIN PRIVATE KEY-----
            <private_key>
            -----END PRIVATE KEY-----
            </key>
            key-direction 1
            <tls-auth>
            #
            # 2048 bit OpenVPN static key
            #
            -----BEGIN OpenVPN Static key V1-----
            <key>
            -----END OpenVPN Static key V1-----
            </tls-auth>
            

            Thank you!

            C 1 Reply Last reply Mar 5, 2025, 12:01 AM Reply Quote 0
            • C Offline
              crazily9892 @decibel83
              last edited by Mar 5, 2025, 12:01 AM

              @decibel83
              My pfSense lets me put a VLAN tag on my L2 VPN
              Screenshot_20250304_174519.png
              Screenshot_20250304_174314.png

              D 1 Reply Last reply Mar 5, 2025, 9:04 AM Reply Quote 0
              • D Offline
                decibel83 @crazily9892
                last edited by decibel83 Mar 5, 2025, 9:05 AM Mar 5, 2025, 9:04 AM

                @crazily9892 said in OpenVPN Layer 2 with VLANs - How to Set Up?:

                My pfSense lets me put a VLAN tag on my L2 VPN

                Thank you.

                I tried to set the VLANs on the OpenVPN tap interface:

                Screenshot 2025-03-05 at 09.59.44.png

                And then I added a bridge from the newly created VLAN to the existing interface which is tagged on the switch:

                Screenshot 2025-03-05 at 09.59.48.png

                Screenshot 2025-03-05 at 10.00.33.png

                The CLOUD_LAN interface has a CARP Virtual IP Address:

                Screenshot 2025-03-05 at 10.05.14.png

                On the other end, I have a vmbr interface:

                24: tap0.150@tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master vmbr150 state UP group default qlen 1000
                    link/ether e6:43:98:64:45:36 brd ff:ff:ff:ff:ff:ff
                25: vmbr150: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
                    link/ether e6:43:98:64:45:36 brd ff:ff:ff:ff:ff:ff
                    inet 192.168.150.1/24 scope global vmbr150
                       valid_lft forever preferred_lft forever
                    inet6 fe80::e443:98ff:fe64:4536/64 scope link
                       valid_lft forever preferred_lft forever
                

                Which is bridged to the tap0 OpenVPN interface:

                root@node1:~# brctl show
                bridge name	bridge id		STP enabled	interfaces
                vmbr0		8000.107c614c4e64	no		enp5s0
                vmbr150		8000.e64398644536	no		tap0.150
                

                Anyway, if I try to ping the pfSense CLOUD_LAN IP address from the OpenVPN client, it does not work:

                root@node1:~# ping 192.168.150.254
                PING 192.168.150.254 (192.168.150.254) 56(84) bytes of data.
                From 192.168.150.1 icmp_seq=1 Destination Host Unreachable
                From 192.168.150.1 icmp_seq=2 Destination Host Unreachable
                From 192.168.150.1 icmp_seq=3 Destination Host Unreachable
                

                And tcpdump only see the ARP request:

                root@node1:~# tcpdump -i tap0.150
                tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
                listening on tap0.150, link-type EN10MB (Ethernet), snapshot length 262144 bytes
                10:03:23.636095 ARP, Request who-has 192.168.150.254 tell 192.168.150.1, length 28
                10:03:24.659991 ARP, Request who-has 192.168.150.254 tell 192.168.150.1, length 28
                10:03:25.683845 ARP, Request who-has 192.168.150.254 tell 192.168.150.1, length 28
                10:03:26.708073 ARP, Request who-has 192.168.150.254 tell 192.168.150.1, length 28
                

                This let me think that the problem is on the client, because packages are not exiting from it.

                Do you have any idea?
                Thank you!

                1 Reply Last reply Reply Quote 0
                1 out of 7
                • First post
                  1/7
                  Last post
                Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.
                  This community forum collects and processes your personal information.
                  consent.not_received