netdev
[Top] [All Lists]

Re: ARP problem?

To: "Thompson, Ian" <Ian_Thompson@xxxxxxxxxxx>
Subject: Re: ARP problem?
From: Ben Greear <greearb@xxxxxxxxxxxxxxx>
Date: Wed, 16 Oct 2002 16:56:35 -0700
Cc: "'netdev@xxxxxxxxxxx'" <netdev@xxxxxxxxxxx>
Organization: Candela Technologies
References: <E156A23F1885D4119ED800B0D0498A9F02128B96@xxxxxxxxxxxxxxxxxxxx>
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910
Thompson, Ian wrote:
You need arp-filtering:

# Set up arp-filter magic. This, with source-based routing allows us # to have multiple NICs on the same subnet, on the same machine, connected
    # to the same switch...
    if [ -f  /proc/sys/net/ipv4/conf/all/arp_filter ];
    then
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
    else
echo "ERROR: kernel does not support arp_filter. Don't put more than" echo " one interface on the same subnet on the same machine."
        echo ""
    fi



I tried this, and now I'm getting only one ARP response.  However, I get the
same MAC address for ARP broadcasts for either IP address.  Does ARP
filtering turn off all but the first interface when processing ARP packets?
Can I get each interface to answer ARP packets only for its specific IP
address?

Try setting up source-based routing.  Here is a snippet of perl code that
does that, but it will be difficult for you to decipher out of context:

e_if is a list of interfaces (ie eth2)
e_ip is the IP for this interface
sigb is the significant bits, ie the 24 in 192.168.2.0/24
e_tbl is the table name, you need a table for each interface.


      print "# Setup for device: $e_if[$i]  IP:  $e_ip[$i]  sig-bits: 
$e_sigb[$i]\n";
      printAndExec("ip link set $e_if[$i] down");
      printAndExec("ip link set $e_if[$i] up");
      printAndExec("ip addr flush dev $e_if[$i]");
      if ($e_ip[$i] ne "0.0.0.0") {
        printAndExec("ip address add $e_ip[$i]/$e_sigb[$i] broadcast $e_bcast[$i] 
dev $e_if[$i]");
      }
      printAndExec("ip link set dev $e_if[$i] up");
      if ($e_ip[$i] ne "0.0.0.0") {
        printAndExec("ip ru add from $e_ip[$i]/32 table $e_tbl[$i]");
        printAndExec("ip route add $e_sub[$i]/$e_sigb[$i] via $e_ip[$i] table 
$e_tbl[$i]");
      }
      if ($e_gw[$i] ne "0.0.0.0") {
        printAndExec("ip route add 0/0 via $e_gw[$i] dev $e_if[$i] table 
$e_tbl[$i]");
      }

You can use this to give you ideas of what to look for as you read one of the
advanced-routing HOWTOs.  With source-based routing and arp-filtering, I have
gotten many interfaces on the same subnet to work as you would expect, so it
can be done :)

Ben



Thanks,
-ian



--
Ben Greear <greearb@xxxxxxxxxxxxxxx>       <Ben_Greear AT excite.com>
President of Candela Technologies Inc      http://www.candelatech.com
ScryMUD:  http://scry.wanfear.com     http://scry.wanfear.com/~greear



<Prev in Thread] Current Thread [Next in Thread>