现在很多服务器由于业务需求,需要实现多网卡,多IP,多路由,我们知道,一般我们在系统上,只能添加一条默认路由,其他路由我们都是通过目标网段或IP来添加静态路由实现,那么如何实现多网卡,多IP对应多路由,实现入口IP和出口IP一致,下面了解一下。

        在linux中,有一种灵活的路由策略实现方法,就是利用rt_tables。

        在以往的路由管理中,我们都是通过route命令,临时添加静态路由,将要实现的路由,通过静态路由的方式,添加实现,或者直接将路由表写入network文件,以实现永久生效,简单的路由,用这种方式实现,还能够轻松应对,当网络环境复杂的时候,这种方式让运维人员力不从心。

        而rt_tables通过对路由表的命名区分,及路由规则绑定,轻松应对多网卡,多路由的复杂环境,

        rt_tables配置文件在/etc/iproute2/rt_tables,如下:

linux多网卡策略路由_java

        rt_tables中,每行一条路由表及对应的优先级(前面的数字代表优先级,数字越小优先级越高),使用路由表时,可以用优先级的值,也可以用路由表的名称,最多可以有255个路由表,默认有3张内置路由表,分别是

  • local(本地路由表)

    本地接口地址,广播地址,NAT地址都在这张表里,该表由系统自动维护

  • main(主路由表)

    通常没有绑定路由表的路由,都在这个表中,route管理的路由一般也是添加在这张表中

  • default(默认路由表)

    放置网关路由和默认路由



        开始配置双网卡路由,首先确认确认网卡配置中先不配置网关,否则在后面的规则配置中无法添加对应网卡路由

linux多网卡策略路由_java_02

        在rt_tables中添加两张路由表

[root@localhost ~]# echo "1 eno16777736" >> /etc/iproute2/rt_tables 

[root@localhost ~]# echo "2 ens37" >> /etc/iproute2/rt_tables   

        添加规则到路由表

[root@localhost ~]# ip route add default via 192.168.2.1 dev eno16777736 src 192.168.2.21 table eno16777736

[root@localhost ~]# ip rule add from 192.168.2.21 table eno16777736

在eno16777736路由表中添加一条路由规则,并绑定192.168.2.21的数据包使用该路由表。

[root@localhost ~]# ip route add default via 192.168.1.1 dev ens37 src 192.168.1.21 table ens37

[root@localhost ~]# ip rule add from 192.168.1.21 table ens37

添加好之后可以通过ip route show tables [路由表]查看路由规则

然后通过ip rule查看规则绑定

linux多网卡策略路由_java_03


        上面的配置是所有的数据包按照配置的规则执行路由,那么下面介绍通过iptables以用户区分执行路由。

        这里就用到了iptables的Owner Match,Owner match支持–uid-owner、–gid-owner匹配

        首先我们通过useradd新建用户,在/etc/passwd中查看用户uid,然后通过iptables命令添加uid匹配的nat规则

iptables -t nat -A POSTROUTING -m owner --uid-owner 496 -j SNAT --to-source 192.168.2.21

        之后,我们通过uid496的用户启动的对外的连接,都会匹配该规则,我们可以用shadowsocks代理测试。