多网卡服务器跨网段路由配置问题求助
多网卡服务器跨网段路由配置问题求助
嘿,这个双网卡路由的坑我之前也踩过!核心问题其实是数据包的回程路径不匹配,加上Linux默认的反向路径过滤机制在搞鬼,咱们一步步来解决:
问题根源分析
当192.168.200.x网段的机器访问serverA.example.com(对应192.168.117.70)时,数据包确实能到达ServerA的10Gb网卡,但ServerA的默认网关是192.168.117.65,所以它会把回程数据包从117网段的网卡发回去。这时候200网段的机器收到来自非本网段的回复包,会直接丢弃(因为反向路径校验不通过),就出现了能通200.45但不通117.70的情况。
解决方案步骤
1. 调整反向路径过滤(rp_filter)设置
Linux默认开启了严格的反向路径过滤,会检查数据包的来源和出口是否匹配,咱们需要改成松散模式:
- 先检查当前设置:
sysctl net.ipv4.conf.all.rp_filter sysctl net.ipv4.conf.onboard-10Gb-1.rp_filter sysctl net.ipv4.conf.bond0.rp_filter - 如果输出是
1(严格模式),临时修改生效:sysctl -w net.ipv4.conf.all.rp_filter=2 sysctl -w net.ipv4.conf.onboard-10Gb-1.rp_filter=2 sysctl -w net.ipv4.conf.bond0.rp_filter=2 - 永久生效的话,编辑
/etc/sysctl.conf文件,添加/修改以下内容:
然后执行net.ipv4.conf.all.rp_filter=2 net.ipv4.conf.onboard-10Gb-1.rp_filter=2 net.ipv4.conf.bond0.rp_filter=2sysctl -p加载新配置。
2. 添加静态回程路由规则
咱们需要让来自192.168.200.x网段的数据包,回程时从bond0网卡走,而不是默认的10Gb网卡:
- 添加自定义路由表和路由:
# 创建一个编号为100的路由表(名字可以随便取) echo "100 bond0-table" >> /etc/iproute2/rt_tables # 添加路由:所有到200网段的流量从bond0网卡走,源地址用200.45 ip route add 192.168.200.0/24 dev bond0 src 192.168.200.45 table bond0-table # 添加规则:来自200网段的流量使用这个自定义路由表 ip rule add from 192.168.200.0/24 table bond0-table - 永久保存的话,不同发行版略有差异:
- CentOS/RHEL:可以在
/etc/sysconfig/network-scripts/下创建route-bond0和rule-bond0文件,分别写入上面的路由和规则内容。 - Debian/Ubuntu:可以在
/etc/network/interfaces里的bond0配置段添加对应的up命令,或者写入/etc/network/interfaces.d/目录下的配置文件。
- CentOS/RHEL:可以在
3. 验证配置是否生效
- 检查路由表:
ip route show table bond0-table,应该能看到咱们添加的200网段路由 - 检查规则:
ip rule show,能看到来自200网段的流量指向bond0-table的规则 - 从200网段的机器ping
serverA.example.com,同时在ServerA上用tcpdump -i bond0 icmp抓包,应该能看到回程的ICMP回复从bond0网卡发出。
额外提示
如果还是不行,可以检查200网段机器的路由表,确保它们没有把117网段的流量指向错误的网关;另外,也可以试试在ServerA上临时关闭rp_filter(设为0)来快速验证是不是这个机制导致的问题。
备注:内容来源于stack exchange,提问作者Derek Edwards
相关产品推荐
相关产品推荐

