问题简介一般来说,Linux系统的路由表中只能有一条默认路由。当出站数据包根据目的IP地址路由失败时,执行默认路由,由默认路由指向的下一跳路由器(默认网关)转发数据包。现在需要同时存在两条默认路由。数据包通过的默认路由由程序指定(或根据规则)。数据包通过特定的路由规则转发到相应的路由器。下面我们以如下拓扑为例,介绍如何通过策略路由实现上述需求。服务器上安装了两块网卡,分别是p7p1和p7p2;网卡p7p1:192.168.1.1/24,连接路由器R1;网卡p7p2:192.168.2.1/24,连接路由器R2;路由器R1:192.168.1.254/24;路由器R2:192.168.2.254/24。我们要实现的路由选择策略:根据源IP地址选择路由,所有源IP地址为192.168.1.1的数据包都通过eth0转发到路由器R1,所有源IP地址为192.168.2.1的数据包都转发到路由器R2;进一步地,本地程序发送IP报文,程序选择出口转发给相应的路由器。实现思路以上配置需求是通过多路由表和策略路由来实现的。路由表1:默认路由指向R1,即192.168.1.254;路由表2:默认路由指向R2,即192.168.2.254策略路由,优先级高于本地路由表:源IP为192.168.1.1的数据包执行路由表1;源IP为192.168.2.1的包,执行路由表2;路由表配置1.创建路由表#echo"10eth1table">>/etc/iproute2/rt_tables#echo"20eth2table">>/etc/iproute2/rt_tables2.配置路由表,添加默认路由#本机到默认网关之间的路由,否则会显示路由不可达#iprouteadd192.168.1.0/24deveth1tableeth1table#iprouteadd192.168.2.0/24deveth2tableeth2table#defaultgateway#iprouteadddefaultvia192.168.1.254tableeth1table#iprouteadddefaultvia192.168.2.254tableeth2table3。configurepolicyrouting#ipruleaddfrom192.168.1.1/32tableeth1table#iprule.addfrom18192.2.1/32tableeth2tabletest为了方便,通过静态ARP配置来模拟下一跳路由器。#arp-s192.168.1.254aa:bb:cc:dd:ee:ff#arp-s192.168.2.25411:22:33:44:55:66使用NC工具发送UDP包,设置源IP地址为192.168.1.1,即#nc-s192.168.1.1-u202.202.202.202在网卡p7p1上运行tcpdump命令抓包。#tcpdump-ip7p1-e结果:15:39:36.225020e8:61:1f:18:ef:24(ouiUnknown)>aa:bb:cc:dd:ee:ff(ouiUnknown),ethertypeIPv4(0x0800)),length51:192.168.1.1.46399>202.202.202.202.31337:UDP,length9同理,设置源IP地址为192.168.2.1,通过tcpdump抓取p7p2上的15:42:11.157252e8:61:1f:18:ef:25(ouiUnknown)>11:22:33:44:55:66(ouiUnknown),ethertypeIPv4(0x0800),长度48:192.168.2.1.39107>202.202.202.202.31337:UDP,长度6参考资料[1]https://networkengineering.st...TODOSO_BINDTODEVICE是socket(7)手册中提供的方法,与该方法有一些区别,有待考证。
