Federico Montesino Pouzols
2001-May-31 12:58 UTC
Strange behaviour of ''ip'' with gateways inside non-main tables
Hi, Folks! This post deals with ip: ~# ip -V ip utility, iproute2-ss001007 I want to do this: The box (A) I try to configure has three network interfaces (eth1, eth2 and eth3) connected through a switch to a router (let''s say 192.168.100.20). Depending on the source ip (192.168.100.11 or 192.168.100.12 or 192.168.100.13) I want to send to the router the packets through one and only one interface, for instance: packets from 192.168.100.11 go through eth1 packets from 192.168.100.12 go through eth2 packets from 192.168.100.13 go through eth3 <parenthesis> Before attempting it, let''s do a similar thing but sending the packets to a directly connected host (for example, B). This can easily be accomplished with three rules and three tables, one rule and one table for every source address. I have been using this for a long time and it works fine: ------- --------- |eth1-192.168.100.11 --------- | | |----------------------| | | | BOX A | | | | BOX B | |eth2-192.168.100.12 | | | | |----------------------|switch |-------| 192.168.100.2 | | | | | |eth3-192.168.100.13 | | | | |----------------------| | | | ------- --------- --------- # ip rule add from 192.168.100.11 lookup 11 # ip rule add from 192.168.100.12 lookup 12 # ip rule add from 192.168.100.13 lookup 13 # ip ro a 192.168.100.2 dev eth1 t 11 # ip ro a 192.168.100.2 dev eth2 t 12 # ip ro a 192.168.100.2 dev eth3 t 13 </parenthesis> The problem arises when I insert a router between my box A and my box B, then I have to use ''via''... ------ ---------- |eth1-192.168.100.11 --------- | | |----------------------| | | | BOX A| | | | ROUTER | |eth2-192.168.100.12 | | | | |----------------------|switch |-------|192.168.100.20 | | | | | |eth3-192.168.100.13 | | | | ------- |----------------------| | | |-------| | ------ --------- ---------- | | |BOX B| | | | | ------- 192.168.100.2 I try: # ip ro a 192.168.100.20 dev eth1 t 11 # ip ro a 192.168.100.20 dev eth2 t 12 # ip ro a 192.168.100.20 dev eth3 t 13 No problem, but... # ip ro a 192.168.100.2 via 192.168.100.20 dev eth1 table 11 RTNETLINK answers: Network is unreachable It seemed ip requires a route to 192.168.100.20 _____in the main table_____. So, before doing this, I try to deceive ''ip'', making a fake route that I will delete soon: # ip ro a 192.168.100.20 dev eth1 then, # ip ro a 192.168.100.2 via 192.168.100.20 dev eth1 t 11 works fine. And so on with the other two interfaces: # ip ro change 192.168.100.20 dev eth2 # ip ro a 192.168.100.2 via 192.168.100.20 dev eth2 t 12 # ip ro change 192.168.100.20 dev eth3 # ip ro a 192.168.100.2 via 192.168.100.20 dev eth2 t 13 Finally, I delete the fake route from the main table, # ip ro del 192.168.100.20 and, fortunately, get the desired state: ~# ip ru s 0: from all lookup local 32763: from 192.168.100.13 lookup 13 32764: from 192.168.100.12 lookup 12 32765: from 192.168.100.11 lookup 11 32766: from all lookup main 32767: from all lookup default ~# ip r s t 11 192.168.100.20 dev eth1 scope link default via 192.168.100.20 dev eth1 ~# ip r s t 12 192.168.100.20 dev eth2 scope link default via 192.168.100.20 dev eth2 ~# ip r s t 13 192.168.100.20 dev eth3 scope link default via 192.168.100.20 dev eth3 ~# ip r s ~# ip r get 192.168.100.20 RTNETLINK answers: Network is unreachable ~# ip r get 192.168.100.20 from 192.168.100.11 192.168.100.20 from 192.168.100.11 dev eth1 cache mtu 1500 ~# ip r get 192.168.100.20 from 192.168.100.12 192.168.100.20 from 192.168.100.12 dev eth2 cache mtu 1500 ~# ip r get 192.168.100.20 from 192.168.100.13 192.168.100.20 from 192.168.100.13 dev eth3 cache mtu 1500 So, it works, but I can only configure my routing tables deceiving ''ip'' with the false routes in the main table, that finally I can delete without any trouble. Conclussion: It works but the way it is configured is pretty ugly. I have tried doing ''ip r flush cache'' between one ''route add'' and the following ''route add'', also I have tried adding a ____''from 192.168.100.x''___ and a ___''t 1x''___ qualifier to the ''ip route add .... via ...'' commands; none of these solved the problem. *** Q: I wonder if this is a bug of ''ip'' (it seems to check routes to desired gateways looking up the main table only and ignoring rules and source qualifiers) or if I am doing something wrong. Thanks in advance for any feedback. Read you soon!