-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiptable_yyz.c
executable file
·1586 lines (788 loc) · 41.3 KB
/
iptable_yyz.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
//iptable的三个mange filter nat表的内核对应hook为MANGLE_VALID_HOOKS FILTER_VALID_HOOKS NAT_VALID_HOOKS
NAT 和一般的 mangle 用 -t 参数指定要操作哪个表。filter 是默认的表,如果没有 -t 参数,就默认对 filter 表操作。
iptables -t filter -A INPUT ! -s 127.0.0.1 -p icmp -j DROP
-j 前面是规则的条件,-j 开始是规则的行为(目的)。整条命令解释为,在filter 表中的 INPUT 规则链中插入一条规则,
所有源地址不为 127.0.0.1 的 icmp 包都被抛弃。
//iptable的三个mange filter nat表的内核对应hook为MANGLE_VALID_HOOKS FILTER_VALID_HOOKS NAT_VALID_HOOKS
-t 指明表名(filter nat mangle)
-A -D (分别后面为链名,他们后面的就是规则)
iptable -t mangle 主要用来设置标记,和ip rule和ip route一起配置策略路由,参考<iptables 的mangle表 .>http://blog.csdn.net/w_s_xin/article/details/24796539
Filter表:过滤数据包,默认表。
(1)INPUT 链:过滤所有目标地址是本机的数据包(对进入本机数据包的过滤)
(2)OUTPUT 链:过滤所有本机产生的数据包(对源地址得数据包的过滤)
(3)FORWARD链:过滤所有路过本机的数据包(源地址和目标地址都不是本机的数据包。
NAT表:网络地址转换(Network Address Translation)
如果第一个数据包允许经行NAT或Masquerade,那么其它数据包都会被做相同的动作,也就是其他数据包不会被一个一个地NAT(属于一个流的包只会经过这个表一次)任何时候都不要在这个表任何一条链经行过滤。
包括三个动作
(1)DNAT:改变数据包的目的地址使包能重路由到某台机器
(使公网能够访问局域网的服务器)
(2)SNAT: 改变数据包的源地址(使局域网能访问公网)
(3)NASQUERADE:和SNAT一样使局域网能访问公网,无固定IP使用PPP.PPPoE等拨号上网接入Internet
Nat表包含3条链:
(1)PREROUTING链 :数据包到达防火墙时改变包的目的地址。
(2)OUTPUT链:改变本地产生数据包的目标地址。
(3)POSTROUTING:在数据包离开防火墙时改变数据包的源地址。
Mangle表:修改数据包,改变包头中内容(TTL, TOS, MARK )
(1)TOS :设置改变数据包的服务类型,不要使用TOS设置发往Internet的包除非打算依赖TOS来路由,不能在表中配置任何过滤。SNAT、DNAT
(2)TTL:改变数据包的生存时间,可以让数据包只有一个特殊的TTL,欺骗ISP,有些ISP并不希望多台计算机共享一个连接访问Internet,ISP通过检查一台计算机所发出的数据包是否含有不同的TTL来判断。
(3)Mask:给数据包设置特殊的标记,通过标记配置带宽限制和基于请求分类。
Mangle表的5条链:
(1)PREROUTING 链:数据包进入防火墙后,路由判断之前改变数据包。
(2)POSTROUTING链:数据包确定了目标地址后,即路由判断前改变数据包。
(3)OUTPUT链:在数据包被确定目的地址前改变数据包
(4)INPUT链:在数据包进入本机后,应用程序接受之前改变数据包。
(5)FORWARD链:第一次路由判断之后,最后一次路由判断前改变数据包。
iptables详解--转
出处:http://yijiu.blog.51cto.com/433846/1356254
iptables详解
基本概念:
1.防火墙工作在主机边缘:对于进出本网络或者本主机的数据报文,根据事先设定好的检查规则对其检查,对形迹可疑的报文一律按照事先定义好的处理机制做出相应处理
对linux而言tcp/ip协议栈是在内核当中,意味着报文的处理是在内核中处理的,也就是说防火墙必须在工作在内核中,防火墙必须在内核中完成tcp/ip报文所流进的位置,用规则去检查,才真正能工作起来。
iptables用来衡量tcp/ip报文的属性:源ip、目标ip、源端口、目标端口;
tcp标志位: syn、syn+ack、ack、 fin、urg、psh、rst ;
2.应用网关
众多代理服务器都是应用网关,比如squid(使用acl限制应用层)varish这一类代理服务等。
3,入侵检测系统(IDS):
·网络入侵检测系统 NIDS
·主机入侵检测系统 HIDS
对于IDS常用的检测服务有:snort等
4.入侵防御系统(IPS),比如蜜罐
部署一套入侵检测系统是非常麻烦的,因为必须检测网络任意一个位置
对于IPS常用的检测服务有: tripwire 等
iptables基本概念
对linux来说,是能够实现主机防火墙的功能组件,如果部署在网络边缘,那么既可以扮演网络防火墙的角色,而且是纯软件的
网络数据走向:
请求报文à网关à路由à应用程序(等待用户请求)à内核处理à路由à发送报文
iptables规则功能
表:
filter主要和主机自身有关,主要负责防火墙功能 过滤本机流入流出的数据包是默认使用的表;
input :负责过滤所有目标地址是本机地址的数据包,就是过滤进入主机的数据包;
forward :负责转发流经主机但不进入本机的数据包,和NAT关系很大;
output :负责处理源地址的数据包,就是对本机发出的数据包;
NAT表:
负责网络地址转换,即来源于目的IP地址和端口的转换,一般用于共享上网或特殊端口的转换服务
snat :地址转换
dnat :标地址转换
pnat :标端口转换
mangle 表:
将报文拆开来并修改报文标志位,最后封装起来
5个检查点(内置链)
·PREROUTING
·INPUT
·FORWORD
·OUTPUT
·POSTROUTING
多条链整合起来叫做表,比如,在input这个链,既有magle的规则也可能有fileter的规则。因此在编写规则的时候应该先指定表,再指定链
netfilter主要工作在tcp/ip协议栈上的,主要集中在tcp报文首部和udp报文首部
规则的属性定义:
1.网络层协议
主要集中在ip协议报文上
2.传输层协议属性:
主要集中在
tcp
udp
icmp icmp其并不是真正意义传输层的,而是工作在网络层和传输层之间的一种特殊的协议
3.ip报文的属性:
IP报文的属性为: 源地址.目标地址
4.iptables规则匹配
iptables如何查看表和链
大写字母选项:可以实现某种功能,比如添加删除清空规则链;
小写字母选项:用来匹配及其他;
-L :list 列表
-n :数字格式显示ip和端口;
--line-numbers:显示行号;
-x : 显示精确值,不要做单位换算;
-t : 指定表
-t{fillter|nat|mangle|raw}
-v : 显示详细信息 -v -vvv -vvvv ..可以显示更详细的信息
5.其他子命令:
管理链:
-F :清空链
清空nat表中的input链,格式如下:
#iptables-t nat -F INPUT
#清空fllter表所有链:
#iptables-F
-P : 设定默认策略,为指定链设置默认策略,格式如下:
#设置fllter表input链的默认规则为丢弃
iptables-t fllter -P INPUT DROP
-N : 新建一条自定义链(内置链不能删除,如果太多,可以自定义链)
#自定义连只能被调用才可以发挥作用
iptables-N fillter_web
-X : 删除自定义空链,如果链内有规则,则无法删除
-Z :计算器清零
iptables-Z
-E :重命名自定义链
iptables管理规则:
-A :append附加规则,将新增的规则添加到链的尾部
-I[n] :插入为第n条规则
-D : 删除第n条规则
-R[n] : 替换第N条
表和链的对应关系:
fillter :INPUT FORWORD OUTPUT
nat : PREROUTING POSTROUTING OUTPUT
使用-t指定表来查看指定表内的规则:
#iptables-t nat -L -n
raw : prerouting output
iptables-t raw -L -n
mangle: prerouting input forword output postrouting
iptables-t mangle -L -n
#查看规则
[root@test3~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot optsource destination
Chain OUTPUT (policy ACCEPT)
target prot optsource destination
通过以上可以观察到,每一个链都有默认策略:policy ACCEPT
通常只需要修改fllter表的默认策略即可,由此如果有报文请求来访问本机的某个服务,那么则会经过input链,因此进来的报文都是需要做过滤的,那么出去的报文则不需要过滤,在有些特定的场所下也需要做过滤
所以写规则的时候必须放将规则写在正确链上,意义非常重大
规则和默认策略都有2个计数器,通过-v选项可以观察规则的匹配情况
#iptables -t nat -L -n -v
[root@sshgw~]# iptables -L -n -v
ChainINPUT (policy ACCEPT 7 packets, 975 bytes)
pkts bytestarget prot opt in out source destination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- eth2 * 101.61.0.0/10 0.0.0.0/0
0 0 DROP all -- eth2 * 127.0.0.0/8 0.0.0.0/0
0 0 DROP all -- eth2 * 162.254.0.0/16 0.0.0.0/0
0 0 DROP all -- eth2 * 192.0.0.0/24 0.0.0.0/0
0 0 DROP all -- eth2 * 192.0.2.0/24 0.0.0.0/0
0 0 DROP all -- eth2 * 197.18.0.0/15 0.0.0.0/0
0 0 DROP all -- eth2 * 197.51.100.0/24 0.0.0.0/0
0 0 DROP all -- eth2 * 203.0.111.0/24 0.0.0.0/0
0 0 DROP all -- eth2 * 224.0.0.0/4 0.0.0.0/0
0 0 DROP all -- eth2 * 240.0.0.0/4 0.0.0.0/0
776 37056 REFRESH_TEMP all -- * * 0.0.0.0/0 0.0.0.0/0
编写规则语法:
iptables [-t 表] 大写选项子命令 [规则号] 链名 匹配标准 -j 目标(规则)
目标:
DROP : 丢弃
REJECT : 拒绝
ACCEPT : 接受
RETURN : 返回主链继续匹配
REDIRECT: 端口重定向
MASQUERADE :地址伪装
DNAT : 目标地址转换
SNAT :源地址转换
MARK :打标签
LOG
自定义链
匹配标准
iptables的匹配标准大致分为两类:
1.通用匹配
-s | --src | --source [!] IP/NETWORK
-d ------------------------
-i :指定数据报文流入接口 input prerouting forward
-o :指定数据报文流出接口 output postrouting forward
-p :明确说明只放行哪种协议的报文匹配规则
以当前主机为例:
凡是来自于某个ip段的网络访问本机
[root@test3xtables-1.4.7]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.0/24 -j ACCEPT
[root@test3 xtables-1.4.7]# iptables -L -n -v
ChainINPUT (policy ACCEPT 10 packets, 1029 bytes)
pkts bytestarget prot opt in out source destination
22 1660 ACCEPT all -- * * 10.0.10.0/24 10.0.10.0/24
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 16 packets, 1536 bytes)
pkts bytes target prot opt in out source destination
pkts 被本机报文所匹配的个数
bytes 报文所有大小记起来之和
opt 额外的选项,--表示没有
target 处理机制
prot 放行哪种协议
source 源地址
destination 目标地址
对于严谨的规则,一般默认规则都是拒绝未知,允许已知
如下所示:
只放行信任IP地址段,其他全部禁止
iptables-P INPUT DORP
iptables-A INPUT -s 10.0.10.0/24 -d 10.0.10.0/24 -j ACCEPT
iptables-P OUTPUT DORP
iptables-A OUTPUT -d 10.0.10.0/24 -s 10.0.10.0/24-j ACCEPT
保存规则
[root@test3~]# /etc/init.d/iptables save
iptables:Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
保存规则至其他文件
[root@test3~]# iptables-save > /tmp/iptables
加载iptables文件规则
[root@test3~]# iptables-resotre < /tmp/iptables
1.2.规则的替换
首先来查看规则
[root@test3 ~]# iptables -L -n --line-number
ChainINPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.0/24
ChainFORWARD (policy DROP)
num target prot opt source destination
ChainOUTPUT (policy ACCEPT)
num target prot opt source destination
替换规则:将规则1替换为 eth0只能够通过某个网段进来
[root@test3~]# iptables -R INPUT 1 -s 10.0.10.0/24-d 10.0.10.62 -i eth0 -j ACCEPT
[root@test3~]# iptables -L -n --line-number
ChainINPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.62
2.扩展匹配
#所有的扩展匹配表示要使用-m来指定扩展的名称来引用,而每个扩展模块一般都会有自己特有的专用选项,在这些选项中,有些是必备的:
2.1隐含扩展
如下所示:
#端口之间必须是连续的
-p tcp--sport|--dport 21-80
#取反,非21-80的端口
-p tcp--sport|--dport !21-80
#检测报文中的标志位
--tcp-flagsSYN,ACK,RST,FIN, SYN
ALL #表示为所有标志位
NONE #表示没有任何一个标志位
#--tcp-flags ALL NONE #表示所有标志位都检测,但是其中多有都为0
#--tcp-flage ALL SYN,FIN #表示SYN,FIN都为1(即握手又断开)
#生成环境下tcp-flags 用的非常多,意义非常重要
例:放行本机对web的访问
[root@test3~]# iptables -A INPUT -d 10.0.10.62 -ptcp --dport 80 -j ACCEPT
[root@test3~]# iptables -L -n
ChainINPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 10.0.10.0/24 10.0.10.62
ACCEPT tcp -- 0.0.0.0/0 10.0.10.62 tcp dpt:80
放行出去的报文,源端口为80
[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -p tcp --sport 80 -j ACCEPT
查看匹配规则
[root@test3 ~]# iptables -L -n --line-number
ChainINPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.62
2 ACCEPT tcp -- 0.0.0.0/0 10.0.10.62 tcp dpt:80
ChainFORWARD (policy DROP)
num target prot opt source destination
ChainOUTPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.0/24
2 ACCEPT tcp -- 10.0.10.62 0.0.0.0/0 tcp spt:80
考虑要点:
(1)规则为放行出去的响应报文
(2)考虑源IP地址为本机,目标为访问的时候拆开报文才可以获知,而写规则的时候是面向所有主机,所以这里不用写
(3)源端口:80 ,因为用户访问的时候一定会访问其80端口,无可非议的
(4)目标端口:请求到来的时候事先无法断定对方的端口是多少,所以不用写
2.2协议匹配
通常对协议做匹配则使用 -p 参数 来指定协议即可
匹配UDP:UDP只有端口的匹配,没有任何可用扩展,格式如下
-p udp--sport | --dport
匹配ICMP格式如下
-picmp --icmp-[number]
icmp常见类型:请求为8(echo-request),响应为0(echo-reply)
例:默认规则input output 都为DROP,使其本机能ping(响应的报文)的报文出去
通过此机器去ping网关10.0.10.1 , 可结果却提示not permitted,使其能通10.0.10.0/24网段中的所有主机
[root@test3~]#iptables -A OUTPUT -s 10.0.10.62 -d 10.0.10.0/24 -p icmp --icmp-type8 -j ACCEPT
可看到无法响应:0表示响应进来的报文规则,并没有放行自己作为服务端的的角色规则
[root@test3~]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p icmp --icmp-type0 -j ACCEPT
#ping 10.0.10.x
允许类型为0(响应报文)出去
[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -d 10.0.10.0/24 -picmp --icmp-type 0 -j ACCEPT
例2:本机DNS服务器,要为本地客户端做递归查询;iptables的input output默认为drop 本机地址是10.0.10.62
[root@test3~]# iptables -A INPUT -d 10.0.10.62 -p udp --dprot 53 -j ACCEPT
[root@test3~]# iptables -A OUTPUT -S 10.0.10.62 -p udp --sprot 53 -j ACCEPT
客户端请求可以进来,响应也可以出去,但是自己作为客户端请求别人是没有办法出去的,所以:
[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -p udp --dport 53 -j ACCEPT
[root@test3~]# iptables -A INPUT -d 10.0.10.62 -p udp --sprot 53 -j ACCEPT
如果为tcp 则将以上udp改为tcp即可
2.3 TCP协议的报文走向
TCP连接的建立
双方主机为了实现tcp的通信,所以首先三次握手
客户端主动发出了SYN,服务器端处于监听状态,随时等待客户端的请求信息;
服务器端接收到了SYN请求,从而回应用户的请求,发送SYN_ACK ,从而转换为SYN_REVIN
客户端在发出了请求,从发出的那一刻close状态转换为SYN_SENT状态
客户端在SYN_SENT状态中一旦收到了服务端发来的SYN_ACK 之后,转换为ESTABLISHED状态,这时便可以开始传送数据了,无论怎么传都是ESTABLISHED状态
而服务器端收到了对方的ACK,同样处于ESTABLISHED状态
数据传输结束之后
客户端从ESTABLEISHED状态,发起四次断开请求
客户端发起FIN请求,从而进入等待状态
服务端收到断开请求之后,便发起ACK请求
客户端收到服务端发来的ACK确认信息后,从而又发起FIN_2 请求
等待服务端发来的FIN请求之后,便确认
服务器端收到FIN并发送ACK之后,服务器端便处于CLOSE_WAIT便自己发送FIN,从而进入LAST ACK模式 ,
确认完后不能立刻断开,还需要等待一定的时间(大约240秒),确认报文是否传递给对方
于是转换为CLOSED
iptables中有一个扩张参数--status
此扩展可以追踪tcp udp icmp等各种状态
其能够使用某种内核数据结构保持此前曾经建立的连接状态时间的功能,称为连接追踪
内核参数文件路径为:
[root@test3~]# ls /proc/sys/net/netfilter/
[root@test3~]# cat /proc/sys/net/netfilter/nf_conntrack_udp_timeout
30
以此为例,在其30秒钟内,曾经建立过的udp连接,这些连接都可以被追踪到的,可以明确知道在这期间哪个客户端曾经访问过,只要基于请求的序列,能跟此前保持会话信息,即可查询
2.4显式扩展
在iptalbes中数据包和被跟踪连接的4种不同状态相关联,这四种状态分别是NEW、ESTABLISHED、RELATED及INVALID,除了本机产生的数据包由NAT表的OUTPUT链处理外,所有连接跟踪都是在NAT表的PREROUTING链中进行处理的,也就是说iptables在NAT表的PREROUTING链里从新计算所有数据包的状态。如果发送一个流的初始化数据包,状态就会在NAT表的OUTPUT链里被设置为NEW,当收到回应的数据包时,状态就会在NAT表的PREROUTING链里被设置为ESTABLISHED,如果第一个数据包不是本机生成的,那就回在NAT表PREROUTING链里被设置为NEW状态,所以所有状态的改变和计算都是在NAT表中的表链和OUTPUT链里完成的。
使用-m来指定其状态并赋予匹配规则,语法如下
-mstate --state 状态
NEW
ESTABLISHED
RELATED
INVALID
NEW:
NEW状态的数据包说明这个数据包是收到的第一个数据包。比如收到一个SYN数据包,它是连接的第一个数据包,就会匹配NEW状态。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。
ESTABLISHED:
只要发送并接到应答,一个数据连接就从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接后继数据包。
RELATED:
当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED,也就是说,一个连接想要是RELATED的,首先要有个ESTABLISHED的连接,这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是RELATED。
INVALID:
INVALID状态说明数据包不能被识别属于哪个连接或没有任何状态。
例:
对本机22端口做状态监测:
进来的请求状态为new,而出去的状态则为ESTABLISHED,如果自动连接别人 状态肯定为NEW,如果正常去响应别人那么状态肯定是ESTABLISHED
[root@test3~]# iptables -I INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p tcp --dport 22 -m state--state NEW,ESTABLISHED -j ACCEPT
出口的响应都必须是ESTABLISHED
[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -d 10.0.10.0/24 -p tcp --dport 22 -m state--state ESTABLISHED -j ACCEPT
[root@test3~]# iptables -L -n
ChainINPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 10.0.10.0/24 10.0.10.62 tcp dpt:22 state NEW,ESTABLISHED
ChainFORWARD (policy DROP)
target prot opt source destination
ChainOUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 10.0.10.62 10.0.10.0/24 tcp dpt:22state ESTABLISHED
多端口规则匹配
使用参数-m multiport 可以指定15个以内的非连续端口,比如21-22,80
-mmulitport
--src-prots
--dst-ports
--prots
#对多端口进行匹配,只要匹配以下端口,则全部放行
[root@test3~]# iptables -A INPUT -s 10.0.10.0/24 -d10.0.10.62 -p tcp -m state --state NEW -m mulitport--destination-ports 21,22,80 -j ACCEPT
多IP匹配,指定匹配的IP地址范围:
-miprange
--src-range
--dst-range
指定匹配的连续ip段
[root@test3~]# iptables -A INPUT -s -m iprange --src-range 10.0.10.100-10.0.10.200
指定速率匹配
默认为每秒匹配3个报文,基于令牌桶算法
-mlimit
--limit #NUMBER,表示允许收集多少个空闲令牌
--limit-burst #RATE,允许放行多少个报文
比如:ssh一分钟之内只能建立20个链接,平均5秒一个,而一次性只能放行2个空闲令牌
--limit 20/min
--limit-burst 2
只有在大量空闲令牌存储的情况下,才可有limit-burst控制
例:控制NEW状态的请求
[root@test3~]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -m state --state NEW -mlimit --limit 12/min --limit 12/min --limit-burst 2 -j ACCEPT
例2:每次只允许2个ping包进来
[root@test3~]# iptables -F
[root@test3~]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p icmp --icmp-type 8 -mlimit --limit 20/min --limit-burst 5 -j ACCEPT
新建立一终端,在其终端ping10.0.10.62可以看到效果,不再演示
2.5对应用层进行匹配
对应用层编码字符串做相似匹配,常用算法使用--alog来指定 ,一般来讲算法一般为bm和kmp
-msrting
--string ""
--algo {bm|kmp}
例:
·假如我们期望web站点页面中任何包含"hello"的字符串的页面,则禁止访问,其他则放行
·请求报文中不会包含hello,一般来讲只包含访问某个页面,那么请求内容无非包含了请求某个链接而已
·响应报文中会封装页面的内容信息,因此 会出现在响应报文中,而不是请求报文
启动httpd服务
[root@test3~]# /etc/init.d/httpd start
在web站点新建页面1.html,内容为"hello" , 2.html内容为"word"
[root@test3domian]# echo hello > 1.html
[root@test3domian]# echo word > 2.html
在iptables的允许放行规则前面加一条更严谨的禁止规则:
[root@test3domian]# iptables -A OUTPUT -s 10.0.10.62 -p tcp --sport 80 -m string --string"hello" --algo kmp -j REJECT
再次访问
[root@test3domian]# curl -dump http://10.0.10.62/2.html
word
[root@test3domian]# curl -dump http://10.0.10.62/1html
#请求已发出去但是一直没有反应,我们来看一下防火墙规则是否被匹配到
[root@test3domian]# iptables -L -nv
ChainINPUT (policy ACCEPT 255 packets, 30024 bytes)
pkts bytes target prot opt in out source destination
ChainFORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
ChainOUTPUT (policy ACCEPT 201 packets, 29406 bytes)
pkts bytes target prot opt in out source destination
35 11209 REJECT tcp -- * * 10.0.10.62 0.0.0.0/0 tcp spt:80STRING match "hello" ALGO name kmp TO 65535 reject-withicmp-port-unreachable
基于时间限定
-m time
#指定日期起止范围
--datestart
--datestop
#指定时间的起止范围
--timestart
--timestop
#指定星期x范围
--weekdays
#指定月份
--monthdays
3.基于iptables实现NAT功能
3.1基于SNAT功能的实现
考虑场景:为解决IP地址不足,所以用NAT功能来实现成本节约
SNAT:源地址转换(代理内部客户端访问外部网络)在POSTROUTING或OUTPUT链上来做规则限制
参数选项:
-j SNAT --to-source IP
-j MASQUERADE
DNAT :目标地址转换(将内部服务器公开至外部网络)需在PREROUTING做限制
参数选项:
-j DNAT --to-destination IP:prot
NAT不但可以转换目标地址,还可以映射目标端口
拓补图如下:
假设iptables为网关服务器,192.168.0.0为内网地址段 10.0.10.0 为外网地址段
规划:
服务器角色
服务器内网IP地址
iptables
10.0.10.62 、 192.168.0.4
client
10.0.10.60
web server
192.168.0.110
下面来配置服务器:
webserver服务器配置如下:
[root@mode~]# /etc/init.d/httpd start
[root@modehtml]# echo 111 > test.html
#查看路由信息
[root@modehtml]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.0.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 192.168.0.4 0.0.0.0 UG 0 0 0 eth1
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth1
iptables服务器配置如下:
开启路由转发功能
[root@test3domian]# echo 1 > /proc/sys/net/ipv4/ip_forward
client配置如下:
#将eth1的网卡关闭,真正意义上断开连接
[root@test~]# ifdown eth1
#添加直连路由
[root@test~]# route add default gw 10.0.10.62
[root@test~]# route -n
KernelIP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
0.0.0.0 10.0.10.62 0.0.0.0 UG 0 0 0 eth0
这时去ping192.168.0.0 段的地址是通的,如下所示
[root@test~]# ping 192.168.0.4
PING192.168.0.4 (192.168.0.4) 56(84) bytes of data.
64bytes from 192.168.0.4: icmp_seq=1 ttl=64 time=22.0 ms
64bytes from 192.168.0.4: icmp_seq=2 ttl=64 time=0.245 ms
查看是否可访问webserver的web服务
[root@test ~]# curl -dumphttp://192.168.0.110/test.html
111
返回web server上查看访问日志
[root@modelogs]# tail access_log
10.0.10.60- - [02/Feb/2014:20:33:27 +0800] "POST /test.htmlHTTP/1.1" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu)libcurl/7.19.7 NSS/3.13.6.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
#源地址为10.60 由此可见,由路由来实现两台主机的通信
如果想使用nat方式来实现任何来自10.0/24的网络 通过此台服务器想访问web其他主机,都将源地址改为iptables的ip地址
#凡是来自10.0.10.0网段的主机都将其转换为自己的ip地址
[root@test3domian]# iptables -t nat -A POSTROUTING-s 10.0.10.0/24 -j SNAT --to-source 192.168.0.4
返回client端再次访问web server,并查看日志