iptables_dscp使用手册
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.问:如何查看帮助文档?
答:执行sh iptables_dscp.sh -h
2.问:如何打标?
答:比如针对tcp协议,目的端口是22的数据包打上dscp标签0x2A.
# sh iptables_dscp.sh -p tcp -r 22 0x2A
Set dscp value with command:
iptables -A POSTROUTING -t mangle -p tcp --dport 22 -j DSCP --set-dscp 0x2A
3.问:如何查看第二条中所设置的规则。
答:执行iptables命令:
# iptables -S POSTROUTING -t mangle(第二条)
-P POSTROUTING ACCEPT
-A POSTROUTING -p tcp -m tcp --dport 22 -j DSCP --set-dscp 0x2a
4.问:如果设置错了,如何删除规则?
答:比如删除第二步中所设置的规则。
第一种方法使用iptables命令只删除一条规则。
# iptables -D POSTROUTING -t mangle -p tcp --dport 22 -j DSCP --set-dscp 0x2A
第二种方法使用iptables命令删除所有规则。
# iptables -F -t mangle
5问:执行下面的命令,出现错误是什么意思。
# sh iptables_dscp.sh -l 22 -r 4444 0x21
Error: Protocol is not set, but you are using local_port/remote_port!
答:如果设置本地端口或者目的端口,则必须设置协议类型。因为不是所有的协议都有源端口和目的端口的。比如icmp协议。
修正方法是添加-p参数。
6.问:执行下面的命令,出现错误是什么意思。
# sh iptables_dscp.sh -p tcp -l 22 -r 4444 -v 0x21
Error: '-v' is used with DSCP_Value setting!
答:命令行中指定了-v参数来检查源端口是22 ,目的端口是4444的tcp流是否已经成功
设置dscp值了。则就不需要再设置dscp值,由此将命令行中的0x21删除,就可以了。
7.问:执行下面的命令,为何程序一直不退出。
# sh iptables_dscp.sh -p tcp -l 22 -r 4444 -v
Capture packets with below command:
tcpdump -nn -v -c 2 tcp and src port 22 and dst port 4444
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes ........
答:这是因为tcpdump必须按照指定的规则捕获数据包,如果捕获不到,则一直执行,程序不退出。所以,请检查是否有相应的数据包;或者检查参数是否设置错误。
8.问:如何判断检查成功呢?
答:检查成功的话,会有提示。比如:
#sh iptables_dscp.sh -p tcp -s 192.168.0.116 0x2d(首先打标)
# sh iptables_dscp.sh -p tcp -s 192.168.0.116 -v
Capture packets with below command:
tcpdump -nn -v -c 1 tcp and src host 192.168.0.116
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:59:32.766194 IP (tos 0xb4, ttl 64, id 61120, offset 0, flags [DF], proto TCP (6), length 60)
192.168.0.116.32953 > 192.168.0.101.22: Flags [S], cksum 0xd6a0 (correct), seq 1162215245, win 5840, options [mss 1460,sackOK,TS val 24514957 ecr 0,nop,wscale
7], length 0
1 packets captured
2 packets received by filter
0 packets dropped by kernel
Validate Result: OK
9.问:为何打的dscp标是0x2d,而tcpdump看到的tos值是0xb4呢?
答; 因为tos在IP头部占了8位(bit), 而dscp只是tos的高6位。dscp的值是这个6bit 的16机制数。而tos是8个bit的16机制数。所以,看到的结果不同。但是tos的高6位等于dscp值。即dscp=tos>>2.
10.问:为何执行下面的验证规则,会提示失败呢?
#sh iptables_dscp.sh -p tcp -r 22 0x2a
#sh iptables_dscp.sh -p tcp -r 22 -v
Capture packets with below command:
tcpdump -nn -v -c 1 tcp and dst port 22
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:55:45.802048 IP (tos 0x10, ttl 64, id 62811, offset 0, flags [DF], proto TCP (6), length 100)
192.168.0.101.53371 > 192.168.0.116.22: Flags [P.], cksum 0x9193 (correct), seq 2446306066:2446306114, ack 2929214289, win 107, options [nop,nop,TS val 232661334 ecr 24446132], length 48
1 packets captured
1 packets received by filter
0 packets dropped by kernel
Validate Result: FAIL
答:打标是对目的端口是22的发送出去的tcp流打上dscp值0x2a。但是因为捕获的条件限制,tcpdump捕获了收到的数据包。所以导致tos值不匹配。由此,建议确认的时候,提供更严格的匹配条件,比如源IP地址,目的IP地址等。