On Sat, Apr 18, 2020 at 3:24 AM Dumitru Ceara <[email protected]> wrote:
>
> Neighbor solicitation packets for router owned IPs are replied to in
> table IN_IP_INPUT at a higher priority than flows relay IPv6 multicast
> traffic when needed. All other NS/NA packets received at this point can
> be safely dropped.
>
> However, router advertisement and router solicitation packets are
> processed at a later stage, in ND_RA_OPTIONS/ND_RA_RESPONSE. These
> packets need to be allowed in table IN_IP_INPUT.
>
> Commit 677a3ba4d66b incorrectly allowed all IPv6 multicast traffic
> destined to all-nodes in table IN_IP_INPUT. Instead, only ND_RA and
> ND_RS packets should be allowed. All others were either already
> processed or should be dropped. If multicast relay is enabled then IPv6
> multicast traffic that's not destined to reserved groups should also be
> allowed.
>
> Furthermore, router solicitation and advertisement packets that don't
> get processed in tables ND_RA_OPTIONS/ND_RA_RESPONSE should be dropped
> in IN_IP_ROUTING because they should never be routed.
>
> Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=1825334
> Reported-by: Jakub Libosvar <[email protected]>
> Fixes: 677a3ba4d66b ("ovn: Add MLD support.")
> Signed-off-by: Dumitru Ceara <[email protected]>
> ---
>  northd/ovn-northd.8.xml | 49 
> ++++++++++++++++++++++++++++++++-----------------
>  northd/ovn-northd.c     | 43 ++++++++++++++++++++++++++++++-------------
>  2 files changed, 62 insertions(+), 30 deletions(-)

Thanks Dumitru for the fix.
I tested locally too and confirm that IPv6 RA packets  which entered
the router pipeline
are dropped.

I applied this patch to master and branch-20.03.

Thanks
Numan

