栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Linux,如何指定在哪个以太网接口上传输数据

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Linux,如何指定在哪个以太网接口上传输数据

没有冒犯的意图,但是关于使用bind()的答案是非常错误的。bind()将控制放置在数据包IP标头中的源IP地址。它不控制将使用哪个接口发送数据包:将查询内核的路由表以确定哪个接口具有到达特定目的地的最低成本。(*看注释)

相反,您应该使用

SO_BINDTODEVICE
sockopt。这有两件事:

  • 无论内核路由表说什么,数据包总是从您指定的接口流出。
  • 只有到达指定接口的数据包才会被传递到套接字。到达其他接口的数据包不会。

如果要在多个接口之间切换,建议您为每个接口创建一个套接字。因为你也只接收数据包你已经绑定到界面,你需要所有这些插槽添加到您的

select()
/
poll()
/无论你使用。

#include <net/if.h>struct ifreq ifr;memset(&ifr, 0, sizeof(ifr));strncpy(ifr.ifr_name, "eth1", sizeof(ifr.ifr_name));if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) {    perror("SO_BINDTODEVICE failed");}

Bind()
接口IP地址的(*注)
可能导致混乱,但仍会导致正确的行为。例如,如果您
bind()
输入eth1的IP地址,但路由表将数据包发送出eth0,则该数据包将出现在eth0线路上,但带有eth1接口的源IP地址。尽管发送回eth1
IP地址的数据包将被路由回eth1,但这很奇怪,但允许。您可以使用具有两个iP接口的Linux系统对此进行测试。我有一个,并且已经对其进行了测试,并且
bind()
不能有效地将数据包导出物理接口。

尽管在技术上允许,但根据拓扑,这可能仍然无法工作。为了减轻攻击者使用伪造IP源地址的分布式拒绝服务攻击,许多路由器现在都执行反向路径转发(RPF)检查。源IP地址在“错误”路径上的数据包可能会被丢弃。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/409073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号