On 2/5/26 3:58 PM, Dumitru Ceara wrote:
> On 2/5/26 3:16 PM, Ilya Maximets wrote:
>> On 2/5/26 2:58 PM, Dumitru Ceara wrote:
>>> On 2/5/26 2:35 PM, Ilya Maximets wrote:
>>>> On 2/5/26 2:29 PM, Dumitru Ceara wrote:
>>>>> On 2/5/26 11:55 AM, Ilya Maximets wrote:
>>>>>> On 2/5/26 10:29 AM, Dumitru Ceara wrote:
>>>>>>> On 2/5/26 7:35 AM, Ales Musil wrote:
>>>>>>>> On Wed, Feb 4, 2026 at 11:40 PM Ilya Maximets <[email protected]> 
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> On 2/4/26 4:20 PM, Dumitru Ceara wrote:
>>>>>>>>>> On 2/3/26 8:34 AM, Ales Musil via dev wrote:
>>>>>>>>>>> The RFC defines a Virtual Router Redundancy Protocol [0], in order
>>>>>>>>>>> for that protocol to work the workload might "spoof" MAC address
>>>>>>>>>>> within ARP or ND request/response. This wasn't allowed as the port
>>>>>>>>>>> security is specifically designed against spoofing and checks if
>>>>>>>>>>> the port security MAC address is the same for source of ARP/ND
>>>>>>>>>>> and the inner source/target address. To make the port security
>>>>>>>>>>> compliant add an special literal which when specified will allow
>>>>>>>>>>> user to add any/all MAC addresses defined by VRRPv3. The traffic
>>>>>>>>>>> from and to those additional MAC addresses will be allowed as
>>>>>>>>>>> well as permutations of ARP/ND inner MACs combined with the
>>>>>>>>>>> physical MAC as a source.
>>>>>>>>>>>
>>>>>>>>>>> [0] https://datatracker.ietf.org/doc/html/rfc9568
>>>>>>>>>>> Reported-at: https://issues.redhat.com/browse/FDP-2979
>>>>>>>>>>> Signed-off-by: Ales Musil <[email protected]>
>>>>>>>>>>> Acked-by: Jacob Tanenbaum <[email protected]>
>>>>>>>>>>> ---
>>>>>>>>>>> v2: Rebase on top of latest main.
>>>>>>>>>>>     Update the RFC url.
>>>>>>>>>>>     Add Jacob's ack.
>>>>>>>>>>
>>>>>>>>>> Hi Ales,
>>>>>>>>>>
>>>>>>>>>> Thanks for the patch!  It seems correct to me, I just had some minor
>>>>>>>>>> findings below.
>>>>>>>>>>
>>>>>>>>>> I'm fine if you address them while merging the patch if there are no
>>>>>>>>>> further comments.  It would be nice to also hear Ilya's opinion first
>>>>>>>>>> though as he was part of the discussions on the previous versions.
>>>>>>>>>
>>>>>>>>> Thanks, Ales and Dumitru!
>>>>>>>>>
>>>>>>>>> I think, this change looks good in general, I didn't read the code too
>>>>>>>>> closely, but I have just one comment below.
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Thank you Dumitru and Ilya for the review,
>>>>>>>> see my answer below.
>>>>>>>>
>>>>>>>
>>>>>>> Hi Ales, Ilya,
>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>> <snip>
>>>>>>>>>
>>>>>>>>>>> diff --git a/ovn-nb.xml b/ovn-nb.xml
>>>>>>>>>>> index e9ca27413..a0a465be4 100644
>>>>>>>>>>> --- a/ovn-nb.xml
>>>>>>>>>>> +++ b/ovn-nb.xml
>>>>>>>>>>> @@ -2057,6 +2057,15 @@
>>>>>>>>>>>            addresses within an element may be space or comma 
>>>>>>>>>>> separated.
>>>>>>>>>>>          </p>
>>>>>>>>>>>
>>>>>>>>>>> +        <p>
>>>>>>>>>>> +          There is also special prefix "VRRPv3" that allows
>>>>>>>>> specification of
>>>>>>>>>>
>>>>>>>>>> Nit: "This also supports the special prefix ..."
>>>>>>>>>>
>>>>>>>>>>> +          single physical MAC and multiple VRRPv3 MAC addresses. 
>>>>>>>>>>> The
>>>>>>>>> format
>>>>>>>>>>> +          allows the same definition of multiple IP addresses
>>>>>>>>> associated with
>>>>>>>>>>
>>>>>>>>>> Nit: "same" sounds weird here.  Maybe "As for non VRRPv3 entries,
>>>>>>>>>> multiple IP addresses can be associated with the specified MACs"?
>>>>>>>>>
>>>>>>>>> May also need to qualify which MACs, as it is not clear how the 
>>>>>>>>> physical
>>>>>>>>> MAC plays here.  More on that below...
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> +          the MACs specified. "VRRPv3" without single physical MAC
>>>>>>>>> translates
>>>>>>>>>>> +          allowing traffic for the whole "VRRPv3" range of MACs. 
>>>>>>>>>>> See
>>>>>>>>> more in
>>>>>>>>>>> +          the examples.
>>>>>>>>>>> +        </p>
>>>>>>>>>>> +
>>>>>>>>>>>          <p>
>>>>>>>>>>>            This column is provided as a convenience to cloud 
>>>>>>>>>>> management
>>>>>>>>> systems,
>>>>>>>>>>>            but all of the features that it implements can be
>>>>>>>>> implemented as ACLs
>>>>>>>>>>> @@ -2102,6 +2111,30 @@
>>>>>>>>>>>              255.255.255.255, and any address in 224.0.0.0/4.  The
>>>>>>>>> host may not
>>>>>>>>>>>              send or receive any IPv6 (including IPv6 Neighbor
>>>>>>>>> Discovery) traffic.
>>>>>>>>>>>            </dd>
>>>>>>>>>>> +
>>>>>>>>>>> +          <dt><code>"VRRPv3 &lt;PHYSICAL_MAC&gt;"</code></dt>
>>>>>>>>>>> +          <dd>
>>>>>>>>>>> +            The host may send traffic from and receive traffic to 
>>>>>>>>>>> the
>>>>>>>>>>> +            specified physical MAC addresses, and to all VRRPv3 MAC
>>>>>>>>> addresses.
>>>>>>>>>>
>>>>>>>>>> I'd specify the VRRPv3 MAC formats here explicitly, i.e.,
>>>>>>>>>> 00-00-5E-00-01-XX and 00-00-5E-00-02-XX.
>>>>>>>>>>
>>>>>>>>>>> +            This also affects the permutations of inner MAC for
>>>>>>>>> ARP/ND. The
>>>>>>>>>>
>>>>>>>>>> "the permutations" doesn't sound explicit enough to me.  I'd just 
>>>>>>>>>> skip
>>>>>>>>>> it and only leave the sentence below, I think.
>>>>>>>>>>
>>>>>>>>>>> +            ARP/ND can be sent with physical MAC as a source and 
>>>>>>>>>>> the
>>>>>>>>> inner
>>>>>>>>>>> +            SHA/TLL/SLL can be the physical MAC or any VRRPv3 MAC.
>>>>>>>>>>> +          </dd>
>>>>>>>>>>> +
>>>>>>>>>>> +          <dt><code>"VRRPv3 &lt;PHYSICAL_MAC&gt;
>>>>>>>>>>> +                    &lt;VRRPV3_MACv4_1&gt;/[&lt;MASK1&gt;]
>>>>>>>>>>> +                    &lt;VRRPV3_MACv4_N&gt;
>>>>>>>>>>> +                    &lt;VRRPV3_MACv6_1&gt;/[&lt;MASK2&gt;]
>>>>>>>>>>> +                    &lt;VRRPV3_MACv6_N&gt;"</code></dt>
>>>>>>>>>>> +          <dd>
>>>>>>>>>>> +            The host may send traffic from and receive traffic to 
>>>>>>>>>>> the
>>>>>>>>>>> +            specified physical MAC addresses, and to all VRRPv3 MAC
>>>>>>>>> addresses
>>>>>>>>>>> +            specified in the option. Also note that the MAC 
>>>>>>>>>>> addresses
>>>>>>>>> can
>>>>>>>>>>> +            be provided with a mask between /40 and /48 prefix.
>>>>>>>>>>> +            This also affects the permutations of inner MAC for
>>>>>>>>> ARP/ND. The
>>>>>>>>>>
>>>>>>>>>> Same here.
>>>>>>>>>>
>>>>>>>>>>> +            ARP/ND can be sent with physical MAC as a source and 
>>>>>>>>>>> the
>>>>>>>>> inner
>>>>>>>>>>> +            SHA/TLL/SLL can be the physical MAC or provided VRRPv3 
>>>>>>>>>>> MAC.
>>>>>>>>>>> +          </dd>
>>>>>>>>>>>          </dl>
>>>>>>>>>>>        </column>
>>>>>>>>>>>      </group>
>>>>>>>>>
>>>>>>>>> <snip>
>>>>>>>>>
>>>>>>>>>>> +AS_BOX([With MAC only port security, VRRPv3=any])
>>>>>>>>>>> +reset_pcap_and_expected
>>>>>>>>>>> +check ovn-nbctl --wait=hv lsp-set-port-security lsp1 "VRRPv3
>>>>>>>>> 00:00:00:00:10:01"
>>>>>>>>>>> +
>>>>>>>>>>> +test_arp no
>>>>>>>>>>> +test_nd no
>>>>>>>>>>> +
>>>>>>>>>>> +OVN_CHECK_PACKETS([hv1/vif1-tx.pcap], [vif1.expected])
>>>>>>>>>>> +OVN_CHECK_PACKETS([hv1/vif2-tx.pcap], [vif2.expected])
>>>>>>>>>>> +
>>>>>>>>>>> +AT_CHECK([ovs-ofctl dump-flows br-int 
>>>>>>>>>>> table=OFTABLE_CHK_IN_PORT_SEC |
>>>>>>>>> ofctl_strip_all | sort | grep -v NXST_FLOW], [0], [dnl
>>>>>>>>>>> + table=OFTABLE_CHK_IN_PORT_SEC, priority=80,reg14=0x1,metadata=0x1
>>>>>>>>> actions=load:0x1->NXM_NX_REG10[[12]]
>>>>>>>>>>> + table=OFTABLE_CHK_IN_PORT_SEC,
>>>>>>>>> priority=90,reg14=0x1,metadata=0x1,dl_src=00:00:00:00:10:01
>>>>>>>>> actions=resubmit(,OFTABLE_CHK_IN_PORT_SEC_ND)
>>>>>>>>>
>>>>>>>>> So, this allows any traffic from the physical MAC, even though a 
>>>>>>>>> regular
>>>>>>>>> port security is not configured, only the VRRP one.  So, if we add the
>>>>>>>>> regular port security "00:00:00:00:10:01", we'll get a duplicate OF 
>>>>>>>>> rule.
>>>>>>>>> Not sure if it's a problem, but just something to note.
>>>>>>>>>
>>>>>>>>> But also, port security "00:00:00:00:10:01 192.168.0.1" will be 
>>>>>>>>> ineffective
>>>>>>>>> in combination with "VRRPv3 00:00:00:00:10:01", as the vrrp one will 
>>>>>>>>> allow
>>>>>>>>> any traffic from 00:00:00:00:10:01, not only vrrp-related.
>>>>>>>>>
>>>>>>>>> Should this rule be restricted to ARP/ND and have all the regular 
>>>>>>>>> traffic
>>>>>>>>> handled by standard port security?
>>>>>>>>>
>>>>>>>
>>>>>>> I guess we might have a slight misunderstanding here.  I thought that in
>>>>>>> order to make the user experience smoother we'd avoid having to
>>>>>>> configure the physical MAC twice in port security.
>>>>>>>
>>>>>>> The way I read port_security="VRRPv3 00:00:00:00:10:01 [VRRP_MAC1]" is:
>>>>>>>
>>>>>>> a. enforce exactly the same rules as port_security="00:00:00:00:10:01" 
>>>>>>> does
>>>>>>>
>>>>>>> _additionally_
>>>>>>>
>>>>>>> b. allow ARP/ND that use VRRP_MAC1 as arp.sha
>>>>>>> c. allow traffic routed by VRRP_MAC1
>>>>>>
>>>>>> The idea was a separation of concerns and a principle of least required
>>>>>> privileges.  Port doesn't need to be able to send IP traffic from the
>>>>>> physical MAC in order to be a fully functional virtual router.  A 
>>>>>> combined
>>>>>> configuration where vrrp entry acts as a regular one as well hinders the
>>>>>> ability for the fine control.
>>>>>>
>>>>>> It is also, IMO, less confusing for the user that vrrp entry only handles
>>>>>> vrrp stuff and nothing more.  That's why I defined the "option 4" this 
>>>>>> way
>>>>>> originally.  We can add extensive docuemntation about how this actually
>>>>>
>>>>> I see, I had slightly misunderstood "option 4".  But that's fine.
>>>>>
>>>>>> works and call it a day, but we do need to document the behavior in much
>>>>>> more details.
>>>>>>
>>>>>> There are still problmes though with the meaning of the IP addresses
>>>>>> on that entry, see below...
>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> While this is true doesn't that also apply to port_security without 
>>>>>>>> VRRPv3?
>>>>>>>> You can have just a MAC rule and second rule with the same MAC + IP.
>>>>>>>> The result is the same, does that configuration make sense? Not really,
>>>>>>>> but it is allowed. So maybe some emphasize in the documentation that
>>>>>>>> VRRPv3 replaces "traditional" port security in cases you need VRRPv3
>>>>>>>> might be enough? WDYT?
>>>>>>>>
>>>>>>>
>>>>>>> I agree, we should somehow emphasize this.  Maybe the following is a bit
>>>>>>> verbose but I couldn't come up with anything better.
>>>>>>>
>>>>>>> "When the port security configuration entry contains the VRRPv3 label,
>>>>>>> the behavior for the regular MAC (and IPs) listed in the entry doesn't
>>>>>>> change, traffic to and from that MAC (and IPs) is allowed as usual.
>>>>>>> However, additional rules are added to also allow traffic to/from the
>>>>>>> extra VRRP MACs (if none explicitly listed all 512 VRRP MACs are
>>>>>>> allowed) and ARP/ND traffic using the VRRP MAC.
>>>>>>>
>>>>>>> In essence, VRRPv3 labeled port security entries are a more relaxed
>>>>>>> version of the same non-VRRPv3 rules and users should not configure both
>>>>>>> simulateneously for the same non-VRRP MAC."
>>>>>>
>>>>>> When IP is listed in the entry, the code in this patch only allows for
>>>>>> the virtual router to route this one IP.  So, if user wants IP port
>>>>>> security for the physical MAC, they need to also add all the routeable
>>>>>> IPs for that VR to the port security entry, otherwise the router will
>>>>>> not be functional.  But that also likely means that the IP port security
>>>>>> for the actual port IP doesn't make sense, as a wide range of IPs will
>>>>>> be allowed anyway.  Again, the port doesn't need to be able to send
>>>>>> traffic to/from all these IPs using the physical MAC, but there is no
>>>>>> way to restrict that if we define vrrp entry as a superset of a regular
>>>>>> one.
>>>>>>
>>>>>> Not sure how much of a problem that is, but I would imagine users would
>>>>>> like to have a finer control where all IPs can be routed by the VR, but
>>>>>> the port itself could only use its own IP.
>>>>>>
>>>>>> Either way we'll need an extensive documentation with examples, 
>>>>>> especially
>>>>>> for the part where adding one IP makes no practical sense for the vrrp
>>>>>> port security entry.
>>>>>>
>>>>>
>>>>> It might be better to do what you suggest instead of trying to "fix the
>>>>> behavior through documentation".
>>>>>
>>>>> Just to make sure that I correctly understand this time.  Your view of
>>>>> how port security should be configured for VRRPv3 capable workloads on
>>>>> LSPs is:
>>>>>
>>>>> LSP.port_security = [
>>>>>    (1) "00:00:00:00:00:01 10.0.0.1 20.0.0.1",
>>>>>    (2) "VRRPv3 00:00:00:00:00:01 00:00:5E:00:01:01 30.0.0.1 30.0.0.2",
>>>>> ]
>>>>>
>>>>> (1) is classic port security allowing traffic to/from 00:00:00:00:00:01
>>>>> and IPs 10.0.0.1 and 20.0.0.1, likely workload originated traffic.
>>>>>
>>>>> (2)
>>>>> a. allows ARPs/ND with eth.src == 00:00:00:00:00:01 && arp.sha == 
>>>>> 00:00:5E:00:01:01 && arp.spa == {30.0.0.1, 30.0.0.2}
>>>>> b. allows routed traffic, i.e., eth.src == 00:00:5E:00:01:01 && ip
>>>>>   (or in the other direction)
>>>>>
>>>>> Now, if users want to further restrict the IPs from which/to which 
>>>>> traffic is routed they could either add the IPs to (2) but that leads
>>>>> to awkward ARP allow rules or try to add:
>>>>>
>>>>> (3) "00:00:5E:00:01:01 40.0.0.1 40.0.0.2"
>>>>>
>>>>> in the hope that this classic port security rule will allow only IP 
>>>>> traffic
>>>>> from 40.0.0.1 and 40.0.0.2 routed by 00:00:5E:00:01:01.
>>>>
>>>> I do not understand this.  The routing is already restricted to only the
>>>> 30.0.0.1 and 30.0.0.2.  Did you mean "extend the list of IPs" instead of
>>>> "further restrict"?
>>>>
>>>
>>> In my example above I had:
>>> - 10.0.0.1, 20.0.0.1 are workload owned IPs
>>> - 30.0.0.1, 30.0.0.2 are VRRP virtual IPs
>>> - 40.0.0.1, 40.0.0.2 are "external" source IPs sending traffic through
>>> the VRRP router.
>>>
>>> If (2)b would match on 30.0.0.1 and 30.0.0.2 then it would not allow any
>>> traffic from "external" to be routed through the VRRP router.  So it
>>> can't match on them.  That's why I had:
>>>
>>>>> b. allows routed traffic, i.e., eth.src == 00:00:5E:00:01:01 && ip
>>>>>   (or in the other direction)
>>>
>>> So I really meant "further restrict routed traffic to also match on IP".
>>>
>>> Does that make it a bit more clear?
>>
>> Yeah, I see.  Though that was not what my design for the "option 4"
>> meant with the IP definitions.  This ties back to my concern about
>> VR IP vs ROUTABLE IPs that we discussed here:
>>   https://mail.openvswitch.org/pipermail/ovs-dev/2026-January/429825.html
>> And the conclusion was that we just specify all the ROUTABLE IPs in
>> the VRRPv3 port security entry, as the VR IP is likely one of the
>> routable IPs anyway.
>>
> 
> That's true, and I did realize while replying earlier that I'm
> essentially suggesting to move back to the approach from v2 (just
> without an explicit knob).
> 
>> In your exmaple, if we're not treating 30.0.0.1, 30.0.0.2 as routable
>> IPs and only allow to use them in ARP/ND, then router will not be able
>> to use them as a source.  And as you mentioned in the previous discussion
>> keepalived, for exmample, will require to be able to send traffic from
>> these IPs.  It may also need to send soem icmp errors from these IPs(?).
>> So, we'll have to create a separate regular port security entry for them
>> as well.  Instead, we can just allow to use any IPs specified in the
>> VRRPv3 entry for ARP/ND and IP traffic.
>> This will allow ARp/ND with routable IPs as SIP, but I'm really not
>> sure if this is a problem and I thought we concluded that it's not.
>>
> 
> My suggestion had similar issues too, allowing weird ARPs due to the
> last rule to restrict "routed" IPs.  So there's a small compromise in
> both cases.  Let's drop my suggestion though.

OK.

> 
> So, to summarize, v5 should:
> - remove the flows that allow the "physical MAC" as ethernet source and
> destination for IP traffic (currently generated from the "VRRPv3" rule)
> - improve documentation
> - address the minor comments that were raised in the beginning of this
> thread
> 
> Anything else I missed?

Need to also remove flows that allow dl_src=PHY-MAC,arp_sha=PHY-MAC,
and the same for ND.

> 
>>>
>>>>>
>>>>> But that won't work because all routed traffic was already allowed by
>>>>> (2)b above.
>>>>>
>>>>> So maybe we should just do what you said in your previous email, and have
>>>>> the VRRPv3 rules only deal with ARP/ND (not even virtual router routed
>>>>> traffic).  Then the config would be (sorry for the long lines):
>>>>>
>>>>> LSP.port_security = [
>>>>>    (1) "00:00:00:00:00:01 10.0.0.1 20.0.0.1",                           
>>>>> --- regular MAC+IP port security
>>>>>    (2) "VRRPv3 00:00:00:00:00:01 00:00:5E:00:01:01 30.0.0.1 30.0.0.2",  
>>>>> --- VRRPv3 rule (2)a above
>>>>>    (3) "00:00:5E:00:01:01 40.0.0.1 40.0.0.2"                            
>>>>> --- regular MAC+IP port security (for routed traffic)
>>>>> ]
>>>>>
>>>>> What do you think?  The changes to this patch should be minimal and docs
>>>>> will be clearer IMO.
>>>>>
>>>>> Thanks,
>>>>> Dumitru
>>>>>
>>>>>> Best regards, Ilya Maximets.
>>>>>>
> 
> Thanks,
> Dumitru
> 

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to