免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7850 | 回复: 19
打印 上一主题 下一主题

[网络管理] iptables 中mark的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-30 16:38 |只看该作者 |倒序浏览
我用string match模块过滤数据的内容,把找到的数据包--set-mark
比如:
iptables -t mangle -A PREROUTING -p tcp -m string --string "qq.com" --algo bm -j MARK --set-mark 1

怎么样才能把整个连接的所有packet mark 都设成1

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
2 [报告]
发表于 2008-07-01 16:51 |只看该作者
不能,因为你的匹配规则不能匹配流的所有包。
但是用五元组的匹配的可以。

论坛徽章:
0
3 [报告]
发表于 2008-07-01 22:27 |只看该作者
这样不行阿?
我想实现的是用string match判断connection中的字符串,然后通过nat表redirect或者dnat到另外的地址上。但是nat表又只检查一个连接的第一个packet。
请教一下有没有别的解决方法阿?

论坛徽章:
0
4 [报告]
发表于 2008-07-02 07:10 |只看该作者
用 CONNMARK 去把连接做个标记
然后利用 CONNMARK 里面的 restore 参数将连接的标记还原到该连接的每个数据包中
具体查看 CONNMARK 的文档,也可以参考 ipp2p 的官方网站的文档,ipp2p 就利用了这个原理

论坛徽章:
0
5 [报告]
发表于 2008-07-02 18:37 |只看该作者
我按照这个楼上的去写了,结果nat表还是收不到阿,看看我的对不对

# Generated by iptables-save v1.3.8 on Wed Jul  2 18:28:33 2008
*raw
REROUTING ACCEPT [1444642:1095421177]
:OUTPUT ACCEPT [122363:62963106]
COMMIT
# Completed on Wed Jul  2 18:28:33 2008
# Generated by iptables-save v1.3.8 on Wed Jul  2 18:28:33 2008
*nat
REROUTING ACCEPT [91066:7446470]
OSTROUTING ACCEPT [93652:7634382]
:OUTPUT ACCEPT [3907:276342]
-A PREROUTING -p tcp -m mark --mark 0x5 -j REDIRECT --to-ports 3128
COMMIT
# Completed on Wed Jul  2 18:28:33 2008
# Generated by iptables-save v1.3.8 on Wed Jul  2 18:28:33 2008
*mangle
REROUTING ACCEPT [1444226:1095245188]
:INPUT ACCEPT [155701:60650041]
:FORWARD ACCEPT [1326023:1039108651]
:OUTPUT ACCEPT [122367:62964002]
OSTROUTING ACCEPT [1448390:1102072653]
-A PREROUTING -p tcp -m string --string "qq.com" --algo bm --to 65535 -j CONNMARK --set-mark 0x5
-A PREROUTING -p tcp -j CONNMARK --restore-mark
COMMIT
# Completed on Wed Jul  2 18:28:33 2008
# Generated by iptables-save v1.3.8 on Wed Jul  2 18:28:33 2008
*filter
:INPUT ACCEPT [155482:60580943]
:FORWARD ACCEPT [1326023:1039108651]
:OUTPUT ACCEPT [122368:62964598]
COMMIT
# Completed on Wed Jul  2 18:28:33 2008

论坛徽章:
0
6 [报告]
发表于 2008-07-03 15:49 |只看该作者
贴 iptables-save -c
我需要知道数据包的匹配数量
另外,即使你这么做了也会出问题,这是后话,稍后再讲

