Linux socket设置mark的必要性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux socket设置mark的必要性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2556字,纯文字阅读大概需要4分钟。
内容图文
![Linux socket设置mark的必要性](/upload/InfoBanner/zyjiaocheng/976/a64853a472c341c2946db96444df916b.jpg)
??????? 幸运的是,Linux的socket支持SO_MARK这样一个option,可以很方便的使用:
mark = 100;
setsockopt(client_socket, SOL_SOCKET, SO_MARK, &mark, sizeof(mark));
1.对TRACK的影响
虽然raw表是数据包经过的第一个表,使用SO_MARK仍然可以在整个raw表起作用之前做点mark,从而使得一个特定socket发出的包统统NOTRACK:iptables -t raw -A OUTPUT -m mark --mark 100 -j NOTRACK
如果不这样的话,就需要:
iptables -t raw -A OUTPUT [-s xxxx] [-d yyyy] [-p tcp|udp [--sport X] [--dport Y] ... -j MARK --set-mark 100
...[一大堆和上面类似的规则]
iptables -t raw -A OUTPUT -m mark --mark 100 -j NOTRACK
正如在PREROUTING上的raw表需要做的那样。我们得意于OUTPUT上面是socket,是应用程序的世界,而PREROUTING以下则是内核以及驱动的世界了,后者太杂太乱,不便做更多的事,而前者则是我们可以掌控的范围。
2.对策略路由的影响
SO_MARK最大的受益者就是策略路由了,如果我们这是以下的路由:ip rule add fwmark 100 table abc
ip route add 1.2.3.4/32 via 192.168.0.254 table abc
ip route del 1.2.3.4/32 table main
不设置SO_MARK的情况下,所有的访问1.2.3.4的流量将因为没有路由而被丢弃,因为在进入PREROUTING前首先要查找路由,而此时还没有打上mark,因而不会匹配到abc策略表中的那条路由,而main表中的对应路由我们已经删除了...但是如果我们在应用程序中加入:
mark = 100;
setsockopt(client_socket, SOL_SOCKET, SO_MARK, &mark, sizeof(mark));
访问就可以正常了,因为在查找路由的时候,已经有这个mark了。
针对本地发出的包需要注意的是,对于基于mark的策略路由,如果在main表中随意命中了一个路由,然后就会进入OUTPUT点,如果在该点中存在mark操作,比如mangle中所做的那样,hook函数结束前将会进行reroute,如下代码所示,在ipt_local_hook中:
if (ret != NF_DROP && ret != NF_STOLEN && ret != NF_QUEUE
&& ((*pskb)->nh.iph->saddr != saddr
|| (*pskb)->nh.iph->daddr != daddr
#ifdef CONFIG_IP_ROUTE_FWMARK
|| (*pskb)->nfmark != nfmark
#endif
|| (*pskb)->nh.iph->tos != tos))
return ip_route_me_harder(pskb) == 0 ? ret : NF_DROP;
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
内容总结
以上是互联网集市为您收集整理的Linux socket设置mark的必要性全部内容,希望文章能够帮你解决Linux socket设置mark的必要性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。