• Stefano Brivio's avatar
    netfilter: ipset: Copy the right MAC address in bitmap:ip,mac and hash:ip,mac sets · 1b4a7510
    Stefano Brivio authored
    In commit 8cc4ccf5 ("ipset: Allow matching on destination MAC address
    for mac and ipmac sets"), ipset.git commit 1543514c46a7, I added to the
    KADT functions for sets matching on MAC addreses the copy of source or
    destination MAC address depending on the configured match.
    
    This was done correctly for hash:mac, but for hash:ip,mac and
    bitmap:ip,mac, copying and pasting the same code block presents an
    obvious problem: in these two set types, the MAC address is the second
    dimension, not the first one, and we are actually selecting the MAC
    address depending on whether the first dimension (IP address) specifies
    source or destination.
    
    Fix this by checking for the IPSET_DIM_TWO_SRC flag in option flags.
    
    This way, mixing source and destination matches for the two dimensions
    of ip,mac set types works as expected. With this setup:
    
      ip netns add A
      ip link add veth1 type veth peer name veth2 netns A
      ip addr add 192.0.2.1/24 dev veth1
      ip -net A addr add 192.0.2.2/24 dev veth2
      ip link set veth1 up
      ip -net A link set veth2 up
    
      dst=$(ip netns exec A cat /sys/class/net/veth2/address)
    
      ip netns exec A ipset create test_bitmap bitmap:ip,mac range 192.0.0.0/16
      ip netns exec A ipset add test_bitmap 192.0.2.1,${dst}
      ip netns exec A iptables -A INPUT -m set ! --match-set test_bitmap src,dst -j DROP
    
      ip netns exec A ipset create test_hash hash:ip,mac
      ip netns exec A ipset add test_hash 192.0.2.1,${dst}
      ip netns exec A iptables -A INPUT -m set ! --match-set test_hash src,dst -j DROP
    
    ipset correctly matches a test packet:
    
      # ping -c1 192.0.2.2 >/dev/null
      # echo $?
      0
    Reported-by: default avatarChen Yi <yiche@redhat.com>
    Fixes: 8cc4ccf5 ("ipset: Allow matching on destination MAC address for mac and ipmac sets")
    Signed-off-by: default avatarStefano Brivio <sbrivio@redhat.com>
    Signed-off-by: default avatarJozsef Kadlecsik <kadlec@netfilter.org>
    1b4a7510
ip_set_hash_ipmac.c 8.19 KB