论坛风格切换切换到宽版
  • 741阅读
  • 9回复

[问题求助]iptables 中mark的问题 [复制链接]

上一主题 下一主题
离线sinxyz.
 
发帖
2007
C币
-60545
威望
390
贡献值
1
银元
0
铜钱
4476
人人网人气币
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-05-01
我用string match模块过滤数据的内容,把找到的数据包--.set-mark..
比如:
iptables -t mangle -A PREROUTING -p tcp -m string --string "qq.com" --alg.o .bm -j MARK --set-mar.k 1--- 印刷

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

评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
离线zyjzhd.
发帖
2080
C币
-500792
威望
398
贡献值
4
银元
-1
铜钱
4717
人人网人气币
0
只看该作者 沙发  发表于: 2010-04-13
Re:iptables
不能,因为你的匹配规则不能匹配流的所有包。
但是用五元组的匹配的可以。

离线chenqikj.
发帖
1919
C币
-235901
威望
359
贡献值
1
银元
-1
铜钱
4245
人人网人气币
0
只看该作者 板凳  发表于: 2010-04-13
Re:iptables
这样不行阿?
我想实现的是用string match判断connection中的字符串,然后通过nat表redirect或者dnat到另外的地址上。但是nat表又只检查一个连接的第一个packet。
请教一下有没有别的解决方法阿?

离线lun0412.
发帖
2057
C币
-132078
威望
382
贡献值
1
银元
-2
铜钱
4590
人人网人气币
0
只看该作者 地板  发表于: 2010-04-13
Re:iptables
用 CONNMARK 去把连接做个标记
然后利用 CONNMARK 里面的 restore 参数将连接的标记还原到该连接的每个数据包中
具体查看 CONNMARK 的文档,也可以参考 ipp2p 的官方网站的文档,ipp2p 就利用了这个原理

离线bananason.
发帖
2138
C币
-139017
威望
405
贡献值
1
银元
-2
铜钱
4786
人人网人气币
0
只看该作者 4楼 发表于: 2010-04-13
Re:iptables
我按照这个楼上的去写了,结果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

离线jiayism.
发帖
2009
C币
-60549
威望
365
贡献值
1
银元
-2
铜钱
4584
人人网人气币
0
只看该作者 5楼 发表于: 2010-04-13
Re:iptables
贴 iptables-save -c
我需要知道数据包的匹配数量
另外,即使你这么做了也会出问题,这是后话,稍后再讲

离线慧琳迷.
发帖
1929
C币
-60734
威望
391
贡献值
1
银元
-1
铜钱
4306
人人网人气币
0
只看该作者 6楼 发表于: 2010-04-13
Re:iptables
# 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这个网站。

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

离线sharpgun.
发帖
2091
C币
-61352
威望
408
贡献值
1
银元
-2
铜钱
4672
人人网人气币
0
只看该作者 7楼 发表于: 2010-04-13
Re:iptables
你应该用 -j CONNMARK --set-mark 0x5 来设置
匹配的时候用 -m connmark --mark 0x5 来重定向
但是,匹配的内容并非连接的全部,同理,重定向的内容也不是连接的全部
因此,即使重定向了,这个重定向过去的数据也会被对端认为是非法的

发帖
1844
C币
-236143
威望
320
贡献值
1
银元
-2
铜钱
4095
人人网人气币
0
只看该作者 8楼 发表于: 2010-04-13
Re:iptables
还是匹配不到阿。

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

离线58008839.
发帖
1973
C币
-235726
威望
381
贡献值
1
银元
0
铜钱
4410
人人网人气币
0
只看该作者 9楼 发表于: 2010-04-13
Re:iptables
50         ct = nf_ct_get(*pskb, &ctinfo);

51         if (ct) {

52                 switch(markinfo->mode) {

53                 case XT_CONNMARK_SET:

54                         newmark = (ct->mark & ~markinfo->mask) | markinfo->mark;

55                         if (newmark != ct->mark) {

56                                 ct->mark = newmark;

57                                 nf_conntrack_event_cache(IPCT_MARK, *pskb);

58                         }

59                         break;

60                 case XT_CONNMARK_SAVE:

61                         newmark = (ct->mark & ~markinfo->mask) |

62                                   ((*pskb)->mark & markinfo->mask);

63                         if (ct->mark != newmark) {

64                                 ct->mark = newmark;

65                                 nf_conntrack_event_cache(IPCT_MARK, *pskb);

66                         }

67                         break;

68                 case XT_CONNMARK_RESTORE:

69                         mark = (*pskb)->mark;

70                         diff = (ct->mark ^ mark) & markinfo->mask;

71                         (*pskb)->mark = mark ^ diff;

72                         break;

73                 }

74         }

75

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

[ 本帖最后由 platinum 于 2008-7-3 22:49 编辑 ]
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个