Linux的Netfilter钩子点的位置会导致一些奇怪的问题,比如本机发出的包无法使用基于mark的策略路由,这是因为mark一般是在Netfilter中进行的,而Linux的路由处在OUTPUT钩子点之前,因此这是一个顺序倒置的问题,如何来解决呢?只能在路由之前打上mark,而我们知道,对于外部进入的包,mark是在PREROUTING进行的,因此对于外部进入的包,策略路由是好使的,对于本机发出的包,路由之前只能是socket层了,那为何不能在传输层做呢?因为一来传输层比较杂,二来很多协议直接走到IP层,比如OSPF之类的,三来很多传输层协议也需要路由查找,比如TCP在connect的时候就需要查找路由以确定源IP地址(如果没有bind的话)。
        幸运的是,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;

Linux socket设置mark的必要性相关推荐

  1. python3socket非阻塞在linux里无效_Linux下socket设置为非阻塞方式和fcntl系统调用

    用以下方法将socket设置为非阻塞方式 int flags = fcntl(socket, F_GETFL, 0); fcntl(socket, F_SETFL, flags | O_NONBLOC ...

  2. linux下阻塞的系统调用,Linux下socket设置为非阻塞方式和fcntl系统调用.pdf

    Linux 下 socket 设置为非阻塞方式和 fcntl 系统调用 [ 日期: 2011-04-16] 来源: Linux 社区 作者: Linux 用以下方法将 socket 设置为非阻塞方式 ...

  3. linux socket默认超时时间设置,Socket中如何设置连接超时 (转)

    Socket中如何设置连接超时 (转) Socket中如何设置连接超时 AntGhazi/2001.12.14 主页:antghazi.yeah 把CSDN与中文翻了底朝天,也没找到如何设置socke ...

  4. Linux Socket基础介绍

    Linux Socket函数库是从Berkeley大学开发的BSD UNIX系统中移植过来的.BSD Socket接口是众多Unix系统中被广泛支持的TCP/IP通信接口,Linux下的Socket程 ...

  5. Linux离线时间设置(NTP)

    linux离线时间设置 为什么需要使用到NTP时间同步服务 ,在做某些服务时,我们需要所有的服务器保持同一时间执行预设好的命令,将服务同步协作. 操作方法如下: 先关闭firewalld 和 Seli ...

  6. linux下socket上限,[100分]高分求关于linux socket上限解决方案

    我想写一个复用socket的程序,以避免linux里socket最高上限的限制.因为程序是运行在服务器端,只提高linux系统下的socket限制数,是无法满足我的需求.我的代码如下,敬请各位大侠帮忙 ...

  7. UDP socket 设置为的非阻塞模式

    UDP socket 设置为的非阻塞模式  Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct s ...

  8. linux网络设置与基础服务命令(ifconfig、hostname、route、netstat、ss、ping、traceroute、nslookup、route)

    文章目录 linux网络设置与基础服务 前言 查看网络配置 使用ifconfig命令查看网络接口地址 查看指定网络接口信息 使用 hostname命令查看当前主机名称 使用route命令查看路由表条目 ...

  9. 对于linux socket与epoll配合相关的一些心得记录

    对于linux socket与epoll配合相关的一些心得记录 没有多少高深的东西,全当记录,虽然简单,但是没有做过测试还是挺容易让人糊涂的 int nRecvBuf=32*1024;//设置为32K ...

最新文章

  1. python爬虫教程书-Python 爬虫:把廖雪峰教程转换成 PDF 电子书
  2. 查看unlix服务器host文件,php代码优化及php相关问题总结
  3. 也谈贝叶斯分类(C#)版本
  4. [APIO2015]巴厘岛的雕塑[按位贪心+dp]
  5. Linux查看CPU型号及内存频率及其它信息与清理内存的命令
  6. hdu 5521 Meeting(最短路)
  7. 'mysql_attr_use_buffered_query'_php中mysql操作的buffer知识
  8. SpringBoot版本:1.5.12.RELEASE 文件大小限制异常拦截网关zuul报错
  9. Asp.net MVC 4 Attributes特性
  10. Python里面使用的容器
  11. mongotemplate 查询子文档_Oracle之SQL查询突破性能瓶颈的参数
  12. win10中plt绘图显示中文
  13. VAE变分自编码器的一点理解
  14. ABB变频器通过labview和上位机modbus通讯
  15. 解决支持库版本兼容问题
  16. Postman中的Pre-request Scrip详解
  17. 高等数学:第一章 函数与极限(6)极限存在准则、两个重要极限
  18. 计算机管理内默认共享,Win10共享默认在哪里关闭 清除默认共享哪种方法比较彻底...
  19. 2021年安全员-C证(陕西省)考试试卷及安全员-C证(陕西省)模拟试题
  20. Winter(Sleep)Camp2016酱油鸡

热门文章

  1. ChinaJoy凸显中国游戏业十大矛盾
  2. 【转载】徐汉彬:PHP7和HHVM的性能之争
  3. 评测3款最流行的安卓txt阅读器
  4. android bugly 符号表,Bugly的符号表工具使用总结-iOS
  5. C语言每日一题:青蛙跳楼梯(学习笔记自用)
  6. 外包程序员也能进阿里,分享我的阿里菜鸟面经,本人已成功入职!
  7. R语言初级教程(04): 算术运算
  8. python念什么_python读什么
  9. hpprobook440g1拆机_坚固才是真理 惠普ProBook 440 G1外观评测
  10. Transformer一文搞懂