我一直在使用Linux(2.6.x)RPDB(路由策略数据库),以便实现基于源地址的路由,为所需的源设置专用路由表,如下所示:

  1. 0:来自所有查找本地
  2. 32765:来自source-IP-address lookup table-id
  3. 32766:来自所有查找主
  4. 32767:来自所有查找默认值

此外,我的应用程序使用原始套接字生成ICMP回送消息。 问题是,当'IP_HDRINCL'套接字选项设置为'1'并且应用程序将整个IP标头与源IP地址一起构建时,相应的路由表不会被命中而是命中主路由表。

但是,如果我修改应用程序不设置IP_HDRINCL套接字选项并在原始套接字上显式绑定以指定源地址,那么它会正确地命中所需的路由表。

是否需要在套接字上绑定才能使用RPDB的基于源的路由功能?

提前致谢!!

  ask by Vivek Gupta translate from so

本文未有回复,本站智能推荐:

1回复

在没有root的linux / android上为UDP数据包分配传出接口

我正在尝试为无根的UDP数据包分配传出接口。 到目前为止,我已经发现 IP_PKTINFO,它将修改源地址,但接口选择仍将基于路由表 SO_BINDTODEVICE可以工作,但需要root用户 修改路由表,这将需要我没有的权限。 我在Solaris上找到了
1回复

如何在非网关接口Linux上检测Internet连接

我有一个带有2个NIC的Linux系统,其中一个( eth0 )是默认网关。 另一个( eth1 )不是默认网关。 两者都有网络连接和Internet连接-链接状态为up。 我想定期检查eth1以查看是否可以通过它路由Internet流量。 在检查eth1 ,我需要保持通过eth0
3回复

如何避免在Linux中通过本地堆栈进行路由

我有以下环境:2个主机,每个主机具有2个相互连接的以太网接口(如下图所示): 我想编写客户端/服务器套接字工具,该工具将同时打开host1上的客户端和服务器套接字。 我希望客户端通过接口(1)发送TCP数据包,而服务器在接口(3)上侦听数据包将通过host2。 通常,Linux堆
1回复

如何为socket设置多个路由条目?

我是静态路由的新手,我们的客户端要求为套接字实现静态路由。 当我用rtentry搜索时,我遇到了rtentry来设置路由信息。 当我打开这个结构时,我看到了静态路由的字段 但是我如何在这里设置多个条目? 创建多个rtentry并调用ioctl(FileDes, SIOCADDRT,
1回复

C Linux的分组路由器。 设置sendto()

我正在尝试制作一个可以接收数据包,读取其目的地并按途发送的数据包路由器。 它接收数据包就好了,问题是当我尝试执行sendto()时,我总是收到错误 我正在从接收到的数据包的以太网标头中获取目标MAC地址,将其加载到struct sockaddr_ll ,并将其传递给sendto()但它
1回复

使用IP_HDRINCL时需要填写什么

我正在等待“ Linux网络编程”的到来,但是与此同时,我想问一下我的兄弟(和姐妹)一些信息。 如果我构建了包含以太网头,ip头和tcp / udp / icmp头的原始数据包结构。 使用选项IP_HDRINCL时,我实际上必须填写什么? 起初我以为我必须做所有事情,但是现在我知道以太网头
2回复

在Linux中将IP_HDRINCL设置为PF_PACKET错误

我使用以下命令设置了原始数据包套接字: 然后我尝试使用以下方法设置套接字选项IP_HDRINCL : 但是我无法设置此选项(我看到errno 92并显示错误消息“ Protocol not available”。如果我将PF_PACKET更改为PF_INET则设置了这些选项,但是
3回复

IP_HDRINCL有问题吗?

我已经问过有关原始IP数据包实现的问题。 但是我没有任何解决方案。 我的代码: 错误: WSAGetLastError()返回10022: 描述: 无效的参数(例如,指定无效级别的参数)已提供给setsockopt(Wsapiref_94aa.asp)函数。