netfilter:如何通过reqid标记数据包?

我有以下问题。 我有使用防火墙标记的SA。 所以只有具有该标记的数据包才能被编码和解码。 我设法设置应该被编码的数据包的标记,但是我不能让对方工作。

我有传入的数据包需要解密,我需要为这些设置正确的标记。 我实际上可以使用下面的命令设置标记:

iptables -t mangle -A PREROUTING --proto esp -j MARK --set-mark 1 

但是该规则匹配所有传入的esp数据包。 但是我会有多个SA,我需要设置不同的标记。 我尝试使用reqid或spiselect,但只要我尝试,规则不匹配任何东西。

有人可以帮我得到iptables命令吗?

最好的祝福,
斯特芬

 root@vpn-b:~# setkey -D 10.5.0.2 10.5.0.1 esp mode=tunnel spi=3296784692(0xc480f134) reqid=1(0x00000001) E: aes-cbc c5eb72ab 906d5717 67e405f5 cfe73f7a A: hmac-sha1 6935290e e51f0965 06577876 0d6237d6 45a0083d seq=0x00000000 replay=32 flags=0x00000000 state=mature created: May 15 22:23:06 2012 current: May 15 22:24:43 2012 diff: 97(s) hard: 1200(s) soft: 907(s) last: May 15 22:23:19 2012 hard: 0(s) soft: 0(s) current: 7140(bytes) hard: 0(bytes) soft: 0(bytes) allocated: 85 hard: 0 soft: 0 sadb_seq=1 pid=8282 refcnt=0 10.5.0.1 10.5.0.2 esp mode=tunnel spi=3470192236(0xced6ee6c) reqid=1(0x00000001) E: aes-cbc e6fad1a5 ff31325b b4856748 c8997ea1 A: hmac-sha1 e401cc9d 59668c9f 866d7e86 b5a38d2c 1dcb2f2d seq=0x00000000 replay=32 flags=0x00000000 state=mature created: May 15 22:23:06 2012 current: May 15 22:24:43 2012 diff: 97(s) hard: 1200(s) soft: 888(s) last: May 15 22:23:19 2012 hard: 0(s) soft: 0(s) current: 7140(bytes) hard: 0(bytes) soft: 0(bytes) allocated: 85 hard: 0 soft: 0 sadb_seq=0 pid=8282 refcnt=0 root@vpn-b:~# ip -s xfrm policy src 10.1.1.0/24 dst 10.2.1.0/24 uid 0 dir fwd action allow index 1218 priority 1859 share any flag (0x00000000) lifetime config: limit: soft (INF)(bytes), hard (INF)(bytes) limit: soft (INF)(packets), hard (INF)(packets) expire add: soft 0(sec), hard 0(sec) expire use: soft 0(sec), hard 0(sec) lifetime current: 0(bytes), 0(packets) add 2012-05-15 22:08:11 use 2012-05-15 22:18:27 mark 1/0xffffffff tmpl src 10.5.0.1 dst 10.5.0.2 proto esp spi 0x00000000(0) reqid 1(0x00000001) mode tunnel level required share any enc-mask ffffffff auth-mask ffffffff comp-mask ffffffff src 10.1.1.0/24 dst 10.2.1.0/24 uid 0 dir in action allow index 1208 priority 1859 share any flag (0x00000000) lifetime config: limit: soft (INF)(bytes), hard (INF)(bytes) limit: soft (INF)(packets), hard (INF)(packets) expire add: soft 0(sec), hard 0(sec) expire use: soft 0(sec), hard 0(sec) lifetime current: 0(bytes), 0(packets) add 2012-05-15 22:08:11 use - mark 1/0xffffffff tmpl src 10.5.0.1 dst 10.5.0.2 proto esp spi 0x00000000(0) reqid 1(0x00000001) mode tunnel level required share any enc-mask ffffffff auth-mask ffffffff comp-mask ffffffff src 10.2.1.0/24 dst 10.1.1.0/24 uid 0 dir out action allow index 1201 priority 1859 share any flag (0x00000000) lifetime config: limit: soft (INF)(bytes), hard (INF)(bytes) limit: soft (INF)(packets), hard (INF)(packets) expire add: soft 0(sec), hard 0(sec) expire use: soft 0(sec), hard 0(sec) lifetime current: 0(bytes), 0(packets) add 2012-05-15 22:08:11 use 2012-05-15 22:18:27 mark 1/0xffffffff tmpl src 10.5.0.2 dst 10.5.0.1 proto esp spi 0x00000000(0) reqid 1(0x00000001) mode tunnel level required share any enc-mask ffffffff auth-mask ffffffff comp-mask ffffffff 

我的search过程让我在这个页面上,并决定写。 由于ESP数据包在对等点之间stream动,因此可以将附加参数(如源IP地址和目标IP地址)添加到您的iptables中。 这将区分esp数据包,你可以应用不同的标记。 例如从同级100.100.100.100到同级200.200.200.200(假设200.200.200.200是你的一方),你可以在你的/etc/iptables.up.rules

 *mangle # Marking the ESP packets between peer A and peer B -A INPUT -p esp -s 100.100.100.100 -d 200.200.200.200 -j MARK --set-mark 10 

分别属于另一个隧道的ESP数据包将被标记为这样(假设200.200.200.200再次是您的一方,而150.100.100.100是远程对等的)

 # Marking the ESP packets between peer C and peer B -A INPUT -p esp -s 150.100.100.100 -d 200.200.200.200 -j MARK --set-mark 20 

从iptables尝试策略匹配模块:

 -m policy --reqid $ID 

man iptables中有更多的细节(8)