一台centos 6.5的机器,有两张网卡,过去一直使用其中的em1,IP为A。现在需要为em2添加另一个IP B,并且两个IP都要正常对外服务。设置完成后,默认网关是配置为走em1,此时发现从B无法访问机器。默认网关更改为走em2,此时发现从A无法访问机器。经过查找发现是由于从非网关网卡进入的数据,处理后并未通过来的网卡原路返回,而是走了默认网关,导致能发却收不到的问题。
此时解决方案是让路由表通过判定IP包的来源,如果源地址是非网关的IP,则在路由选择时要通过非网关的IP发送。
在修改前,先把A的网关设置为机器的默认网关。修改的命令如下:
用编辑器修改/etc/sysctl.conf,修改或添加下列项
1 |
net.ipv4.conf.default.accept_source_route = 1 |
首先在系统中开启使用源路由功能
然后在路由表中添加一个自定义表
1 |
echo "200 ip_rule_from_b" >> /etc/iproute2/rt_tables |
然后为这个自定义表添加处理规则,匹配的数据包发送到B的网关IP
1 |
ip route add default via [B_GATEWAY_IP] ip_rule_from_b" >> /etc/iproute2/rt_tables |
最后添加使用自定义表的匹配规则,判定来源为B的IP的数据包使用自定义表处理,这条规则优先级为32765
1 |
ip rule add from [B_ADDRESS_IP] pref 32765 table ip_rule_from_b |
搞定!