>
> diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml
> index 82c86f6..efcc4b7 100644
> --- a/northd/ovn-northd.8.xml
> +++ b/northd/ovn-northd.8.xml
> @@ -1670,22 +1670,6 @@ next;
>
>        <li>
>          <p>
> -          A priority-87 flow explicitly allows IPv6 multicast traffic that is
> -          supposed to reach the router pipeline (e.g., neighbor solicitations
> -          and traffic destined to the All-Routers multicast group).
> -        </p>
> -      </li>
> -
> -      <li>
> -        <p>
> -          A priority-86 flow allows IP multicast traffic if
> -          <ref column="options" table="Logical_Router"/>:mcast_relay='true',
> -          otherwise drops it.
> -        </p>
> -      </li>
> -
> -      <li>
> -        <p>
>            ICMP echo reply.  These flows reply to ICMP echo requests received
>            for the router's IP address.  Let <var>A</var> be an IP address
>            owned by a router port.  Then, for each <var>A</var> that is
> @@ -1946,6 +1930,29 @@ nd.tll = <var>external_mac</var>;
>
>        <li>
>          <p>
> +          A priority-84 flow explicitly allows IPv6 multicast traffic that is
> +          supposed to reach the router pipeline (i.e., router solicitation
> +          and router advertisement packets).
> +        </p>
> +      </li>
> +
> +      <li>
> +        <p>
> +          A priority-83 flow explicitly drops IPv6 multicast traffic that is
> +          destined to reserved multicast groups.
> +        </p>
> +      </li>
> +
> +      <li>
> +        <p>
> +          A priority-82 flow allows IP multicast traffic if
> +          <ref column="options" table="Logical_Router"/>:mcast_relay='true',
> +          otherwise drops it.
> +        </p>
> +      </li>
> +
> +      <li>
> +        <p>
>            UDP port unreachable.  Priority-80 flows generate ICMP port
>            unreachable messages in reply to UDP datagrams directed to the
>            router's IP address, except in the special case of gateways,
> @@ -2442,6 +2449,13 @@ output;
>      <ul>
>        <li>
>          <p>
> +          Priority-550 flow that drops IPv6 Router Solicitation/Advertisement
> +          packets that were not processed in previous tables.
> +        </p>
> +      </li>
> +
> +      <li>
> +        <p>
>            Priority-500 flows that match IP multicast traffic destined to
>            groups registered on any of the attached switches and sets
>            <code>outport</code> to the associated multicast group that will
> @@ -2457,7 +2471,8 @@ output;
>            multicast group, which <code>ovn-northd</code> populates with the
>            logical ports that have
>            <ref column="options" table="Logical_Router_Port"/>
> -          <code>:mcast_flood='true'</code>.
> +          <code>:mcast_flood='true'</code>. If no router ports are configured
> +          to flood multicast traffic the packets are dropped.
>          </p>
>        </li>
>
> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
> index 616e52b..3248350 100644
> --- a/northd/ovn-northd.c
> +++ b/northd/ovn-northd.c
> @@ -8006,17 +8006,6 @@ build_lrouter_flows(struct hmap *datapaths, struct 
> hmap *ports,
>
>          /* Priority-90 flows reply to ARP requests and ND packets. */
>
> -        /* Allow IPv6 multicast traffic that's supposed to reach the
> -         * router pipeline (e.g., neighbor solicitations).
> -         */
> -        ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 87, 
> "ip6.mcast_flood",
> -                      "next;");
> -
> -        /* Allow multicast if relay enabled (priority 86). */
> -        ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 86,
> -                      "ip4.mcast || ip6.mcast",
> -                      od->mcast_info.rtr.relay ? "next;" : "drop;");
> -
>          /* Drop ARP packets (priority 85). ARP request packets for router's 
> own
>           * IPs are handled with priority-90 flows.
>           * Drop IPv6 ND packets (priority 85). ND NA packets for router's own
> @@ -8025,6 +8014,21 @@ build_lrouter_flows(struct hmap *datapaths, struct 
> hmap *ports,
>          ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 85,
>                        "arp || nd", "drop;");
>
> +        /* Allow IPv6 multicast traffic that's supposed to reach the
> +         * router pipeline (e.g., router solicitations).
> +         */
> +        ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 84, "nd_rs || nd_ra",
> +                      "next;");
> +
> +        /* Drop other reserved multicast. */
> +        ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 83,
> +                      "ip6.mcast_rsvd", "drop;");
> +
> +        /* Allow other multicast if relay enabled (priority 82). */
> +        ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 82,
> +                      "ip4.mcast || ip6.mcast",
> +                      od->mcast_info.rtr.relay ? "next;" : "drop;");
> +
>          /* Drop Ethernet local broadcast.  By definition this traffic should
>           * not be forwarded.*/
>          ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 50,
> @@ -9545,7 +9549,17 @@ build_lrouter_flows(struct hmap *datapaths, struct 
> hmap *ports,
>       * advance to next table (priority 500).
>       */
>      HMAP_FOR_EACH (od, key_node, datapaths) {
> -        if (!od->nbr || !od->mcast_info.rtr.relay) {
> +        if (!od->nbr) {
> +            continue;
> +        }
> +
> +        /* Drop IPv6 multicast traffic that shouldn't be forwarded,
> +         * i.e., router solicitation and router advertisement.
> +         */
> +        ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING, 550,
> +                      "nd_rs || nd_ra", "drop;");
> +
> +        if (!od->mcast_info.rtr.relay) {
>              continue;
>          }
>
> @@ -9576,7 +9590,7 @@ build_lrouter_flows(struct hmap *datapaths, struct hmap 
> *ports,
>          }
>
>          /* If needed, flood unregistered multicast on statically configured
> -         * ports.
> +         * ports. Otherwise drop any multicast traffic.
>           */
>          if (od->mcast_info.rtr.flood_static) {
>              ds_clear(&actions);
> @@ -9587,6 +9601,9 @@ build_lrouter_flows(struct hmap *datapaths, struct hmap 
> *ports,
>                                  "ip.ttl--; "
>                                  "next; "
>                            "};");
> +        } else {
> +            ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING, 450,
> +                          "ip4.mcast || ip6.mcast", "drop;");
>          }
>      }
>
> --
> 1.8.3.1
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to