论坛徽章:
0
7 [报告]
发表于 2008-07-03 17:23 |只看该作者
# Generated by iptables-save v1.3.8 on Thu Jul  3 17:15:07 2008
*raw
REROUTING ACCEPT [2032031:1257459643]
:OUTPUT ACCEPT [325754:159521872]
COMMIT
# Completed on Thu Jul  3 17:15:07 2008
# Generated by iptables-save v1.3.8 on Thu Jul  3 17:15:07 2008
*nat
REROUTING ACCEPT [239238:19082230]
OSTROUTING ACCEPT [246183:19624829]
:OUTPUT ACCEPT [11644:821773]
[0:0] -A PREROUTING -p tcp -m mark --mark 0x5 -j REDIRECT --to-ports 3128
COMMIT
# Completed on Thu Jul  3 17:15:07 2008
# Generated by iptables-save v1.3.8 on Thu Jul  3 17:15:07 2008
*mangle
REROUTING ACCEPT [2031625:1257284174]
:INPUT ACCEPT [388392:150778056]
:FORWARD ACCEPT [1729874:1116104300]
:OUTPUT ACCEPT [325768:159523688]
OSTROUTING ACCEPT [2055642:1275627988]
[240:182268] -A PREROUTING -p tcp -m string --string "qq.com" --algo bm --to 65535 -j CONNMARK --set-mark 0x5
[2615:641996] -A PREROUTING -p tcp -j CONNMARK --restore-mark
COMMIT
# Completed on Thu Jul  3 17:15:07 2008
# Generated by iptables-save v1.3.8 on Thu Jul  3 17:15:07 2008
*filter
:INPUT ACCEPT [388183:150709478]
:FORWARD ACCEPT [1729875:1116104352]
:OUTPUT ACCEPT [325779:159525220]
COMMIT
# Completed on Thu Jul  3 17:15:07 2008

我上过qq.com这个网站。

这个东西不能很好的实现吗?

论坛徽章:
0
8 [报告]
发表于 2008-07-03 17:37 |只看该作者
你应该用 -j CONNMARK --set-mark 0x5 来设置
匹配的时候用 -m connmark --mark 0x5 来重定向
但是,匹配的内容并非连接的全部,同理,重定向的内容也不是连接的全部
因此,即使重定向了,这个重定向过去的数据也会被对端认为是非法的

论坛徽章:
0
9 [报告]
发表于 2008-07-03 18:44 |只看该作者
还是匹配不到阿。

我就是想要把整个连接所有的包都mark上,因为nat表只检查连接的第一个包,同连接后面的包都做相同的处理了,我想也是用connmark匹配不到的原因把。
不知道还有没有其他的办法,我都试过好几种匹配了。
我现在还是没有理解到--save-mark和--restore-mark 的意义,是把整个连接所有包的mark拷贝,还是只拷贝匹配到的那个包。

论坛徽章:
0
10 [报告]
发表于 2008-07-03 22:38 |只看该作者

  1. 50         ct = nf_ct_get(*pskb, &ctinfo);
  2. 51         if (ct) {
  3. 52                 switch(markinfo->mode) {
  4. 53                 case XT_CONNMARK_SET:
  5. 54                         newmark = (ct->mark & ~markinfo->mask) | markinfo->mark;
  6. 55                         if (newmark != ct->mark) {
  7. 56                                 ct->mark = newmark;
  8. 57                                 nf_conntrack_event_cache(IPCT_MARK, *pskb);
  9. 58                         }
  10. 59                         break;
  11. 60                 case XT_CONNMARK_SAVE:
  12. 61                         newmark = (ct->mark & ~markinfo->mask) |
  13. 62                                   ((*pskb)->mark & markinfo->mask);
  14. 63                         if (ct->mark != newmark) {
  15. 64                                 ct->mark = newmark;
  16. 65                                 nf_conntrack_event_cache(IPCT_MARK, *pskb);
  17. 66                         }
  18. 67                         break;
  19. 68                 case XT_CONNMARK_RESTORE:
  20. 69                         mark = (*pskb)->mark;
  21. 70                         diff = (ct->mark ^ mark) & markinfo->mask;
  22. 71                         (*pskb)->mark = mark ^ diff;
  23. 72                         break;
  24. 73                 }
  25. 74         }
  26. 75
  27. 76         return XT_CONTINUE;
复制代码

从代码看,restore 是把连接的标记写到包的标记里面,save 则正相反
另外你没看懂我上面讲的,即使你匹配到了,转向了,但你转向过去的东西也不能被认可
nat 表只处理连接最开始的包,而你匹配到的绝对不是连接最开始,所以你永远匹配不到,这是其一
其二,前面说过了,TCP 连接是有三次握手的,即使 nat 是处理所有包,但你只把从匹配到开始以后的包转换过去,连接也不会被认可,因为 TCP 没有建立

[ 本帖最后由 platinum 于 2008-7-3 22:49 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP