虽然我们无法改变人生,但可以改变人生观。虽然我们无法改变环境,但我们可以改变心境。
现在很多服务器由于业务需求,需要实现多网卡,多IP,多路由,我们知道,一般我们在系统上,只能添加一条默认路由,其他路由我们都是通过目标网段或IP来添加静态路由实现,那么如何实现多网卡,多IP对应多路由,实现入口IP和出口IP一致,下面了解一下。
在linux中,有一种灵活的路由策略实现方法,就是利用rt_tables。
在以往的路由管理中,我们都是通过route命令,临时添加静态路由,将要实现的路由,通过静态路由的方式,添加实现,或者直接将路由表写入network文件,以实现永久生效,简单的路由,用这种方式实现,还能够轻松应对,当网络环境复杂的时候,这种方式让运维人员力不从心。
而rt_tables通过对路由表的命名区分,及路由规则绑定,轻松应对多网卡,多路由的复杂环境,
rt_tables配置文件在/etc/iproute2/rt_tables,如下:
rt_tables中,每行一条路由表及对应的优先级(前面的数字代表优先级,数字越小优先级越高),使用路由表时,可以用优先级的值,也可以用路由表的名称,最多可以有255个路由表,默认有3张内置路由表,分别是
local(本地路由表)
本地接口地址,广播地址,NAT地址都在这张表里,该表由系统自动维护
main(主路由表)
通常没有绑定路由表的路由,都在这个表中,route管理的路由一般也是添加在这张表中
default(默认路由表)
放置网关路由和默认路由
开始配置双网卡路由,首先确认确认网卡配置中先不配置网关,否则在后面的规则配置中无法添加对应网卡路由
在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查看规则绑定
上面的配置是所有的数据包按照配置的规则执行路由,那么下面介绍通过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代理测试。