Kil*_*nDS 5 linux routing socket
我有一个运行原始 IP 套接字的应用程序,该套接字的目标由通过“ip route add”命令安装的路由控制。这些路由在套接字的生命周期内可能会发生变化(例如,因为下一跳发生变化)
简化,假设我有 2 个接口,eth0和eth1. 我也有一个默认路由,通过eth0.
例如10.10.10.10,原始套接字的端点是eth1 具有地址100.0.0.1,我在原始套接字的生命周期中执行以下操作:
ip -f inet route delete 10.10.10.10
ip -f inet route add 100.0.0.2 dev eth1
ip -f inet route add 10.10.10.10/32 via 100.0.0.2 dev eth1
Run Code Online (Sandbox Code Playgroud)
现在我看到的是,在此操作流量正确通过eth1几秒钟后,它会出错(通过 eth0)一小段时间(不到半秒),然后又正确(就我永久看到的而言) )。
所以我的主要问题是: - 任何人都可以解释这里可能出现的问题吗?我尝试ip route flush cache在前面提到的序列之后添加,但没有做任何事情。我目前对为什么流量有时会下降感到困惑。我认为这要么是路由命令中的计时问题,要么是其他一些触发器在一瞬间禁用了路由,但我的选择已经用完了。
我曾尝试使用SO_BINDTODEVICE选项在我的原始套接字,但很可惜这并没有帮助很大,主要区别是,当业务出现问题它没有发出可言,因为它会去了错误的接口。但是,我希望的是这会将 errno 设置为 E_CANNOTROUTE 之类的东西(这不存在),因此我可以捕获它并重试发送数据包。它目前没有这样做,但是有没有办法可以捕捉到这样的失败?我(几乎)完全控制了系统和运行套接字的应用程序。
我知道可行的一种解决方案是不使用 L3 原始套接字,而是使用AF_PACKET套接字(并且我自己也使用 ARP/ND),但我现在还不想这样做。
通过更改此路由更改行为,我改进了系统中的行为。当我必须更新下一跳时,我现在会查看已安装的路由并根据该路由执行操作:
虽然这稳定了我的大部分问题,但当实际删除+添加发生时(新机制中的最后一种情况),我有时仍然会看到同样的事情发生(尽管频率要低得多)。此外,这实际上仍然不能解释出了什么问题(它只是规避了它),所以我现在将这个问题悬而未决,因为我真的很好奇这里出了什么问题。
仅供参考:我在 centos 上遇到了问题,据我所知,从 centos4 到 centos6,32 位。
如果我理解正确,数据包应该始终从 eth1 发出,而您的问题是,当更新到 eth1 上的新下一跳时,数据包有时会从 eth0 发出?那是因为您的删除+添加不是原子操作。
尝试先执行添加,然后执行删除。删除必须是特定的(我相信是设备和下一跳),这样它就不会删除您刚刚添加的新路由。
| 归档时间: |
|
| 查看次数: |
372 次 |
| 最近记录: |